【STM32F303开发】+ RTC闹钟中断唤醒STOP模式休眠
对于一些电池供电的设置功耗是比较敏感的,所以就避免不了采用MCU的休眠模式。M3/M4等芯片基本都会有3种休眠模式,本测试程序使用的是STOP模式,该模式进入休眠后唤醒SRAM和外设内容保存不变,采用外部中断唤醒,通过一个按键可实现某种意义上的开关机电路。因为RTC的Alram也和外部中断线相连,所以可以用来唤醒STOP休眠。进入STOP休眠唤醒后系统时钟为内部8M时钟,需要根据需要重新配置系统时钟。程序唤醒后从先进入唤醒的外部中断,然后执行进入STOP休眠的下一条代码。如果要在唤醒中断中执行某种操作,比如我们这个DEMO输出串口数据,那么就要在唤醒的中断中恢复系统时钟。
唤醒后使用内部时钟
唤醒代码如下:
void SYSCLKConfig_STOP(void)
{
/* After wake-up from STOP reconfigure the system clock */
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
{}
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while (RCC_GetSYSCLKSource() != 0x08)
{}
}在Alarm中断中恢复系统时钟:
void RTC_Alarm_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
{
//!!因为此时要使用串口发送数据,所以要在此处恢复系统时钟
SYSCLKConfig_STOP();
printf("\n\r-----RTC ALARMA 中断唤醒STOP休眠-----\n\r\n\r");
RTC_GetTime(RTC_Format_BIN,&GetRTCTime);
printf("\n\r-----唤醒Time: %02d:%02d:%02d-----\n\r\n\r",GetRTCTime.RTC_Hours,GetRTCTime.RTC_Minutes,GetRTCTime.RTC_Seconds);
/* Clear the Alarm A Pending Bit */
RTC_ClearITPendingBit(RTC_IT_ALRA);
/* Clear EXTI line17 pending bit */
EXTI_ClearITPendingBit(EXTI_Line17);
}
}
Demo测试程序会每5秒唤醒一次STOP中断,然后再次进入STOP,串口会打印设置的唤醒时间和进入STOP提示及唤醒的时间。
需要注意的是进入STOP模式后就没法下载程序了,如果程序还在调试阶段的时候,进入STOP模式前尽量做些延时,要不然一上电就STOP模式,如果唤醒的程序有问题的话,那就有可能呵呵了。。。。。
这个DEMO进入STOP模式延时了2s了,如果下载时正好在STOP模式,按下开发板的复位键,2s可以下载更新程序。
学习了:D 多谢分享,学习了 谢谢分享 看来实用HAL库的还是比较少的,这个库资料太少是硬伤啊 星辰一方 发表于 2015-6-4 08:43
看来实用HAL库的还是比较少的,这个库资料太少是硬伤啊
之前一直使用标准库开发,所以也就不想马上转换到HAL上面了。
不过,随着ST对HAL的重视,估计以后应该是HAL的天下了。 好东西,,,,,
多谢分享,学习了 学习一下:) 学习一下