前言
开发板为正点原子探索者,蓝牙模块为正点原子的ATK-BLE02蓝牙模块
1.cubemx配置
其中,只需要用到USART1串口打印调试信息,USART3接蓝牙模块,以及一些GPIO、时钟、中断的配置,SYS的Debug选择SW模式。
2.正点原子蓝牙模块驱动移植
首先,正点原子提供了蓝牙模块的驱动程序,我们把它移植到cubemx生成的工程里面用就行。驱动程序包括各个AT指令的发送函数,蓝牙模块的初始化,uart3的中断处理等,其中模块初始化只要包括STA、WAKEUP、uart3引脚的配置,这些都能够在cubemx进行配置并自动完成初始化,因此删除即可。还有一些延时函数改成hal库函数即可。
正点原子的uart3的中断处理采用的是接收中断+空闲中断,即每接收到一个数据触发中断,在中断里接收数据到缓存,并判断是否发生了空闲中断,如果发生了空闲中断,将标志位置一,然后在另一个函数里面判断接收到的字符串是否有预期的子字符串。
在固件库版本1.26更新了以后,新增了串口空闲中断函数,这个函数可以实现不定长数据的串口接收,当产生空闲中断后,在回调函数中完成整个数据的处理即可。
3.串口接收空闲中断处理AT指令返回值
①在重新实现的HAL_UART_MspInit()函数最后开启USART3空闲中断
②每次发送AT指令前开启数据接收,HAL_UARTEx_ReceiveToIdle_IT()函数开启数据接收并等待,当接收到完整连续的一帧数据后,触发空闲中断
③在空闲中断回调函数中处理数据
首先判断是那个串口,然后判断接收到的数据前两位是不是\r\n,因为AT指令的返回值格式一般为\r\n...\r\n,其实判不判断也无所谓。将串口接收到数据拷贝出来后清空串口缓冲区。
拷贝出来的数据包含预期的返回值即表示AT指令发送成功。
4.使用过程遇到的问题
问题一:用usb-ttl模块配置完后,连接开发板模块工作异常,发送AT指令后没有反应
问题所在:如果不是正点原子的开发板,使用杜邦线连接蓝牙模块的话,只需要连接VCC,GND,RXD,TXD四根线即可,另外两个引脚STA和WAKEUP都悬空默认高电平(模块内部上拉)。正点原子的开发板为它们自己的模块比如蓝牙、ESP8266等设计了专有的排母,蓝牙模块直接插上就能用,因此还需要配置WAKEUP和STA的GPIO引脚,将WAKEUP对应的GPIO设置为输出并默认拉高,STA的GPIO设置为输入。不配置的话,WAKEUP引脚有可能上电默认是低电平,这样的话模块就会进入固件更新模式,无法进入工作模式。
问题二:有的指令能接收到返回值,有的接收不到
解决方案:在两条指令发送之间加一点延时,具体加多长可以测试一下