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

【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, 下载次数: 1515, 下载积分: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版