本帖最后由 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时候才发生第二次。
|
@21小跑堂 :已将后面几层楼的内容合并进来,字数够了。
未达原创文章字数不予审核~~