0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32 RTC Alarm的使用

CHANBAEK 来源:EEMaker电子创客营 作者: DK45王 2023-10-24 14:30 次阅读

STM32F072CB做的测试

官方参考应用文档:AN4759

RTC日历时钟配置

通过两个预分频得到1hz的时钟用来更新日历。

  • 异步预分频:PREDIV_A,7-bit(0-127)
  • 同步预分频:PREDIV_S,15-bit(0-32767)

频率计算公式如下:

Fck=Frtcclk/((PREDIV_A-1)*(PREDIV_S-1))

所以计算出PREDIV_A和PREDIV_S的值在配置时记得减1。

配置举例:

  • 比如选择LSI=40khz作为RTC的时钟源,要产生1hz的时钟,就可以配置PREDIV_A=39,PREDIV_S=999
  • 比如选择LSE=32.768khz作为RTC的时钟源,要产生1hz的时钟,可以配置PREDIV_A=127,PREDIV_S=255

为了产生1hz的时钟,分频值可以有多种组合,上面两种只是举例。如果用到alarm也要考虑下面描述的alarm子秒配置。

目标是产生1hz的时钟,当然也可以分频产生非1hz的时钟,只是那样RTC的日历不准而已。

RTC alarm

图片

设定Alarm可以配置多种对比域,每一个都可以单独被屏蔽:

  • 日期或者星期(二选一)
  • 小时
  • 分钟
  • 子秒(根据PREDIV_S预分频的值来确定分辨率)

这些参数分为两个寄存器来进行配置,一个是RTC_ALRMAR,另一个是RTC_ALRMASSR(这个专门负责子秒的alarm配置)

配置举例

  • 比如我现在只想在子秒匹配时候产生alarm,那么Mask4、Mask3、Mask2、Mask1位全部设置为1,正确配置Mask ss的值。
  • 在30分40秒的时候产生alarm,就把Mask2和Mask1设置为0,其他屏蔽位都配置为1。并把分的对比值设置为30,秒的对比值设置为40

Alarm 子秒的配置

图片

RTC alarm的日期、时、分、秒的比较值配置都比较简单,而子秒的配置就会稍微复杂一点。

子秒的比较值是在RTC_ALARMASSR中进行设置,对比的对象是RTC_SSR。

RTC_SSR是子秒的计数器,他的分辨率为:1/(PREDIV_S+1)秒,并且是向下计数的,当值减到0以后会重装载RTC_SPRE中的PREDIV_S。

alarm子秒配置举例:

首先确定RTC时钟源,比如使用的是LSI=40KHZ。

可以配置PREDIV_A=39,PREDIV_S=999 就可以获得日历1秒钟的时钟。

这样子秒的分辨率就为:1sec/(999+1)=1ms

alarm子秒的Mask位:

子秒的Mask位是使用了4bit,位于RTC_ALARMASSR[27:24],设置不同值会屏蔽不同的对比位,具体如下表。如果我们要子秒完全和RTC_SSR值进行对比,就配置MASKSS[3:0]=15

图片

RTC Alarm stm32cubemx配置:

激活日历和Alarm:

图片

配置两个分频值(要根据时钟源计算)

图片

设置Alarm相关的参数,这个要根据自己实际情况来配置。比如我只让子秒进行对比,日期、时、分、秒的屏蔽位都给使能了。设置的Sub Seconds值貌似是cubemx的一个bug,范围只允许0-59。所以生成工程以后我在代码里面手动改成了999

图片

把RTC的中断给使能了,让Alarm可以产生中断

图片

时钟配置不要忘记做选择,这里我使用LSI

图片

生成MDK工程编写代码

rtc.c中这里我手动修改成了999

图片

测试代码主要就是写一个RTC的中断回调函数放在main.c中就可以,在触发alarm的时候翻转LED

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)‘

