您好、欢迎来到现金彩票网!
当前位置:双彩网 > 协议栈 >

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

发布时间:2019-06-07 23:05 来源:未知 编辑:admin

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

  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种。

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

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

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

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

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

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

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

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

  协议栈中已经用了串口的驱动,我们要做的只是对串口进行初始化,然后就可以进行串口数据的收发了。

  用使用串口,第一步,需要打开使能串口功能,通过配置工程来实现,这里注意,我们现在不使用USB的CDC类来实现串口,所以HAL_UART_USB=FALSE。

  要使用串口必须先初始化相应的串口,那该如何初始化呢?在Hal_uart.h文件中我们可以看到如下函数。

  这个函数就是用来初始化串口的,这个函数有两个参数,第一个指定串口号,第二个是串口的配置参数。我们来看看这个结构体的定义:

  在串口回调函数中我们只做一件事,将串口接收到的数据显示到LCD中并且原样的从串口输出。回调函数的实现如下:

  实验现象,从实验现象中可以看到,一开始在串口中输出了一个标志字符串,然后我们通过串口发送了0123456789,然后数据原样的从串口输出了,这和我们预期的结果是一样的。

  但是我们发现LCD上的显示和我们预期的不一样,LCD上只显示了6789,前面的数据并没有显示,这是怎么一回事呢?进行单步调试可以发现,我们发送一次数据,回调函数被回调了两次,第一次回调只接受到了012345,第二次回调接收到了6789,而在LCD上的显示第二次覆盖了第一次的显示,所以我们会看到这种现象,解决的办法,我们需要定义一个数据帧的时间间隔,当接收数据的间隔超过了此间隔就认为接收结束。

  下面我们改写接收处理,我们在接收到数据后开启定时器,定时5ms这样,当接收间隔大于5ms后,我们就可以在定时事件中处理串口接收到的数据。

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

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

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

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

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

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

  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的断电保存。

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

  第一次上电可以看到,提示读取数据失败了,说明第一次运行时是没有存储数据的,接下来我们通过串口发送字符串 MT254xboard SNV Test字符串。

  可以看到成功的将我们发送过去的字符存入了SNV中,那是否成功存入呢?我们将开发板断电后重启,看看第二次上电是否能够读取出我们存入的数据。

  重启后可以发现我们成功的读取出了第一次存入的数据,说明我们成功的将数据存入了SNV中。

  TI LMZM2360x降压电源模块在贸泽开售小尺寸更适合空间受限的工业应用

http://katzztheva.com/xieyizhan/163.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有