【WCH蓝牙系列芯片】-基于CH582开发板—蓝牙从机HAL_SLEEP模式,串口唤醒收发数据
-------------------------------------------------------------------------------------------------------------------------------------
在之前的博客文档中介绍过CH582作为蓝牙主机,开启睡眠后,通过串口唤醒,并接收串口数据。这里再讲解一下使用CH582芯片作为蓝牙从机,开始HAL_SLEPP睡眠模式,设置串口唤醒,并通过串口收发数据。
蓝牙芯片sleep/shut down模式仅支持IO和RTC唤醒,如果IO只接了串口,在睡眠前需将串口模式切换为普通IO,并设置唤醒。因此,当有数据过来时,串口的GPIO口会产生由高电平到低电平的信号,将这个电平变化的信号作为触发GPIO中断的判断,从而唤醒芯片。
在从机程序中,使用串口0(PB4,PB7)作为串口收发引脚,先将PB4和PB7配置为普通的GPIO口,并添加GPIO的外部中断初始化,在中断函数中,自定义一个标志位flag_sleep。
在利用IO口唤醒之后,先关闭GPIO中断,关闭GPIO唤醒,然后重新设置IO,重新初始化串口,配置串口触发,使能串口中断。
此时,串口会进行自收发数据的过程,但是要注意,当串口发送第一次数据时,接收的数据要么会丢数据,要么会是乱码。这是因为蓝牙在SLEEP休眠期间,32M主频是停止工作的,串口唤醒后需要约1.5ms来等待主频稳定。所以串口唤醒后,立即读取串口FIFO中的数据,若有乱码,直接丢弃;发送方在数个ms后再发一包真实数据。
在串口中断中添加检查是否匹配目标字节序列的程序,这样可以通过串口发送特定的数据,对应不同的标志位结束串口操作,进入睡眠模式。
这里设置退出的串口字符串“*****”。这样能确保接收完串口数据之后,想要退出串口休眠,继续进行睡眠模式。
在蓝牙从机,再添加一个TMOS任务事件,以一秒的时间去循环判断进入睡眠的标志位的状态。
在建立函数中,启动UART_to_BLE_EVT事件,在TMOS事件任务中再进行判断处理。
通过串口观察一下现象,休眠的状态和串口收发的状态