{

  HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);

}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10859

    浏览量

    354546
  • 时钟
    +关注

    关注

    10

    文章

    1716

    浏览量

    131323
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41366
  • RTC
    RTC
    +关注

    关注

    2

    文章

    524

    浏览量

    66269
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11537
收藏 人收藏

    评论

    相关推荐

    STM32F103正点RTC RTC_Alarm_Set不能作用是为什么?

    STM32F103正点RTC RTC_Alarm_Set根本不能作用
    发表于 04-08 07:28

    stm32alarm触发不是按照我程序设定的

    最近一直在玩STM32,但是遇到了一些问题,看看大家能不能帮帮忙。我编写的stm32程序执行过程是这样的:stm32处于stop低功耗模式,每次由RTC
    发表于 03-28 15:33

    stm32l0 rtc WakeupTimer 和 alarm设置问题

    目前我在学习用 stm32 的低功耗模式,打算通过wakerup timer 或 alarm 来唤醒。现在对这两项功能还有些疑惑:wakeup timer唤醒mcu后,是否可以操作wakeup
    发表于 02-02 19:52

    教你使用RT-Thread开启STM32H7系列的RTCAlarm组件

    背景【ART-PI】默认没有开启Alarm组件,尝试适配并开启有部分工程师想使用RT-Thread 基于STM32H7系列的RTCAlarm(闹钟功能)验证平台Keil MDK5
    发表于 03-16 14:05

    浅谈基于Apollo3平台Alarm组件的移植

    ;rtdbg.h> static struct rt_rtc_device rtc_device; #ifdef RT_USING_ALARM静态 rt_err_t
    发表于 03-21 10:52

    STM32L431 RTC设置和Alarm callback时区不一致是为什么?

    ALarm配置好后一直无法进入callback函数,后来发现是alarm函数的时间是UTC时间,但是在排除了这个问题后发现依然无法进入call back函数,看了下社区不止我一个STM32L4的有类似问题
    发表于 05-26 14:58

    分析在RTT中RTC alarm文件的实现方法

    ;_container.event, 1);}4. 这样,只要在驱动drv_rtc.c添加相应的配置代码,实验alarm功能即可完成alarm.c的功能。配合stm32
    发表于 07-22 10:49

    RTC alarm组件不能进入回调函数该怎样去解决呢

    芯片类型stm32F407ZGT6,用rt threadstudio进行调试,rtthread 版本用的是4.0.3,studio中seting 设置开启rtc驱动组件和alarm驱动组件
    发表于 08-17 12:21

    基于STM32F1的RTCAlarm(闹钟功能)实现定时控制的要求

    功能背景想使用RT-Thread 基于STM32F1系列的RTCAlarm(闹钟功能)实现项目定时控制的要求。实现环境WIN10操作系统、RT-Thread Studio2.1.0
    发表于 09-15 14:42

    STM32L431 RTC设置和Alarm callback时区不一致怎么办呢

    alarm函数的时间是UTC时间,但是在排除了这个问题后发现依然无法进入call back函数,看了下社区不止我一个STM32L4的有类似问题;而且date set_date set_time等设置时间的函数都是带时区设置的,这一点不知道后期版本能否统一,否则在涉及到按
    发表于 11-02 11:55

    RTC alarm组件不进入回调函数的原因是什么?

    芯片类型stm32F407ZGT6,用rt threadstudio进行调试,rtthread 版本用的是4.0.3,studio中seting 设置开启rtc驱动组件和alarm驱动组件
    发表于 05-17 14:14

    RTCalarm中断事件能否唤醒standby或者shutdown模式?

    274页中有描述: 文档中是可以用RTC的中断事件来唤醒的。但是我在工程中配置好的PWR、RTC,却唤醒不了。只能在stop模式下唤醒。 查阅了RM0490《STM32C0x1 advanced
    发表于 08-08 07:22

    STM32单片机RTC时钟的使用方法及步骤

    STM32RTC使用步骤: 打开PWR时钟和Backup区数据访问 若使用外部低速时钟(LSE),打开LSE并等待起振 选择和打开RTC时钟,等待时钟同步 配置时间格式,分频
    发表于 02-11 10:00 3.5w次阅读
    <b class='flag-5'>STM32</b>单片机<b class='flag-5'>RTC</b>时钟的使用方法及步骤

    RT-Thread 应用笔记 - RTC Alarm 组件的使用

    RT-Thread 应用笔记 - 不正确使用LOG也会引发hard faultRT-Thread 应用笔记 - RTC Alarm 组件的使用RT-Thread 应用笔记 - freemodbus RT...
    发表于 01-25 18:18 10次下载
    RT-Thread 应用笔记 - <b class='flag-5'>RTC</b> <b class='flag-5'>Alarm</b> 组件的使用

    STM32片内RTC亚秒特性的应用示例(下)

    不过,今天主要想聊聊如何通过RTC来实现该需求。了解STM32RTC的人可能知道,RTC模块往往还自带一个专门的16位向下计数的唤醒定时器,即下面
    的头像 发表于 04-30 16:32 1584次阅读
    <b class='flag-5'>STM32</b>片内<b class='flag-5'>RTC</b>亚秒特性的应用示例(下)