发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

ATMEGA4809的RTC定时器使用方法

[复制链接]
4526|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2025-1-18 08:29 编辑

#申请原创# @21小跑堂
ATmega4809 的 RTC(实时时钟)模块是其外设的一部分,专为实现低功耗时间管理设计。RTC 模块可以用于计时、事件管理和闹钟功能,特别适合需要时间跟踪的嵌入式应用。
RTC 模块具有以下特点
1.独立时钟源
RTC 可以使用内部或外部时钟源,与主系统时钟无关。
支持以下时钟源:
内部 32.768 kHz 振荡器(OSCULP32K,超低功耗)。
外部 32.768 kHz 晶振(通过 XOSC32K 接口连接)。
系统时钟的 1.024 kHz 分频信号。

2.低功耗
RTC 模块在低功耗模式(例如 Standby 模式)下仍然可以正常工作。
适合电池供电的长时间运行应用。

3.灵活的时间单位
支持秒、分钟、小时等时间单位。
可配置为周期性中断(如每秒中断一次)。

4.事件系统支持
支持与其他外设通过事件系统交互,无需 CPU 参与。例如,RTC 事件可以触发 ADC 采样或计数器操作。

5.报警和溢出中断
支持定时触发的报警功能,用于唤醒系统或执行特定任务。
可配置溢出中断,用于周期性任务或计时器功能。

6.Counter 模式
RTC 以计数器形式运行,可进行简单的时间累计。


RTC定时器可以精确的提供用于钟表计时的周期信号
该芯片也具备内部的RTC时钟模块,可以用来实现精确的低速计时器功能
本贴将演示如何使用内部的低速时钟为RTC提供时钟源,设置为0.5s的定时溢出中断,在中断里翻转LED的IO,实现LED的1Hz周期的闪烁。

注意配置RTC计时器周期有2个选项,第一个是比较器的,第二个是周期的,这里使能的溢出中断对应的是周期信号的,所以是第二个
若配置如下为0.1s周期,则执行LED切换电平的频率为5Hz.

#include "mcc_generated_files/system/system.h"
#include"mcc_generated_files/timer/delay.h"
/*
    Main application
*/
void rtc_handler(void)
{
    YELLOW_LED_Toggle();
}
int main(void)
{
    SYSTEM_Initialize();
    RTC_SetOVFIsrCallback(rtc_handler);
    Enable_global_interrupt();

    while(1)
    {
        if(SW_GetValue())
        {            
//            DELAY_milliseconds(500);
        }
        else
        {
            YELLOW_LED_SetHigh();
        }
    }   
}
接下来讲解Periodic Interrupt Timer使用方法

配置如上所示,使能,设置计数周期,使能周期中断。
然后代码这么写
void rtc_handler(void)
{
    YELLOW_LED_Toggle();
}
int main(void)
{
    SYSTEM_Initialize();
   
    Enable_global_interrupt();
    RTC_SetPITIsrCallback(rtc_handler);   

    while(1)
    {
        if(SW_GetValue())
        {            
        }
        else
        {
            YELLOW_LED_SetHigh();
        }
    }   
}即可让PIT中断生效。

那么问题来了,我使用比较器中断,为何没发生中断呢?
MCC中显示应该有3种中断的,为何只有2种生效呢?

在官方的存档中也只展示了其中两种,那么Compare Match Interrupt Enable存在吗?
该如何使用,这是个问题。

请注意,比较是要发生在溢出中断前才可以生效,这个是至关重要的。
因此设置的比较中断时间要发生在溢出中断之前。
另外比较中断的执行周期是跟PERIOD计数器周期是一致的。

例如,该设置在250ms时候发生了比较器中断,执行比较器中断函数,而下次执行的时候要等到计数器溢出后,重新再计时到250ms时候才发生第二次。


使用特权

评论回复
评论
gaoyang9992006 2025-1-18 08:24 回复TA
@21小跑堂 :已将后面几层楼的内容合并进来,字数够了。 
21小跑堂 2025-1-16 17:27 回复TA
未达原创文章字数不予审核~~ 
沙发
gaoyang9992006|  楼主 | 2025-1-11 16:56 | 只看该作者
那么问题来了,我使用比较器中断,为何没发生中断呢?
MCC中显示应该有3种中断的,为何只有2种生效呢?

在官方的存档中也只展示了其中两种,那么[size=13.008px]Compare Match Interrupt Enable存在吗?
[size=13.008px]该如何使用,这是个问题。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2025-01-20
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
21小跑堂 2025-1-20 16:53 回复TA
RTC时钟特点描述,以及在ATMEGA4809中如何实现RTC的计时和中断响应 
gaoyang9992006 2025-1-13 16:10 回复TA
该问题已在地板揭晓,RTC的比较器中断要发生在周期溢出中断之前,所以这里不能配置的超过周期中断时间。 
板凳
598330983| | 2025-1-12 17:56 | 只看该作者
难道一个定时器可以实现两个不同的中断?坐等最后一个比较中断如何实现

使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2025-1-13 16:06 | 只看该作者
续集:昨天留下了一个问题,为什么比较器中断没生效?
请注意,比较是要发生在溢出中断前才可以生效,这个是至关重要的。
因此设置的比较中断时间要发生在溢出中断之前。
另外比较中断的执行周期是跟PERIOD计数器周期是一致的。

例如,该设置在250ms时候发生了比较器中断,执行比较器中断函数,而下次执行的时候要等到计数器溢出后,重新再计时到250ms时候才发生第二次。

使用特权

评论回复
5
天灵灵地灵灵| | 2025-1-14 10:05 | 只看该作者
gaoyang9992006 发表于 2025-1-13 16:06
续集:昨天留下了一个问题,为什么比较器中断没生效?
请注意,比较是要发生在溢出中断前才可以生效,这个 ...

这个用法可以软件上实现PWM啊。

使用特权

评论回复
6
天灵灵地灵灵| | 2025-1-14 10:06 | 只看该作者
gaoyang9992006 发表于 2025-1-13 16:06
续集:昨天留下了一个问题,为什么比较器中断没生效?
请注意,比较是要发生在溢出中断前才可以生效,这个 ...

如果比较器中断的时候拉高电平,周期溢出拉低,然后另外一组颠倒一下,就可以生成互补的PWM。

使用特权

评论回复
7
xuanhuanzi| | 2025-1-18 14:49 | 只看该作者
总结的全面,都有实例操作,给力。

使用特权

评论回复
8
yiy| | 2025-1-26 15:01 | 只看该作者
内部 32.768 kHz 振荡器精度如何?

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2001

主题

16083

帖子

212

粉丝