搜索
查看: 5853|回复: 9

[原创] STM32LL库教程之RTC连续闹钟

[复制链接]

该用户从未签到

30

主题

1058

帖子

12

蝴蝶豆

金牌会员

最后登录
2021-11-9
发表于 2019-1-9 18:11:14 | 显示全部楼层 |阅读模式
     在项目中使用STM32RTC闹钟过程中遇到几个问题,百思不得其解,在百度搜索中也没有找到相关内容于是决定打开数据手册深入学习下这个RTC。以往虽然也有使用过RTC这个外设,不过都是拿来主义,导致这次遇到点问题就懵逼了

   先用神器配置CUBE一下:
1.png
2.png
3.png
4.png
然后点一下齿轮生成代码。
RTC初始化代码,做了一点小改动:
void MX_RTC_Init(void)
{
  LL_RTC_InitTypeDef RTC_InitStruct;
  LL_RTC_TimeTypeDef RTC_TimeStruct;
  LL_RTC_DateTypeDef RTC_DateStruct;
       
        LL_RTC_AlarmTypeDef RTC_AlarmStruct;
  /* Peripheral clock enable */
//  LL_RCC_EnableRTC();
       
//        if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) != 0x32F2)
//        {

                        /**Initialize RTC and set the Time and Date
                        */
                RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR;
                RTC_InitStruct.AsynchPrescaler = 127;
                RTC_InitStruct.SynchPrescaler = 255;
                LL_RTC_Init(RTC, &RTC_InitStruct);

                        /**Initialize RTC and set the Time and Date
                        */
               
                RTC_TimeStruct.Hours = 12;
                RTC_TimeStruct.Minutes = 50;
                RTC_TimeStruct.Seconds = 40;
                LL_RTC_TIME_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_TimeStruct);

                RTC_DateStruct.WeekDay = LL_RTC_WEEKDAY_MONDAY;
                RTC_DateStruct.Month = LL_RTC_MONTH_JANUARY;
                RTC_DateStruct.Year = 19;
                LL_RTC_DATE_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_DateStruct);

                 LL_RTC_BAK_SetRegister(RTC,LL_RTC_BKP_DR0,0x32F2);
                 
                if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) != 0x32F2)
                {
                        LL_RTC_BAK_SetRegister(RTC,LL_RTC_BKP_DR0,0x32F2);
                }
    /**Initialize RTC and set the Time and Date
    */

                if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) != 0x32F2)
                {
                        LL_RTC_BAK_SetRegister(RTC,LL_RTC_BKP_DR0,0x32F2);
                }
//  }
       
        /* RTC interrupt Init */
        NVIC_SetPriority(RTC_IRQn, 0);
        NVIC_EnableIRQ(RTC_IRQn);
        /* RTC Alarm Interrupt Configuration: EXTI configuration */
  LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_17);
  LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_17);
               
//        RTC_AlarmStruct.AlarmTime.Hours =  12;
        RTC_AlarmStruct.AlarmTime.Minutes =  51;
//        RTC_AlarmStruct.AlarmTime.Seconds =  0;
//        RTC_AlarmStruct.AlarmTime.TimeFormat =  LL_RTC_HOURFORMAT_24HOUR;
//        RTC_AlarmStruct.AlarmDateWeekDay = 1;
//        RTC_AlarmStruct.AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE;
        RTC_AlarmStruct.AlarmMask = LL_RTC_ALMA_MASK_DATEWEEKDAY|LL_RTC_ALMA_MASK_HOURS|LL_RTC_ALMA_MASK_SECONDS;//LL_RTC_ALMA_MASK_NONE|LL_RTC_ALMA_MASK_MINUTES;
        LL_RTC_ALMA_Init(RTC,LL_RTC_FORMAT_BIN,&RTC_AlarmStruct);
  LL_RTC_DisableWriteProtection(RTC);       
        LL_RTC_ALMA_Enable(RTC);
        LL_RTC_ClearFlag_ALRA(RTC);
        LL_RTC_EnableIT_ALRA(RTC);
        LL_RTC_EnableWriteProtection(RTC);
}
RTC的闹钟中断是内部连接到外部中断控制器的,所以使能了还要记得使能外部中断线路和设置中断方式,手册上写的闹钟中断使用17号且只能配置成上升沿
5.png 6.png

时间走到设置的闹钟时间后就会进入中断了
void RTC_IRQHandler(void)
{
        if(LL_RTC_IsEnabledIT_ALRA(RTC))
        {
                if(LL_RTC_IsActiveFlag_ALRA(RTC))
                {
                          LL_RTC_DisableWriteProtection(RTC);       
                                LL_RTC_ALMA_Disable(RTC);
                                LL_RTC_ClearFlag_ALRA(RTC);
                                LL_RTC_EnableWriteProtection(RTC);       
                          LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_17);
                          rtc_flag = 1;
                }
        }

}

