本帖最后由 qintian0303 于 2024-10-13 00:24 编辑
#申请原创# @21小跑堂 @21小跑堂
往期回顾
【CPKCOR-RA8D1B核心板】1、板卡基本信息
【CPKCOR-RA8D1B核心板】2、搭建开发环境
【CPKCOR-RA8D1B核心板】3、离不开的点灯——GPIO输出操作
我们在上一节中实现了阻塞式LED闪烁控制,主要想了解的是对GPIO输出控制的掌握,这一章节中我们实现非阻塞LED闪烁的控制,可以说效果和上一节类似,不过实现方法不同,我们不用一直等待在一个地方了,可以通过定时器的方法,定时处理LED的状态控制,这一章节主要体验的是定时器的普通定时功能.
定时器属于基本外设,我们需要在如下路径添加:
RA MCU 有两种定时器外设:GPT(General PWM Timer)定时器和 AGT(Asynchronous General Purpose Timer)定时器。 在它们之间进行选择时,需要考虑以下因素有低功耗模式、可用通道、分辨率、时钟源等内容。新建一个定时器:
用 g-timer0 来实现定时和触发中断功能, 需要修改的只有“General”和“Interrupts”部分,其他按照默认即可。Timer 模块的 FSP 配置属性如下图所示:
注意修改这两部分,时钟源的选择不要过高,尤其是该定时器的时钟源PCLKB已经达到了60M,无法达到定时1s,AGT 计数器仅为 16 位,最高计数 2 的 16 次方,即 65536,当使用 60MHz 的PCLKB计数源时,AGT最大可定时时间为:65536 * (1 / (60/8)) = 8738.13 us = 8.73813ms。,所以选择LOCO 或者 SUBCLOCK(两者的时钟频率都是32.768KHz)。
这里用的普通定时功能实际上用到的就是AGT,低功耗异步通用定时器(AGT)是 16 位的定时器,可用于基本的定时、脉冲输出、外部脉冲宽度或周期测量,以及外部事件计数。 该定时器主要由一个重加载寄存器和一个递减计数器组成,本次主要实现是基本定时功能。在定时器模式下,计数值在计数源的每个上升沿递减1。 当计数值到达 0x0000 并输入下一个计数源时,发生计数器下溢事件并产生中断请求。
接下来就在咱们的hal_entry ()中初始化定时器,并在回调函数中操作LED的相关变量:
//初始化并启动定时器
R_AGT_Open(&g_timer0_ctrl, &g_timer0_cfg);
R_AGT_Start(&g_timer0_ctrl);
//回调函数
void g_timer0_Callback(timer_callback_args_t * p_args){
if (TIMER_EVENT_CYCLE_END == p_args->event){
LED.cnt++;
LED.flag = 1;
}
}
//LED操作执行
void App_LED(void){
if(LED.flag == 1){
LED.flag = 0;
if(LED.cnt%2 == 0){
LEDUser_ON;
}
else{
LEDUser_OFF;
}
}
}
虽然实现的效果相同,不过实现的方法确实完全不同。
这都是基于可视化的进行的基本配置,有很多是默认配置无需修改,不过我们还是需要全面的了解一下AGT定时器更多功能。AGT定时器包含了计数器、重装载寄存器、计数时钟源、比较匹配、输出引脚等内容。重装载寄存器和递减计数器被分配到相同的地址,并且可以通过 AGT 计数器寄存器(AGT Counter Register)访问。 当我们向该地址写入值的时候,写入的值会被写入重载寄存器,读取的值会从计数器中读取。一般当计数器产生下溢时,重装载寄存器会对计数器进行重装载。
AGT定时器包括多种工作模式:
定时器模式:在定时器模式下,计数值在计数源的每个上升沿递减1。 当计数值到达 0x0000 并输入下一个计数源时,发生计数器下溢事件并产生中断请求。
脉冲输出模式:可以从 AGTIOn 和 AGTOn 引脚输出脉冲。每次发生下溢时,输出电平都会反转。
事件计数器模式:在事件计数器模式下,计数器由输入到 AGTIOn 引脚的外部事件信号(计数源)驱动(递减计数)。
脉冲宽度测量模式:在脉冲宽度测量模式下,测量输入到 AGTIOn 引脚的外部信号的脉冲宽度。
脉冲周期测量模式:在脉冲周期测量模式下,测量输入到 AGTIOn 引脚的外部信号的脉冲周期。 仅测量周期长于计数源周期两倍的输入脉冲。此外,低电平和高 电平宽度都必须长于计数源的周期。 如果输入比这些条件短的脉冲周期,输入可能会被忽略。
比较匹配功能(PWM模式):比较匹配功能可用于 PWM 输出。
|