由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(4)
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端,如果读取失败,
- 主流蓝牙BLE控制芯片详解(3):创杰 IS1685S(07-18)
- 苹果光环加持,蓝牙Beacon技术成室内定位应用最大黑马(08-02)
- 主流蓝牙BLE控制芯片详解(4):Nordic nRF51822(07-20)
- 蓝牙BLE之室内定位iBeacon应用测验(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(5)(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)(07-18)