STM32F0 USART唤醒STOP模式

   最近考虑使用STM32F030/042系列做些低功耗的产品,比如车载导航配对的433/315拷贝型遥控器,需要串口通信和STOP模式。

STM32F0 USART唤醒STOP模式_第1张图片

但是遇到比较蛋疼坑爹的事情是,STM32F0系列自带的串口唤醒功能不支持030/042系列,如下:

#define EXTI_Line25      ((uint32_t)0x02000000)  /*!< Internal interrupt line 25
                                                      Connected to the USART1 wakeup
                                                      event, not applicable for STM32F030 devices */
#define EXTI_Line26      ((uint32_t)0x04000000)  /*!< Internal interrupt line 26
                                                      Connected to the USART2 wakeup
                                                      event, applicable only for 
                                                      STM32F072 devices */


然后这就TMD蛋疼了,又得按照以前的方式,在休眠之前把RX设置为中断输入脚;被中断唤醒之后,恢复为RX功能。这样操作起来就是不方面,而且容易丢失好几个字节的数据。

//================================================================================================================

/****************************************************************************************
** 函数名称: STM32F030_STOP(void)
** 功能描述: 设置RTC、RX中断唤醒STOP模式
** 参    数:     void
** 返 回 值:   void
** 日   期: 2017年02月27日
**---------------------------------------------------------------------------------------
** 修 改 人: WEN(QQ214490357/[email protected])
** 日   期: 2017年03月13日
**--------------------------------------------------------------------------------------
****************************************************************************************/

void STM32F030_STOP(void)

{

RCC_Close();//关闭全部时钟,GPIO设为AN输入
RTC_Config(WAKUP_10S0);//设置RTC唤醒周期,10S
EXIT_Control(INT_RTC_WKP,ENABLE);//RTC中断
EXIT_Control(INT_RX_FALL,ENABLE);//USART-RX中断
while(1)
{
IWDG_ReloadCounter();//清狗------ IWDG周期12S
WakeupByRx=0;//在USART-RX中断里面置为1
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入低功耗模式,并通过RTC定期唤醒
if(WakeupByRx==1)
break;
}
EXIT_Control(INT_RTC_WKP,DISABLE);//关闭RTC中断
EXIT_Control(INT_RX_FALL,DISABLE);//关闭USART-RX中断

//接下来恢复系统时钟及USART设置等。。。。。。。。。。。。。。。。

}

//================================================================================================================

为什么要两种唤醒方式?因为实际需要,软件一般都要开启看门狗IWDG,而进入STOP模式后IWDG其实还是一直在计数的,如果不定期清除容易被IWDG重启。所以STOP模式的唤醒方式其实有两个:RTC事件+RX中断。


这种方式有个缺点就是容易丢失串口数据,但如果对于数据很多不怕丢几串数据的我来说,这根本不是事儿~~

写于20170316

你可能感兴趣的:(STM32)