最近考虑使用STM32F030/042系列做些低功耗的产品,比如车载导航配对的433/315拷贝型遥控器,需要串口通信和STOP模式。
但是遇到比较蛋疼坑爹的事情是,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日
**---------------------------------------------------------------------------------------
**--------------------------------------------------------------------------------------
****************************************************************************************/
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中断。
这种方式有个缺点就是容易丢失串口数据,但如果对于数据很多不怕丢几串数据的我来说,这根本不是事儿~~
|