打印
[STM32L0]

关于STM32串口唤醒STOP模式的总结

[复制链接]
2849|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Fillmore|  楼主 | 2019-3-27 18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言

STM32常见的低功耗模式有三种:睡眠模式、STOP模式以及待机模式,STM32L系列还有其他低功耗模式。就STOP模式来说,可以通过外部中断或事件唤醒,但是在有些情况下,我们可能需要通过串口来唤醒,比如STM32+ESP8266与后台服务器进行数据交互,当不用发送数据完毕,等待下次发送数据或等待后台下发数据给设备的这段时间可以让STM32进入STOP模式来达到省电,如果后台下发数据,这时候是先把数据下发给ESP8266,然后ESP8266再通过串口发送给STM32,那么就可以唤醒STM32了。

一、用串口唤醒STOP模式思路

1、唤醒思路:在进入STOP模式之前,将串口的RX引脚配置为外部中断模式,然后当串口发送数据时就触发了外部中断,也就唤醒了STM32,唤醒之后就重新配置初始化串口。

2、唤醒后程序是从原来进入STOP模式前那里重新开始执行。


二、如何进入STOP模式?

1、以STM32F103系列为例,用标准库函数,进入STOP模式代码如下:
  • /**************************************************************
  • 函数名称:system_enter_stop
  • 函数功能:系统进入STOP模式
  • 输入参数:无
  • 返 回 值:无
  • 备     注:无
  • **************************************************************/
  • void system_enter_stop(void)
  • {
  •     uart_exti_init()/* 进入STOP模式前配置RX引脚为外部中断模式 */
  •     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);/* 开电源管理时钟 */
  •     PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);/* 进入STOP模式,外部中断或事件唤醒 */
  • }

复制代码



三、串口唤醒存在的问题

1、用串口唤醒会存在一些问题:如果你是发一串很长的数据来唤醒串口,这串数据也是通过0101010等二进制来发送的,当RX引脚被触发中断唤醒MCU之后,剩余的数据也就会接着发送,这样导致的问题就是有数据丢失。如果是发一个字符,那么就会直接唤醒,但是不会接收这个字符,只有第二次发送的时候才会接收到这个字符。


四、唤醒实验

1、实验平台:中国移动物联网OneNET NB开发板(板载STM32)。

2、STM32F103RET6、12M外部晶振、串口3进行实验。

3、操作系统:RT-Thread。

4、进行实际实验,用RT-Thread创建两个线程,一个线程用于读取按键是否按下,按下则调用进入STOP模式函数进入STOP模式,另一个线程读取串口接收到的数据。将RX引脚配置为外部中断模式用的是RT-Thread的PIN设备进行配置,工程代码附件。


代码在里面附件:http://www.openedv.com/thread-289358-1-1.html

使用特权

评论回复
沙发
wanduzi| | 2019-3-27 21:03 | 只看该作者
支持串口中断。。

使用特权

评论回复
板凳
wanduzi| | 2019-3-27 21:04 | 只看该作者
唤醒思路:在进入STOP模式之前,将串口的RX引脚配置为外部中断模式,然后当串口发送数据时就触发了外部中断,也就唤醒了STM32,唤醒之后就重新配置初始化串口。
原来关键是这个。使用外部中断,高招啊。厉害厉害。

使用特权

评论回复
地板
killalljp| | 2019-4-10 09:40 | 只看该作者
wanduzi 发表于 2019-3-27 21:04
唤醒思路:在进入STOP模式之前,将串口的RX引脚配置为外部中断模式,然后当串口发送数据时就触发了外部中断 ...

这样的话,不会接收丢字节吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

144

帖子

0

粉丝