[STM32L0] STM32L053基于LL库、HAL库两种库RTC闹钟唤醒

[复制链接]
3018|28
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 13:48 | 显示全部楼层 |阅读模式
STM32L053闹钟唤醒:
设置实现原理,当闹钟时间==日历时间时,闹钟中断产生,但是闹钟中断与外部中断线17相连,所以如果不初始化外部中断线17,则无法进入RTC中断服务函数。
目的:实现毫米级闹钟中断唤醒睡眠模式
设置日历时间=闹钟时间,启用闹钟的亚秒寄存器,用亚秒寄存器产生毫秒级的计时
进入中断之后,再重新设置日历时间=闹钟时间。
注意:中断之中也要清除外部中断标志



————————————————
版权声明:本文为CSDN博主「火红色祥云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43739167/article/details/108038431



 楼主| 梵蒂冈是神uy 发表于 2022-12-25 13:49 | 显示全部楼层
HAL库
  1. RTC_HandleTypeDef hrtc;
  2. RTC_TimeTypeDef sTime = {0};
  3. RTC_AlarmTypeDef sAlarm = {0};


  4. /**
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]  RTC中断初始化,用于睡眠定时唤醒
  6.   * @param  
  7.   * @retval
  8.   */
  9. void rtc_INT_init(uint16_t ms)
  10. {
  11.   hrtc.Instance = RTC;
  12.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;                                                //LL_RTC_SetHourFormat(RTC_TypeDef *RTCx, uint32_t HourFormat);
  13.   hrtc.Init.AsynchPrediv = 36;                                                                                                //LL_RTC_SetAsynchPrescaler(RTC_TypeDef *RTCx, uint32_t AsynchPrescaler);
  14.   hrtc.Init.SynchPrediv = ms;                                                                                                        //LL_RTC_SetSynchPrescaler(RTC_TypeDef *RTCx, uint32_t SynchPrescaler);
  15.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;                                                        //
  16.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;                        //LL_RTC_DisableOutRemap(RTC_TypeDef *RTCx);
  17.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;//LL_RTC_SetOutputPolarity(RTC_TypeDef *RTCx, uint32_t Polarity);
  18.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;                //LL_RTC_SetAlarmOutputType(RTC_TypeDef *RTCx, uint32_t Output);
  19.   HAL_RTC_Init(&hrtc);       


  20.   /** Initialize RTC and set the Time
  21.   */
  22.   sTime.Hours = 0x08;                                                                                                                                        //LL_RTC_TIME_SetHour(RTC_TypeDef *RTCx, uint32_t Hours)
  23.   sTime.Minutes = 0x30;                                                                                                                                //LL_RTC_TIME_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes)
  24.   sTime.Seconds = 0x10;                                                                                                                                //LL_RTC_TIME_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds)
  25.   sTime.TimeFormat = RTC_HOURFORMAT12_AM;                                                        //LL_RTC_TIME_SetFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat);
  26.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;                //LL_RTC_TIME_DisableDayLightStore(RTC_TypeDef *RTCx)
  27.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;                //
  28.   HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BCD);
  29.        
  30.   /** Enable the Alarm A
  31.   */
  32.   sAlarm.Alarm = RTC_ALARM_A;                                                                                                        //LL_RTC_ALMA_Enable(RTC_TypeDef *RTCx)
  33.   sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY;                                //LL_RTC_ALMA_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay)
  34.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
  35.   sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;                                //LL_RTC_ALMA_SetMask(RTC_TypeDef *RTCx, uint32_t Mask)       
  36.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;//LL_RTC_ALMA_SetSubSecondMask(RTC_TypeDef *RTCx, uint32_t Mask)
  37.   sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM;        //LL_RTC_ALMA_SetTimeFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat);
  38.   sAlarm.AlarmTime.Hours = 0x08;                                                                                        //LL_RTC_ALMA_SetHour(RTC_TypeDef *RTCx, uint32_t Hours)
  39.   sAlarm.AlarmTime.Minutes = 0x30;                                                                                //LL_RTC_ALMA_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes)
  40.   sAlarm.AlarmTime.Seconds = 0x10;                                                                                //LL_RTC_ALMA_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds)
  41.   sAlarm.AlarmTime.SubSeconds = 1;                                                                                //LL_RTC_ALMA_SetSubSecond(RTC_TypeDef *RTCx, uint32_t Subsecond)
  42.   HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BCD);
  43.        
  44.         HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);
  45.   HAL_NVIC_EnableIRQ(RTC_IRQn);
  46.        
  47.         __HAL_RCC_RTC_ENABLE();                                                                                                                        //LL_RTC_EnableIT_ALRA(RTC_TypeDef *RTCx)
  48. }


  49. void RTC_IRQHandler(void)
  50. {
  51.   /* USER CODE BEGIN RTC_IRQn 0 */
  52.        
  53.   /* USER CODE END RTC_IRQn 0 */
  54.   HAL_RTC_AlarmIRQHandler(&hrtc);
  55.   /* USER CODE BEGIN RTC_IRQn 1 */

  56.   /* USER CODE END RTC_IRQn 1 */
  57. }

  58. uint32_t count=0;
  59. /* USER CODE BEGIN 1 */
  60. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
  61. {
  62.         count++;
  63.         debug_print(0, "Enter Count%d\r\n",count);
  64.         HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BCD);
  65. }
 楼主| 梵蒂冈是神uy 发表于 2022-12-25 13:49 | 显示全部楼层
