打印
[PIC®/AVR®/dsPIC®产品]

ATMEGA4809的时钟与定时器

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

用过传统8051的都知道,8051的时钟是由外部晶振提供的时钟源,因此选择不同规格的晶振可以得到不同速度的时钟,而ATMEGA4809具备内置的时钟源,且可选配置,并可以通过不同的分频设置让系统获得不同速率的时钟。单片机的定时器由可以在时钟的驱动下,进行计数,用来准确的计时。
接下来给大家介绍如何在MCC下配置时钟源与定时器
所有的定时器都是由时钟源驱动的,作为计数器时候由外部时钟(或称为脉冲)驱动。在MCC里可以看到该型号具备三种定时器:RTC、TCA、TCB,具体内容可以看该芯片的用户参考手册


作为定时器使用时候时钟都是有系统时钟提供,系统时钟的配置方法如下图所示


上图的配置可以将系统时钟设置为1MHz
系统自带的延时函数也是调用的系统时钟作为参考依据以实现1ms的延时或者1us的延时
当系统时钟配置不同的时候,MCC生成的代码会自动修改相关的宏,以匹配设置的系统时钟,参考下方两种不同的系统时钟配置时候生成的代码

你知道了这些就可以开始时钟定时器了
例如我们使用定时器TCA0,我们将系统时钟设置为2MHz,就可以以500ns为单位进行计量,如果设置为1Mhz,TCA0就可以以1us为单位进行计时。
例如我们这里以2MHz作为系统时钟,以500ns为单位计时20ms

下拉菜单,还有更多选项可以设置,例如使能定时器溢出中断,生成ISR中断处理函数

然后Generate,生成MCC工程代码,完善main.c
tca相关生成的mcc库函数和头文件查看你tca0.h/.c
#include "mcc_generated_files/system/system.h"
#include"mcc_generated_files/timer/delay.h"

/*
Main application
*/
unsigned int flag=0;
unsigned int timer_num=0;
unsigned int timer_flag=0;
void sw_int_handle(void)
{
flag=flag?0:1;
}
void tca_int_handle(void)
{
timer_num++;
if(timer_num>=50)
{
timer_flag=1;
timer_num=0;
}
}

int main(void)
{

SYSTEM_Initialize();
SW_SetInterruptHandler(sw_int_handle);
TCA0_OverflowCallbackRegister(tca_int_handle);
Enable_global_interrupt();
while(1)
{
if(flag)
{
if(timer_flag==1)
{
YELLOW_LED_Toggle();
timer_flag=0;
}
// DELAY_milliseconds(500);
}
else
{
YELLOW_LED_SetHigh();
}
}
}
上述代码通过使用定时器TCA0实现延时500ms,用于判断是否切换LED状态。保留了IO中断熄灭LED功能。



使用特权

评论回复
沙发
wanduzi| | 2025-1-9 19:36 | 只看该作者
楼主这么一讲解,时钟与定时器就简单多了,其他看不懂的选项查一下英语词典也可以解决,如果MCC和IDE支持中文就好了

使用特权

评论回复
板凳
21mengnan| | 2025-1-9 19:46 | 只看该作者
RTC如何使用,建议下一贴讲解一下,看看RTC是如何用的,还不知道AVR由RTC呢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1982

主题

16021

帖子

211

粉丝