目录
[1 功能介绍](#1 功能介绍)
[1.1 时钟相关配置](#1.1 时钟相关配置)
[1.2 应用接口](#1.2 应用接口)
[2 FSP配置Project参数](#2 FSP配置Project参数)
[2.1 软件版本信息](#2.1 软件版本信息)
[2.2 配置参数](#2.2 配置参数)
[2.3 项目生成](#2.3 项目生成)
[3 定时器功能代码实现](#3 定时器功能代码实现)
[3.1 定时器初始化函数](#3.1 定时器初始化函数)
[3.2 定时器回调函数](#3.2 定时器回调函数)
[4 功能测试](#4 功能测试)
[5 参考文档](#5 参考文档)
概述
本文主要介绍Renesas MCU的定时器功能的基本用法,笔者使用FSP工具配置定时器参数,基于Renesas e² studio编写和调试代码。
1 功能介绍
1.1 时钟相关配置
时钟配置:
AGT时钟基于PCLKB、LOCO或子时钟频率。可以使用RA Configuration编辑器的Clocks选项卡或在运行时使用CGC接口来设置时钟频率。
定时器周期
RA Configuration编辑器将根据所选的周期时间、单位和时钟速度自动计算周期计数值和源时钟分配器。当选择的单位为"Raw counts"时,根据选择的时钟源不同,允许的最大周期设置不同:
Clock source | 16-bit Timer Maximum period (counts) | 32-bit Timer Maximum period (counts) |
---|---|---|
LOCO/Subclock | 0x800000 | 0x8000000000 |
PCLKB | 0x80000 | 0x800000000 |
All other sources | 0x10000 | 0x100000000 |
注意:
虽然AGT是一个16位定时器,但由于计数器溢出时发生周期中断,将周期寄存器设置为0导致有效周期为1个计数。因此,所有用户提供的原始计数值都反映了周期计数的实际数量(而不是原始寄存器值)。
1.2 应用接口
1)启动和停止AGT
在启动或停止定时器后,AGT寄存器不能被访问,直到AGT状态在3个AGTCLK周期后更新。如果在3 AGTCLK周期结束之前调用另一个AGT函数,则该函数旋转等待AGT状态更新。启动或停止计时器后所需的等待时间可以使用AGTCLK的频率来确定,该频率由timer_cfg_t::source_div和agt_extended_cfg_t::count_source派生。
在访问MCU外设寄存器之前,应用程序负责确保所需的时钟启动和稳定。
2)低功耗模式
AGT1(仅通道1)可用于进入贪睡模式,或在计数器底流发生时唤醒MCU从贪睡、软件待机或深度软件待机模式。比较匹配A和B事件也可用于从软件待机或贪睡模式中唤醒。
3)一次性模式
AGT定时器本身不支持单次模式。单次模式是通过在调用回调之前停止中断服务程序中的计时器来实现的。如果在计时器到期之前中断没有得到服务,计时器将生成多个事件。在这种情况下,回调只被调用一次,但如果计时器链接到Transfer (r_dtc),则可能生成多个事件。
2 FSP配置Project参数
2.1 软件版本信息
软硬件信息 | 版本信息 |
---|---|
Renesas MCU | R7FA4M2AD3C |
Renesas e² studio | 2024-04 (24.4.0) |
FSP 版本 | 5.3.0 |
2.2 配置参数
1)添加和定时器相关的Stacks
2)配置定时器参数
修改属性信息,定时器中断函数触发时间为1ms
定义定时器中断函数
2.3 项目生成
完成以上参数配置就可以生成项目,嗲你Generate project content 就可以生成项目文件,具体文件架构如下:
3 定时器功能代码实现
3.1 定时器初始化函数
代码24行:初始化定时器相关的参数,包括分频系数、中断回调函数等
代码26行:启动定时器
源代码:
cpp
void g_timer0_Init(void)
{
fsp_err_t err = FSP_SUCCESS;
/* Initializes the module. */
err = R_AGT_Open(&g_timer0_ctrl, &g_timer0_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
/* Start the timer. */
(void) R_AGT_Start(&g_timer0_ctrl);
}
3.2 定时器回调函数
代码37行:检测定时器中断溢出事件
代码40行:实现1s定时
代码41行:当时间到达1s之后,LED翻转
源代码
cpp
void g_timer0_callback(timer_callback_args_t *p_args)
{
static int count =0 ;
/* 1毫秒定时器溢出事件 */
if (TIMER_EVENT_CYCLE_END == p_args->event)
{
count++;
if( count %1000 == 0)
LED3_TOGGLE;
}
}
4 功能测试
编译代码下载代板卡中,可以看见LED3会以1s的间隔闪烁
1)点亮LED3的效果
2)关闭LED3的效果
5 参考文档
bash
file:///D:/Renesas/RA/e2studio_v2024-04_fsp_v5.3.0/fsp_documentation/v5.3.0/fsp_user_manual_v5.3.0/index.html