LL库
  1. void rtc_INT_init(uint16_t ms)
  2. {
  3.         LL_RTC_InitTypeDef RTC_InitStruct = {0};
  4.   LL_RTC_TimeTypeDef RTC_TimeStruct = {0};
  5.   LL_RTC_AlarmTypeDef RTC_AlarmStruct = {0};
  6.         LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
  7.         LL_RTC_TimeTypeDef RTC_ALMA_InitStruct = {0};
  8.        
  9.         LL_RCC_EnableRTC();
  10.        
  11.         NVIC_SetPriority(RTC_IRQn, 2);
  12.   NVIC_EnableIRQ(RTC_IRQn);
  13.        
  14.        
  15.   /**/
  16.         EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_17;
  17.   EXTI_InitStruct.LineCommand = ENABLE;
  18.   EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  19.   EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  20.   LL_EXTI_Init(&EXTI_InitStruct);
  21.        
  22.         RTC_InitStruct.HourFormat=LL_RTC_HOURFORMAT_24HOUR;
  23.         RTC_InitStruct.AsynchPrescaler=36;
  24.         RTC_InitStruct.SynchPrescaler=ms;
  25.         LL_RTC_Init(RTC, &RTC_InitStruct);
  26.        
  27.         RTC_TimeStruct.TimeFormat=LL_RTC_TIME_FORMAT_AM_OR_24;
  28.         RTC_TimeStruct.Hours=0x8;
  29.         RTC_TimeStruct.Minutes=0x30;
  30.         RTC_TimeStruct.Seconds=0x10;
  31.         LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_TimeStruct);
  32.        
  33.         RTC_ALMA_InitStruct.TimeFormat=LL_RTC_TIME_FORMAT_AM_OR_24;
  34.         RTC_ALMA_InitStruct.Hours=0x8;
  35.         RTC_ALMA_InitStruct.Minutes=0x30;
  36.         RTC_ALMA_InitStruct.Seconds=0x10;
  37.         LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_ALMA_InitStruct);
  38.        
  39.         RTC_AlarmStruct.AlarmDateWeekDay=RTC_WEEKDAY_MONDAY;
  40.         RTC_AlarmStruct.AlarmDateWeekDaySel=LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY;
  41.         RTC_AlarmStruct.AlarmMask=LL_RTC_ALMA_MASK_DATEWEEKDAY;
  42.         RTC_AlarmStruct.AlarmTime=RTC_ALMA_InitStruct;
  43.         LL_RTC_ALMA_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_AlarmStruct);

  44.        
  45.         LL_RTC_DisableWriteProtection(RTC);
  46.         LL_RTC_ALMA_SetSubSecond(RTC, 1);
  47.         LL_RTC_ALMA_SetMask(RTC, LL_RTC_ALMA_MASK_DATEWEEKDAY);
  48.         LL_RTC_ALMA_SetSubSecondMask(RTC, 0xF);
  49.        
  50.         LL_RTC_ALMA_Enable(RTC);
  51.         LL_RTC_EnableIT_ALRA(RTC);
  52.         LL_RTC_EnableWriteProtection(RTC);
  53. }


  54. void RTC_IRQHandler(void)
  55. {
  56.         LL_RTC_TimeTypeDef RTC_RstTimeStruct = {0};
  57.         if(LL_RTC_IsActiveFlag_ALRA(RTC))
  58.         {
  59.                 printf("IRQn WKUP Timer Enter...\r\n");
  60.                 LL_RTC_ClearFlag_ALRA(RTC);
  61.                 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_17);
  62.         }
  63.         RTC_RstTimeStruct.TimeFormat=LL_RTC_TIME_FORMAT_AM_OR_24;
  64.         RTC_RstTimeStruct.Hours=0x8;
  65.         RTC_RstTimeStruct.Minutes=0x30;
  66.         RTC_RstTimeStruct.Seconds=0x10;
  67.         LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BCD, &RTC_RstTimeStruct);
  68. }
minzisc 发表于 2023-1-5 10:48 | 显示全部楼层
LL库还在使用的吗?              
OKAKAKO 发表于 2023-1-5 11:42 | 显示全部楼层
标准库是不是已经停更了,现在都说HAL 库是主流了
LOVEEVER 发表于 2023-1-6 14:08 | 显示全部楼层
只要能实现功能,那个方法都可以
tabmone 发表于 2023-1-7 16:40 | 显示全部楼层
这个不错。              
robincotton 发表于 2023-1-9 11:41 | 显示全部楼层
网上有教程可以学习的吗?              
小小蚂蚁举千斤 发表于 2023-1-9 15:52 来自手机 | 显示全部楼层
俩个对比,楼主这个不错,不过现在是不是hal库用的多啊
kmzuaz 发表于 2023-1-10 19:51 | 显示全部楼层
RTC掉电数据丢失怎么解决呢?              
sdlls 发表于 2023-1-12 15:51 | 显示全部楼层
HAL库的RTC有bug              
mattlincoln 发表于 2023-1-12 18:37 | 显示全部楼层
hal设置不了RTC的时间呢              
maqianqu 发表于 2023-1-12 20:05 | 显示全部楼层
这个RTC精度怎么样              
primojones 发表于 2023-1-12 21:12 | 显示全部楼层
STM32L053可以设置多少个RTC时钟呢
macpherson 发表于 2023-1-16 13:46 | 显示全部楼层
还可以ms的时间唤醒闹钟的吗?              
sanfuzi 发表于 2023-1-16 22:46 | 显示全部楼层
LL库好用吗?              
biechedan 发表于 2023-2-2 15:25 | 显示全部楼层
stm32 rtc时钟可以用内部时钟吗
youtome 发表于 2023-2-4 10:05 | 显示全部楼层
STM32 中 RTC_Init()是库函数吗?
macpherson 发表于 2023-2-5 12:57 | 显示全部楼层
stm32的rtc外接纽扣电池电压多少
albertaabbot 发表于 2023-2-6 16:55 | 显示全部楼层
stm32rtc后备电池掉电很快
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

735

帖子

1

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