问题:参考官方的示例代码串口唤醒deep-sleep程序,串口接收后唤醒不了MCU。
疑问点,MCU进入Deep-sleep模式后,所有时钟是禁止关闭的,串口模块RX接受数据判断,肯定是需要时钟才能运行,它是如何唤醒的。
官方示例程序有一个地方可能会让人误导,或者说会让人理解困难,进入深度睡眠前,会设置一下串口的时钟源为内部IRC16M时钟。
实际本质上设置串口时钟为内部时钟,并不是说在deep-sleep时,串口模块是由IRC16M来提供时钟,这个设置是为了唤醒后做准备的,因为唤醒后系统默认的时钟源是IRC16M。
深度睡眠介绍中写得比较清楚,在该模式下所有时钟都禁用,包括内部时钟IRC16M。所以从深度睡眠中唤醒,实质上就是IO口电平唤醒。串口模块没有办法接受完一字节数据才唤醒,因为它没有时钟。所以在串口唤醒配置中,只能选择串口开始位电平唤醒。
字在usart_wakeup_mode_config函数中的第二个输入形参,只能选择USART_WUM_STARTB,虽然标准库中,有其他选项,但是对于Deep-sleep模式只能选开始位唤醒。当你不是进入deep-sleep,而是sleep模式时,串口接收唤醒才能使用,因为sleep模式没有关对应时钟。
把串口唤醒源从接收数据唤醒改为串口开始位唤醒,问题得以解决。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/miaozheChen/article/details/142315377
|