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

  在睡眠函数SLEEP.c文件中,在启动睡眠函数CH58X_LowPower(uint32_t time)中, 先添加GPIO外部中断初始化,通过flag_sleep标志位来判断是否退出睡眠模式,在当flag_sleep=1时,直接return 0退出睡眠。

 

  在利用IO口唤醒之后,先关闭GPIO中断,关闭GPIO唤醒,然后重新设置IO,重新初始化串口,配置串口触发,使能串口中断。

  此时,串口会进行自收发数据的过程,但是要注意,当串口发送第一次数据时,接收的数据要么会丢数据,要么会是乱码。这是因为蓝牙在SLEEP休眠期间,32M主频是停止工作的,串口唤醒后需要约1.5ms来等待主频稳定。所以串口唤醒后,立即读取串口FIFO中的数据,若有乱码,直接丢弃;发送方在数个ms后再发一包真实数据。

  在串口中断中添加检查是否匹配目标字节序列的程序,这样可以通过串口发送特定的数据,对应不同的标志位结束串口操作,进入睡眠模式。

  这里设置退出的串口字符串“*****”。这样能确保接收完串口数据之后,想要退出串口休眠,继续进行睡眠模式。

  在蓝牙从机,再添加一个TMOS任务事件,以一秒的时间去循环判断进入睡眠的标志位的状态。

  在建立函数中,启动UART_to_BLE_EVT事件,在TMOS事件任务中再进行判断处理。

  通过串口观察一下现象,休眠的状态和串口收发的状态

  串口在发送第一包数据时,由于是需要唤醒,所以会是乱码或者是丢包的数据,从第二包开始就会正常的收发数据,通过发送结束串口的收发标志,打印数据可以看出打印的信息,进入睡眠的标志。

posted on 2024-08-20 11:46  凡仕  阅读(171)  评论(0编辑  收藏  举报