|
a0a.1 32b0c
对于一些电池供电的设置功耗是比较敏感的,所以就避免不了采用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可以下载更新程序。
|
-
-
393.99 KB, 下载次数: 1483, 下载积分: ST金币 -1
Alarm唤醒STOP休眠
|