RTC 唤醒深度睡眠模式

[复制链接]
1838|3
 楼主| 小小蚂蚁举千斤 发表于 2023-6-23 17:27 | 显示全部楼层 |阅读模式
本帖最后由 小小蚂蚁举千斤 于 2023-6-23 17:32 编辑

一、RTC 自动唤醒
系统上电后,LED1 闪烁。当 Tamper 按键按下后,产生 EXTI 中断,在此中断中开启 RTC 自动唤醒功能;退出 EXTI 中断后,MCU 进入进入深度睡眠模式 1 且 LED1 停止闪烁。当自动唤醒时间到达后,产生 RTC 自动唤醒事件并将系统从深度睡眠模式 1 唤醒,LED 继续闪烁。由于事先开启了 RTC 自动唤醒中断,在唤醒后将进入 RTC 唤醒中断,在中断中关闭自动唤醒功能。
RTC 自动唤醒相关配置如下:
1. RTC 自动唤醒配置

  1. void rtc_configuration(void)
  2. {
  3. rtc_parameter_struct rtc_initpara;
  4. __IO uint32_t prescaler_a = 0x7F, prescaler_s = 0xFF;
  5. /* enable PMU and BKPI clocks */
  6. rcu_periph_clock_enable(RCU_PMU);
  7. rcu_periph_clock_enable(RCU_BKP);
  8. /* allow access to BKP domain */
  9. pmu_backup_write_enable();
  10. rcu_periph_clock_enable(RCU_RTC);
  11. /* enable LXTAL */
  12. rcu_osci_on(RCU_LXTAL);
  13. /* wait for LXTAL stabilization flag */
  14. rcu_osci_stab_wait(RCU_LXTAL);
  15. rcu_lxtal_clock_monitor_enable();
  16. /* configure the RTC clock source selection */
  17. rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
  18. rtc_register_sync_wait();
  19. /* setup RTC time value */
  20. rtc_initpara.factor_asyn = prescaler_a;
  21. rtc_initpara.factor_syn = prescaler_s;
  22. rtc_initpara.year = 0x16;
  23. rtc_initpara.day_of_week = RTC_WEDNESDAY;
  24. rtc_initpara.month = RTC_SEP;
  25. rtc_initpara.date = 0x07;
  26. rtc_initpara.display_format = RTC_24HOUR;
  27. rtc_initpara.am_pm = RTC_AM;
  28. rtc_initpara.hour = 0x09;
  29. rtc_initpara.minute = 0x28;
  30. rtc_initpara.second = 0;
  31. rtc_init(&rtc_initpara);
  32. /* EXTI line 20 configuration */
  33. nvic_irq_enable(RTC_WKUP_IRQn, 2);
  34. exti_flag_clear(EXTI_20);
  35. exti_init(EXTI_20, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  36. rtc_flag_clear(RTC_STAT_WTF);
  37. /* wakeup clock configuration */
  38. rtc_wakeup_clock_set(WAKEUP_CKSPRE);
  39. rtc_wakeup_timer_set(2);
  40. rtc_interrupt_enable(RTC_INT_WAKEUP);
  41. rtc_wakeup_disable();
  42. }




 楼主| 小小蚂蚁举千斤 发表于 2023-6-23 17:29 | 显示全部楼层
2. RTC 自动唤醒中断处理
  1. void RTC_WKUP_IRQHandler(void)
  2. {
  3. if(RESET != rtc_flag_get(RTC_FLAG_WT)) {
  4. /* clear EXTI line 20 pending and rtc wakeup flag */
  5. rtc_flag_clear(RTC_FLAG_WT);
  6. exti_flag_clear(EXTI_20);
  7. /* disable rtc auto wakeup function */
  8. rtc_wakeup_disable();
  9. }
  10. }
3. 按键中断处理
  1. void EXTI10_15_IRQHandler(void)
  2. {
  3. if(SET == exti_interrupt_flag_get(EXTI_13)) {
  4. /* clear EXTI line 13 pending flag */
  5. exti_interrupt_flag_clear(EXTI_13);
  6. enter_deepsleep_flag = 1;
  7. /* enable RTC auto wakeup function */
  8. rtc_wakeup_enable();
  9. }
  10. }


 楼主| 小小蚂蚁举千斤 发表于 2023-6-23 17:31 | 显示全部楼层
本帖最后由 小小蚂蚁举千斤 于 2023-6-23 17:33 编辑

二、RTC 闹钟唤醒
系统上电后,LED1 闪烁。当 Tamper 按键按下后,产生 EXTI 中断,在此中断中更新 RTC 闹钟时间并开启闹钟功能;退出 EXTI 中断后,MCU 进入进入深度睡眠模式 1 且 LED1 停止闪烁。当闹钟时间到达后,产生 RTC 闹钟事件并将系统从深度睡眠模式 1 唤醒,LED 继续闪烁。。由于事先开启了 RTC 闹钟 0 中断,在唤醒后将进入 RTC 闹钟中断,在中断中关闭闹钟0 功能。
RTC 闹钟唤醒相关配置如下:


1. RTC 闹钟唤醒配置
  1. void rtc_configuration(void)
  2. {
  3. rtc_parameter_struct rtc_initpara;
  4. __IO uint32_t prescaler_a = 0x7F, prescaler_s = 0xFF;
  5. /* enable PMU and BKPI clocks */
  6. rcu_periph_clock_enable(RCU_PMU);
  7. rcu_periph_clock_enable(RCU_BKP);
  8. /* allow access to BKP domain */
  9. pmu_backup_write_enable();
  10. rcu_periph_clock_enable(RCU_RTC);
  11. /* enable LXTAL */
  12. rcu_osci_on(RCU_LXTAL);
  13. /* wait for LXTAL stabilization flag */
  14. rcu_osci_stab_wait(RCU_LXTAL);
  15. rcu_lxtal_clock_monitor_enable();
  16. /* configure the RTC clock source selection */
  17. rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
  18. rtc_register_sync_wait();
  19. /* setup RTC time value */
  20. rtc_initpara.factor_asyn = prescaler_a;
  21. rtc_initpara.factor_syn = prescaler_s;
  22. rtc_initpara.year = 0x16;
  23. rtc_initpara.day_of_week = RTC_WEDNESDAY;
  24. rtc_initpara.month = RTC_SEP;
  25. rtc_initpara.date = 0x07;
  26. rtc_initpara.display_format = RTC_24HOUR;
  27. rtc_initpara.am_pm = RTC_AM;
  28. rtc_initpara.hour = 0x09;
  29. rtc_initpara.minute = 0x28;
  30. rtc_initpara.second = 0;
  31. rtc_init(&rtc_initpara);
  32. /* RTC alarm configuration */
  33. rtc_alarm_struct rtc_alarm;
  34. rtc_alarm_disable(RTC_ALARM0);
  35. rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK | RTC_ALARM_HOUR_MASK |
  36. RTC_ALARM_MINUTE_MASK;
  37. rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
  38. rtc_alarm.alarm_day = 0x31;
  39. rtc_alarm.am_pm = RTC_AM;
  40. rtc_alarm.alarm_hour = 0x09;
  41. rtc_alarm.alarm_minute = 0x28;
  42. rtc_alarm.alarm_second = 0x00;
  43. rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
  44. /* EXTI line 17 configuration */
  45. nvic_irq_enable(RTC_Alarm_IRQn, 0);
  46. exti_flag_clear(EXTI_17);
  47. exti_init(EXTI_17, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  48. rtc_flag_clear(RTC_STAT_ALRM0F);
  49. /* enable alram 0 interrupt */
  50. rtc_interrupt_enable(RTC_INT_ALARM0);
  51. rtc_alarm_disable(RTC_ALARM0);
  52. }




 楼主| 小小蚂蚁举千斤 发表于 2023-6-23 17:32 | 显示全部楼层
2. RTC 闹钟中断处理
  1. void RTC_Alarm_IRQHandler(void)
  2. {
  3. if(RESET != rtc_flag_get(RTC_FLAG_ALARM0)) {
  4. /* clear EXTI line 20 pending and rtc alarm flag */
  5. rtc_flag_clear(RTC_FLAG_ALARM0);
  6. exti_flag_clear(EXTI_17);
  7. /* disable rtc alarm 0 function */
  8. rtc_alarm_disable(RTC_ALARM0);
  9. }
  10. }



3. 按键中断处理
  1. void EXTI10_15_IRQHandler(void)
  2. {
  3. if(SET == exti_interrupt_flag_get(EXTI_13)) {
  4. /* clear EXTI line 13 pending flag */
  5. exti_interrupt_flag_clear(EXTI_13);
  6. enter_deepsleep_flag = 1;
  7. /* update rtc alarm time*/
  8. rtc_alarm_update(0x03);
  9. }
  10. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

228

主题

2630

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部