这里需要注意使用库函数操作RTC后一般都会使能写保护寄存器,所以到中断后先取消写保护然后关闭闹钟A并清除闹钟A的中断标志和17号外部中断标志,这里我用了一个 rtc_flag代表进入了闹钟中断,在主程序中检测到这个标志后设置新的闹钟时间(这里关闭闹钟是为了后面重新设置闹钟,因为不关闭闹钟是无法重新设置闹钟的,我之前出错就是没有看数据手册导致闹钟只能第一次进中断)。

在主程序中重新设置新的闹钟:

void RTC_AlarmA_Callback()
{
        LL_RTC_AlarmTypeDef RTC_AlarmStruct;

//        RTC_AlarmStruct.AlarmTime.Hours =  12;
        RTC_AlarmStruct.AlarmTime.Minutes =  52;
//        RTC_AlarmStruct.AlarmTime.Seconds =  0;
//        RTC_AlarmStruct.AlarmTime.TimeFormat =  LL_RTC_HOURFORMAT_24HOUR;
//        RTC_AlarmStruct.AlarmDateWeekDay = 1;
//        RTC_AlarmStruct.AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE;
        RTC_AlarmStruct.AlarmMask = LL_RTC_ALMA_MASK_DATEWEEKDAY|LL_RTC_ALMA_MASK_HOURS|LL_RTC_ALMA_MASK_SECONDS;//LL_RTC_ALMA_MASK_NONE|LL_RTC_ALMA_MASK_MINUTES;
        LL_RTC_ALMA_Init(RTC,LL_RTC_FORMAT_BIN,&RTC_AlarmStruct);
        LL_RTC_DisableWriteProtection(RTC);       
        LL_RTC_ALMA_Enable(RTC);
        LL_RTC_ClearFlag_ALRA(RTC);
        LL_RTC_EnableWriteProtection(RTC);
}

这里设置了闹钟时间后记得重新使能闹钟A,最后再使能一下写保护,防止意外操作改变RTC里面的数据。只要每次进入中断后读出当前时间并设置新的闹钟时间,就能连续的通过闹钟中断做需要准时做的事情了。

  总结一下,RTC设置时间日期寄存器的时候不是直接设置,而是需要先进入到初始化模式才能设置,设置完成后退出初始化模式开始重新按照设置的时间计时,设置闹钟中断的时候要记得先取消写保护,并且要在闹钟关闭的情况下写入闹钟时间,写入完成后开启闹钟。设置对应的闹钟外部中断线就OK啦。就这样吧,有没写到的下次补充。


STM32L071_LL_RTC.rar

10.75 MB, 下载次数: 359, 下载积分: ST金币 -1

回复

使用道具 举报

该用户从未签到

1492

主题

2703

帖子

0

蝴蝶豆

管理员

最后登录
2021-5-11
发表于 2019-1-22 13:31:34 | 显示全部楼层
谢谢分享
回复

使用道具 举报

该用户从未签到

0

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2019-1-22
发表于 2019-1-22 16:54:25 | 显示全部楼层
感謝分享
回复

使用道具 举报

该用户从未签到

19

主题

1734

帖子

7

蝴蝶豆

论坛元老

最后登录
2021-5-10
发表于 2019-1-23 01:49:55 | 显示全部楼层
谢谢,这个又学了些东西
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

3

帖子

0

蝴蝶豆

新手上路

最后登录
2022-4-21
发表于 2019-6-30 13:29:53 | 显示全部楼层
感谢
回复

使用道具 举报

该用户从未签到

0

主题

6

帖子

0

蝴蝶豆

初级会员

最后登录
2020-8-14
发表于 2019-7-3 16:26:55 | 显示全部楼层
谢谢楼主分享!
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

70

帖子

0

蝴蝶豆

中级会员

最后登录
2020-7-2
发表于 2019-7-4 09:15:11 | 显示全部楼层
很仔细了,谢谢分享
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

22

帖子

0

蝴蝶豆

中级会员

最后登录
2019-9-4
发表于 2019-7-4 14:58:54 | 显示全部楼层
好厉害的样子
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

4

帖子

0

蝴蝶豆

新手上路

最后登录
2020-12-31
发表于 2019-12-6 20:45:20 | 显示全部楼层
大神,我参考了您的代码成功实现了stm32l051的RTC闹钟唤醒待机模式,请问您代码中把LL_RCC_EnableRTC();注释了,这个作用是什么呢
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-19
发表于 2020-3-18 13:30:56 | 显示全部楼层
我也看看研究下。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-19 21:13 , Processed in 0.186960 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表