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

STM32L051k8RTC闹钟

[复制链接]
芯领神会 提问时间:2018-12-26 16:22 /
最近在进行一个实验项目,使用的是stm32L051k8,是8KRAM,64KFLASH,需要使用到RTC闹钟。同时使用的是LL库,但是发现RTC的闹钟根本无法启动。在此贴出RTC部分代码。希望使用过STM32L0系列闹钟的坛友们帮忙看看。
  RTC_AlarmStruct.AlarmTime.TimeFormat = LL_RTC_HOURFORMAT_24HOUR;
  RTC_AlarmStruct.AlarmTime.Hours = Hours;
  RTC_AlarmStruct.AlarmTime.Minutes = Minutes;
  RTC_AlarmStruct.AlarmTime.Seconds = Seconds;
  RTC_AlarmStruct.AlarmMask =   LL_RTC_ALMB_MASK_DATEWEEKDAY ;                        //精确匹配星期,时分秒
  RTC_AlarmStruct.AlarmDateWeekDaySel =  LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; //按星期闹
  RTC_AlarmStruct.AlarmDateWeekDay = WeekDay;
  LL_RTC_ALMB_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_AlarmStruct);
  LL_RTC_ClearFlag_ALRB(RTC);
  LL_RTC_ALMB_Enable(RTC);
  LL_RTC_EnableIT_ALRB(RTC);
  NVIC_EnableIRQ(RTC_IRQn); //使能RTC中断
  NVIC_SetPriority(RTC_IRQn, 3);



闹钟设定寄存器

闹钟设定寄存器

闹钟CR寄存器无法写入,导致无法开启闹钟

闹钟CR寄存器无法写入,导致无法开启闹钟
收藏 评论3 发布时间:2018-12-26 16:22

举报

3个回答
toofree 回答时间:2018-12-29 09:57:57
本帖最后由 toofree 于 2018-12-29 10:00 编辑

像类似问题,请给出STM32CubeMX、HAL的版本信息、工程文件,否则无法给你测试。你贴出的代码没有问题,可能会有问题的却没有交代。
请使用STM32CubeMX、HAL和LL库最新版本。
HAL都可能有BUG,LL更库容易有BUG,ST有时会不声不响的把BUG修复,版本更新。不要问我是怎么知道的,满满都是累。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

芯领神会 回答时间:2018-12-29 22:11:09

stm32L0xx LL库RTC闹钟

本帖最后由 芯领神会 于 2018-12-29 22:16 编辑

问题已解决:
首先想办法解决了无法开启RTC闹钟事件的问题:
1、在进行闹钟的开启和关闭的时候必须要首先禁用RTC的写保护;
LL_RTC_DisableWriteProtection(RTC);
RTC的闹钟事件就正常了,而且能够正常触发,但是问题来了,事件触发了,但是根本就无法进入中断,这个时候就需要修改两个地方,通过查询寄存器手册得知,RTC的闹钟是映射到了外部中断线,所以需要使用RTC闹钟的中断,就需要开启相应的外部中断:然后添加了两行代码:        LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_17);
        LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_17);
,再次贴出关键代码:
  1. RTC初始化部分:
复制代码
  1. static void InitRTC(void)
  2. {

  3.   LL_RTC_InitTypeDef RTC_InitStruct = {0};

  4.   /* Peripheral clock enable */
  5.   LL_RCC_EnableRTC();

  6.   RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR;
  7.   RTC_InitStruct.AsynchPrescaler = 124;
  8.   RTC_InitStruct.SynchPrescaler = 295;
  9.   LL_RTC_Init(RTC, &RTC_InitStruct);
  10. }
复制代码
  1. //RTC中断部分设定
  2.         LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_17);
  3.         LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_17);
  4.         NVIC_EnableIRQ(RTC_IRQn); //使能RTC中断
  5.   NVIC_SetPriority(RTC_IRQn, 1);
复制代码
  1. BOOLEAN setRtcAlarmA(INT32U SleepTime)
  2. {
  3.   LL_RTC_AlarmTypeDef RTC_AlarmStruct;
  4.   INT8U WeekDay = 0;//星期  1-7
  5.   INT8U Hours = 0;
  6.   INT8U Minutes = 0;
  7.   INT8U Seconds = 0;
  8.   INT32U Time_Now = 0;
  9.         INT32U TimeSecNow = 0;

  10.   Time_Now = LL_RTC_TIME_Get(RTC);//测试改值,要求 该闹钟需要在当前的时间基础上添加闹钟
  11.   TimeSecNow = Time_Now&0xFF;
  12.         TimeSecNow += ((Time_Now>>8)&0xFF)*60;
  13.         TimeSecNow += ((Time_Now>>16)&0xFF)*3600;
  14.        
  15.         SleepTime = SleepTime + TimeSecNow;
  16.         if (SleepTime < 60)
  17.   {
  18.     WeekDay = 0;
  19.     Hours = 0;
  20.     Minutes = 0;
  21.     Seconds = SleepTime;
  22.   }
  23.   else if (SleepTime < 3600)
  24.   {
  25.     WeekDay = 0;
  26.     Hours = 0;
  27.     Minutes = SleepTime / 60;
  28.     Seconds = SleepTime % 60;
  29.   }
  30.   else if (SleepTime < 86400)
  31.   {
  32.     WeekDay = 0;
  33.     Hours = SleepTime / 3600;
  34.     Minutes = SleepTime % 3600 / 60;
  35.     Seconds = SleepTime % 60;
  36.   }
  37.   else if (SleepTime < 259199)
  38.   {
  39.     WeekDay = SleepTime / 86400;
  40.     Hours = SleepTime % 36400 / 3600;
  41.     Minutes = SleepTime % 3600 / 60;
  42.     Seconds = SleepTime % 60;
  43.   }
  44.   else
  45.   {
  46.     return 0;
  47.   }
  48.         WeekDay+=1;
  49.         RTC_AlarmStruct.AlarmTime.TimeFormat = LL_RTC_HOURFORMAT_24HOUR;
  50.   RTC_AlarmStruct.AlarmTime.Hours = Hours;
  51.   RTC_AlarmStruct.AlarmTime.Minutes = Minutes;
  52.   RTC_AlarmStruct.AlarmTime.Seconds = Seconds;
  53.   RTC_AlarmStruct.AlarmMask =   LL_RTC_ALMB_MASK_DATEWEEKDAY ;                        //精确匹配星期,时分秒
  54.   RTC_AlarmStruct.AlarmDateWeekDaySel =  LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; //按星期闹
  55.   RTC_AlarmStruct.AlarmDateWeekDay = WeekDay;
  56.   // LL_RTC_ALMA_EnableWeekday();
  57.   LL_RTC_ALMA_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_AlarmStruct);

  58.   LL_RTC_ALMA_Enable(RTC);//开启闹钟A
  59.   LL_RTC_EnableIT_ALRA(RTC);
  60.        
  61.         LL_RTC_DisableWriteProtection(RTC);
  62.         LL_RTC_DisableIT_ALRA(RTC);
  63.         LL_RTC_ALMA_Disable(RTC);
  64.        
  65.         LL_RTC_ClearFlag_ALRA(RTC);
  66.        
  67.   LL_RTC_EnableIT_ALRA(RTC);
  68.         LL_RTC_ALMA_Enable(RTC);
  69.         LL_RTC_EnableWriteProtection(RTC);
  70.        


  71. }
复制代码


sheol1017 回答时间:2020-1-14 17:02:17
棒棒的

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版