PS:这篇文章记录笔者TI ble协议栈的学习串口的笔记。
前些日子CC2540模块没到,就捣鼓CC2530。深深的感受到,ZigBee就是个坑啊。然后果断玩BLE了。BLE,TI的栈给的文档,project这回看起来好点,然后找了其他一些资料。这里介绍《蓝牙4.0BLE开发完全手册-物联网开发技术实战》。看起来还行吧。不过我照着他的串口例子做,没看到效果(可能是协议栈版本问题)。于是,一怒之下,自己啃。
最后再说一下,CC2530和CC2540除了RF不同外,51内核是一样的。因为栈中使用的HAL是一样的。
说下自己的装备。如下图。手焊跳线o(∩_∩)o。主要可以用的IO有串口0,定时器1的通道0~3,定时器的IO映射到了位置2。和两个按键。
先来看看HAL都给了啥。我个人认为key、led、lcd就是多余的。这个硬件相关性实在是太强了。所以先从串口开始看起,我想各位看官的串口也都在位置1吧。
HAL里面默认串口使用的DMA。这个就不管它了。我建议先简单的看下APP Group下面的几个c文件。和OSAL.C中的osal_init_system和osal_run_system两个函数,其它最好也浏览一下。在开始写我们自己的串口函数前先看看项目的配置情况。请注意下,函数中用很多预编译,看的时候仔细点。
左上角,选择CC2540,关掉POWER_SAVING,在defined symbols中的POWER_SAVING前面加个x就可以了。关于POWER_SAVING,在函数osal_run_system中可以看到,这里我们x掉,不然编译会出现一个警告,说什么串口和key的中断被重复的啥啥啥的。至于LCD,因为我的板是没用LCD的干脆也x了。
现在开始来看看怎么来串口打印出信息来。找到SimpleBLEPeripheral.c中的SimpleBLEPeripheral_Init函数,添加如下代码,注意{}中才是我添加的。另外要添加hal_uart.h这个头文件。
1 void SimpleBLEPeripheral_Init( uint8 task_id ) 2 { 3 simpleBLEPeripheral_TaskID = task_id; 4 5 { //add 6 halUARTCfg_t halUARTCfg; 7 halUARTCfg.configured = TRUE; 8 halUARTCfg.baudRate = HAL_UART_BR_115200; 9 halUARTCfg.flowControl = HAL_UART_FLOW_OFF; 10 11 HalUARTOpen(HAL_UART_PORT_0, &halUARTCfg); 12 HalUARTWrite(HAL_UART_PORT_0, "Hello CC2540!\n", 14); 13 }
添加串口
来看看串口配置这个结构体。注意到,这个结构体是没有关于配置停止位,校验位的。也就是全是默认。其他没用到的先不理会是用来干嘛的。
1 typedef struct 2 { 3 bool configured; 4 uint8 baudRate; 5 bool flowControl; 6 uint16 flowControlThreshold; 7 uint8 idleTimeout; 8 halUARTBufControl_t rx; 9 halUARTBufControl_t tx; 10 bool intEnable; 11 uint32 rxChRvdTime; 12 halUARTCBack_t callBackFunc; //回调函数 13 }halUARTCfg_t;
halUARTCfg_t
顺便吐槽一下,TI给的HAL api文档里面关于串口的宏定义有错,所以还是看源码靠谱点。
到这里,编译烧录,应该就可以看到串口出来的信息了。附图,注意一下右边的配置情况。
华丽的分割线