btstack移植到stm32f103问题记录

驱动相关

最开始在网上找到一个btstack移植到stm32f103的例程,该例程是在stm32的HAL库基础上移植的,经过测试后发现一个现象:启动后,经常出现hci层初始化着就突然停了,没有继续输出日志信息,也扫描不到这个蓝牙;后经Debug调试发现在调用HAL_UART_Receive_DMA( &huart2, data, size );函数后,并没有产生DMA中断(补充一点:HAL_UART_Receive_DMA函数实际就是启动串口2的DMA接收,它设置了UART2_RX_DMA通道将size个字节的数据存放到data指向的内存中,完成size个数据传输后会产生DMA中断);通过打断点、查看变量值发现经常出现期望接收size个数据,但只接收了size-1个字节,也就是少了一个字节数据,所以导致不会产生DMA中断,这个问题还需继续排查,解决(2月17日晚,经排查发现在波特率较高时,串口DMA经常接收数据不全,待证明协议栈是因为使用了HAL库导致效率较低,而没有及时调用串口DMA接收数据,导致数据丢失)。

基于上述问题,我自己用标准库移植了一个例程,移植过程大致如下:
(1)先把上述前辈的例程拷贝一份,并去掉HAL库基
(2)把例程的接口整理一下,重新命名一个文件用来实现这些接口;这些接口主要就是驱动与btstack协议栈的接口
(3)添加标准库
(4)实现上述整理的接口,大致要实现的接口有:IO、串口、中断分组、DMA的初始化,滴答定时器中断函数(蓝牙有一些定时任务需要用),串口发送与串口接收(含DMA模式)
说一下btstack驱动部分的接口之间的一些联系:
(1)在调用发送数据接口后(这个数据时发给蓝牙的,不是日志或其他,别搞错串口),当数据发送完成时需要调用一下发送完成回调函数tx_done_handler
(2)在调用接收数据接口后,当数据接收完成时需要调用一下接收完成回调函数rx_done_handler

移植完这个例程后,数据接收很稳定,但是有遇到了另一个问题,就是在L2cap层配置SDP信道时总是会回复COMMAND_REJECT,后面发现是因为l2cap_rtx_timeout超时了,后来把L2CAP_RTX_TIMEOUT_MS改成50000就好了,这个原来是10000;原因是移植后的定时器基准时间设置错了,没有设置滴答定时器为1毫秒中断一次(一开始我把SysTick->LOAD设置成了10000,不到1ms就产生一次中断了,应该是要设置成72000的,1毫秒计72000个数嘛),因为使用HAL库时是不存在这个问题的,;(这里卡了好久,估计有一天半,主要是之前解决问题的思路不对,总是在驱动那里找问题,找了很久也没发现问题,后来改变思路,在L2cap层找问题,几个小时就发现问题了)。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)