你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32F303开发】+ RTC闹钟中断唤醒STOP模式休眠  

[复制链接]
creep 提问时间:2015-6-3 22:38 /
对于一些电池供电的设置功耗是比较敏感的,所以就避免不了采用MCU的休眠模式。M3/M4等芯片基本都会有3种休眠模式,本测试程序使用的是STOP模式,该模式进入休眠后唤醒SRAM和外设内容保存不变,采用外部中断唤醒,通过一个按键可实现某种意义上的开关机电路。 stop1.jpg

因为RTC的Alram也和外部中断线相连,所以可以用来唤醒STOP休眠。进入STOP休眠唤醒后系统时钟为内部8M时钟,需要根据需要重新配置系统时钟。程序唤醒后从先进入唤醒的外部中断,然后执行进入STOP休眠的下一条代码。如果要在唤醒中断中执行某种操作,比如我们这个DEMO输出串口数据,那么就要在唤醒的中断中恢复系统时钟。

唤醒后使用内部时钟
stop2.jpg

唤醒代码如下:
  1. void SYSCLKConfig_STOP(void)
  2. {  
  3.   /* After wake-up from STOP reconfigure the system clock */
  4.   /* Enable HSE */
  5.   RCC_HSEConfig(RCC_HSE_ON);
  6.   
  7.   /* Wait till HSE is ready */
  8.   while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
  9.   {}
  10.   
  11.   /* Enable PLL */
  12.   RCC_PLLCmd(ENABLE);
  13.   
  14.   /* Wait till PLL is ready */
  15.   while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  16.   {}
  17.   
  18.   /* Select PLL as system clock source */
  19.   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  20.   
  21.   /* Wait till PLL is used as system clock source */
  22.   while (RCC_GetSYSCLKSource() != 0x08)
  23.   {}
  24. }
复制代码
在Alarm中断中恢复系统时钟:
  1. void RTC_Alarm_IRQHandler(void)
  2. {
  3.   if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
  4.   {
  5.                 //!!因为此时要使用串口发送数据,所以要在此处恢复系统时钟
  6.                 SYSCLKConfig_STOP();
  7.                 printf("\n\r-----RTC ALARMA 中断唤醒STOP休眠-----\n\r\n\r");
  8.                 RTC_GetTime(RTC_Format_BIN,&GetRTCTime);
  9.                 printf("\n\r-----唤醒Time: %02d:%02d:%02d-----\n\r\n\r",GetRTCTime.RTC_Hours,GetRTCTime.RTC_Minutes,GetRTCTime.RTC_Seconds);
  10.     /* Clear the Alarm A Pending Bit */
  11.     RTC_ClearITPendingBit(RTC_IT_ALRA);
  12.    
  13.     /* Clear EXTI line17 pending bit */
  14.     EXTI_ClearITPendingBit(EXTI_Line17);   
  15.   }
  16.   
  17. }
复制代码
Demo测试程序会每5秒唤醒一次STOP中断,然后再次进入STOP,串口会打印设置的唤醒时间和进入STOP提示及唤醒的时间。
alarm.jpg
需要注意的是进入STOP模式后就没法下载程序了,如果程序还在调试阶段的时候,进入STOP模式前尽量做些延时,要不然一上电就STOP模式,如果唤醒的程序有问题的话,那就有可能呵呵了。。。。。
这个DEMO进入STOP模式延时了2s了,如果下载时正好在STOP模式,按下开发板的复位键,2s可以下载更新程序。



F303RE_StopMode.rar

下载

393.99 KB, 下载次数: 1513, 下载积分: ST金币 -1

Alarm唤醒STOP休眠

收藏 3 评论26 发布时间:2015-6-3 22:38

举报

26个回答
嘻嘻ssaa 回答时间:2020-3-13 16:48:12
楼主,非常感谢你的代码,有一点疑问,原代码中有这么一段结合前后程序的意思,应该就是把闹钟唤醒时间设置为当前时间+5秒,如果原来的秒数+5秒超过60秒就会出错,秒数是不可能大于60秒,那么是否这里应该把 == 改为>=60
        //当秒达到60s时要转换为0s,否则无法唤醒STOP休眠
        //by creep
        if(RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds == 60)RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=0;
creep 回答时间:2015-6-4 08:57:30
星辰一方 发表于 2015-6-4 08:43
看来实用HAL库的还是比较少的,这个库资料太少是硬伤啊

之前一直使用标准库开发,所以也就不想马上转换到HAL上面了。
不过,随着ST对HAL的重视,估计以后应该是HAL的天下了。
semon12345 回答时间:2015-6-4 08:18:33
谢谢分享               
lkl0305 回答时间:2015-6-3 23:09:03
学习了
Paderboy 回答时间:2015-6-3 23:18:57
多谢分享,学习了
星辰一方 回答时间:2015-6-4 08:43:01
看来实用HAL库的还是比较少的,这个库资料太少是硬伤啊
stary666 回答时间:2015-6-4 10:02:49
好东西,,,,,
baisse-355648 回答时间:2016-5-30 12:23:56

多谢分享,学习了
jorry 回答时间:2016-7-13 16:04:22
学习一下
YJ_BLADE 回答时间:2016-8-12 08:58:43
学习一下   
凌云 回答时间:2017-3-20 04:05:23
多谢分享,学习了!
zbber 回答时间:2017-3-20 11:05:49
看来实用HAL库的还是比较少的,这个库资料太少是硬伤啊
ssyx1234 回答时间:2017-4-14 14:14:40
XIXIE

feverlee 回答时间:2017-4-20 10:39:14
学习学习下下
沛公刘 回答时间:2018-4-27 00:52:38
支持楼主  谢谢分享
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版