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

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

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

  

  本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第四部分:

  第四部分知识点:

  第十六节 协议栈LED实验

  第十七节 协议栈LCD显示

  第十八节 协议栈UART实验

  第十九节 协议栈五向按键

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

  有关TI 的CC254x芯片介绍,可点击下面链接查看:

  主流蓝牙BLE控制芯片详解(1):TI CC2540
 

  同系列资料推荐:

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

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

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

  有关本文的工具下载,大家可以到以下这个地址:

  朱兆祺ForARM
 

  第十六节 协议栈LED实验

  TI的协议栈中在HAL层已经有了LED的驱动,我们只需要针对我们的开发板进行配置即可,我们的开发板有两个LED,分别对应P1.0和P1.1。这个在裸机开发的时候已经介绍了。

  为了保持协议栈原有的代码不变,我们在BLE-CC254x-1.4.0\Components\hal\target目录下新建一个文件夹,使它适应我们的开发板。

  

  打开LED实验工程LEDExample,选择MT254xboard,并且在工程配置中要定义HAL_LED=TRUE,下载到开发板运行,可以看到两个LED同时在闪烁。

  

  

  那我们的实现代码在哪里呢?其实在协议栈中实现这个很简单,在启动事件中我们调用了一个HalLedSet函数,并且设置了两个LED同时闪烁。

  

  就是这么简单,协议栈已经把其它事情做好了,只需要我们调用设置函数即可。设置的模式总共有5种。

  #define HAL_LED_MODE_OFF 0x00 // 关闭LED

  #define HAL_LED_MODE_ON 0x01 // 打开LED

  #define HAL_LED_MODE_BLINK 0x02 // 闪烁一次

  #define HAL_LED_MODE_FLASH 0x04 // 不断的闪烁,最多255次

  #define HAL_LED_MODE_TOGGLE 0x08 // 翻转LED状态

  为了适应不同的需求,我们可能需要更改LED的输出引脚,如图板级配置在hal_board_cfg.h文件中。

  

  

  这里我们的开发板只有两个LED,所以我们在这里根据开发板的实际情况修改相应的IO口。

  第十七节 协议栈LCD显示实验

  打开LCD12864的实验工程,一样的在工程配置中打开LCD,选择MT254xboard然后直接编译下载,我们可以看到LCD上已经有显示了。

  

  这些显示来自哪里呢?

  

  在初始化函数中可以看到图中的函数调用,这里是将字符串显示到LCD的第一行。

  

  在事件回调函数中可以看到这里将本机地址显示到第二行,将字符串IniTIalized显示到第三行,但是为什么我们在第三行没有看到这行字符串呢?而显示的字符串是Advertising ,这是因为系统启动后运行非常快,在我们还没反应过来的时候已经进入了广播状态,并且将原来的字符串覆盖了,所以我们最后只能看到Advertising 了。

  

  HalLcdWriteString是将第一个参数指向的字符串显示到第二个参数指定第几行中,例如我们需要在第5行显示系统启动信息,我们可以在启动事件中,添加如下代码。

  

  这里我们来介绍一下Lcd驱动的实现,在Hal_lcd.h文件中申明了以下函数,这些函数的功能都有英文注释,这里我就不再累述了。

  /*

  * Initialize LCD Service

  */

  extern void HalLcdInit(void);

  /*

  * Write a string to the LCD

  */

  extern void HalLcdWriteString ( char *str, uint8 option);

  /*

  * Write a value to the LCD

  */

  extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option);

  /*

  * Write a value to the LCD

  */

  extern void HalLcdWriteScreen( char *line1, char *line2 );

  /*

  * Write a string followed by a value to the LCD

  */

  extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line );

  /*

  * Write a string followed by 2 values to the LCD

  */

  extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line );

  /*

  * Write a percentage bar to the LCD

  */

  extern void HalLcdDisplayPercentBar( char *title, uint8 value );

协议栈中很多地方都调用了这些函数,我们如果要使我们的硬件能够兼容协议栈,被协议栈使用,就需要实现这些函数的定义,当然,为了适应我们的开发板,我已经实现了这些函数

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

网站地图

Top