微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(4)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(4)

时间:07-25 来源:电子发烧友 点击:

return (events ^ UART_EVENT);

  }

  经过这样的处理后,可以发现我们刚刚的问题已经解决了。

  

  到这里串口已经可以正常使用了,为了更加方便的使用串口,我在这里添加一个函数实现标准C中printf,这样更有利于我们输出。

  int SerialPrintf(const char*fmt, 。。。)

  {

  uint32 ulLen;

  va_list ap;

  char *pBuf = (char*)osal_mem_alloc(PRINT_BUF_LEN); // 开辟缓冲区

  va_start(ap, fmt);

  ulLen = vsprintf(pBuf, fmt, ap); // 用虚拟打印函数实现

  va_end(ap);

  HalUARTWrite(HAL_UART_PORT_0, (uint8*)pBuf, ulLen); // 从串口0输出

  osal_mem_free(pBuf); // 释放内存空间

  return ulLen;

  }

  我们可以像使用C标准中的printf来使用这个函数,例如我们将LCD的输出全部导向串口的输出,在HalLcdWriteString的实现中添加串口输出代码,如下图:

  

  重新编译并且烧录后可以看到LCD的输出和串口的输出是一样的了。

  

  第十九节 协议栈五向按键

  和前面几个一样,按键的驱动在协议栈中也已经有了,我们只需要做一些小的修改,使它适应我们的开发板即可。

  1. 修改工程配置,使能按键功能。

  

  2. 在我们的工程中要使用按键功能,仅仅打开配置选项是不够的。因为协议栈代码默认只有MINIDK开发板才有按键。

  

  从这里可以看到(类似的地方有很多),如果要使能按键功能还需要定义CC2540_MINIDK,但是阅读整个协议栈你会发现,定义 CC2540_MINIDK后还会打开其它的功能,而那些功能并不是我们想要的,所以在这里我们使用另外一种方法来实现。我们定义我们的开发板也能使用按键功能,所以在工程配置中添加MT254xboard=TRUE,然后在按键功能有宏开关的地方加入这个条件。具体位置参见代码。

  

  按下相应的按键后可以看到串口输出相应的按键值。五向按键的工作原理在裸机开发的时候已经讲过了,在协议栈中已经有相应的驱动代码了,无需我们编写,只需要按照实际情况改写即可。例如我们的开发板每个按键对应的电压值和原来的值并不一样,所以我们这里改写了每个按键值的电压范围。

  uint8 halGetJoyKeyInput(void)

  {

  /* The joystick control is encoded as an analog voltage.

  * Read the JOY_LEVEL analog value and map it to joy movement.

  */

  uint16 adc;

  uint8 ksave0 = 0;

  uint8 ksave1;

  /* Keep on reading the ADC until two consecutive key decisions are the same. */

  do

  {

  ksave1 = ksave0; /* save previouse key reading */

  adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_10);

  if ((adc 》= 2) && (adc 《= 95)) // 85 right

  {

  ksave0 |= HAL_KEY_RIGHT;

  }

  else if ((adc 》= 96) && (adc 《= 110)) // 101 cent

  {

  ksave0 |= HAL_KEY_CENTER;

  }

  else if ((adc 》= 111) && (adc 《= 140)) // 127 up

  {

  ksave0 |= HAL_KEY_UP;

  }

  else if ((adc 》= 141) && (adc 《= 200)) // 170 left

  {

  ksave0 |= HAL_KEY_LEFT;

  }

  else if ((adc 》= 201) && (adc 《= 300)) // 257 down

  {

  ksave0 |= HAL_KEY_DOWN;

  }

  } while (ksave0 != ksave1);

  return ksave0;

  }

  第二十节 协议栈Flash数据存储

  CC254x自带了256K Flash,这256K的储存空间不仅可以储存代码,也可以储存用户的数据,协议栈自带了SNV管理代码,我们只需要学会使用即可。

  SNV的使用只有两个函数,分别是读函数osal_snv_read和写函数osal_snv_write,在SNV的储存中,储存的每个数据都有一个唯一的ID,SNV也正是利用这个ID来管理储存在Flash中的数据,在BLE的协议栈中,蓝牙自身数据储存用了一部分ID,我们储存的数据ID不可使用这些ID,在bcomdef.h中有这些ID的定义。

  

  下面我们往SNV中存入串口接收到的数据,然后开发板断电重启后读取出这串字符串并通过串口发送出去,来演示SNV的断电保存。

  首先我们定义一个我们储存数据的ID,注意不能和已经有的定义冲突。

  #define BLE_NVID_USER_CFG_START 0x80 //!《 Start of the USER Configuration NV IDs

  #define BLE_NVID_USER_CFG_END 0x89 //!《 End of the USER Configuration NV IDs

我们在启动事件中读取SNV中0x80的值并通过串口输出读取结果,如果读取成功,则会将读取结果打印到PC端,如果读取失败,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top