【瑞萨RA_FSP】AGT——低功耗定时器

news2024/12/23 19:07:49

文章目录

  • 一、AGT简介
  • 二、AGT的框图分析
    • 1. 16位计数器
    • 2. 16位重装载寄存器
    • 3. 计数时钟源
    • 4. 比较匹配功能
    • 5. 比较匹配输出引脚
    • 6. 输出引脚
    • 7. 下溢事件信号/测量完成事件信号输出
  • 三、AGT工作模式详解
  • 四、实验:比较匹配功能——PWM输出
    • 1. 硬件设计
    • 2. 文件结构
    • 3. FSP配置
    • 4. AGT初始化函数
    • 5. 设置PWM占空比函数
    • 6. hal_entry入口函数


RA MCU 有两种定时器外设:GPT(General PWM Timer)定时器和 AGT(Asynchronous General Purpose Timer)定时器。 在它们之间进行选择时,需要考虑以下因素:
在这里插入图片描述

一、AGT简介

低功耗异步通用定时器(AGT)是 16 位的定时器,可用于基本的定时、脉冲输出、外部脉冲宽度或周期测量,以及外部事件计数。 该定时器主要由一个重加载寄存器和一个递减计数器组成。

RA MCU 的不同型号之间可能拥有不同数量的 AGT 定时器, 规格也有可能不同,比如适用于电机控制的 RA6T2 型号MCU拥有 AGTW 定时器,AGTW 的计数器位数加宽到了32位。 而对于野火启明6M5开发板上板载的 RA6M5 芯片拥有 6 个16位的 AGT 定时器(AGTn (n=0~5))。

AGT 定时器的详细功能参数如下表所示:

在这里插入图片描述
AGT 的 I/O 引脚及其功能用途如下表所示:
在这里插入图片描述

二、AGT的框图分析

在这里插入图片描述

1. 16位计数器

见图中标注 ① 处。

AGT 的计数器是一个 16 位的递减计数器,因此它仅支持递减计数。

重装载寄存器和递减计数器被分配到相同的地址,并且可以通过 AGT 计数器寄存器(AGT Counter Register)访问。 当我们向该地址写入值的时候,写入的值会被写入重载寄存器,读取的值会从计数器中读取。

2. 16位重装载寄存器

见图中标注 ② 处。

16 位的重装载寄存器对应的是 16 位的计数器。

一般当计数器产生下溢时,重装载寄存器会对计数器进行重装载。

3. 计数时钟源

见图中标注 ③ 处。

主要有四类时钟输入源:

PCLKB:PCLKB, PCLKB/2, PCLKB/8

LOCO, SUBCLK:AGTLCLK/d, AGTSCLK/d (d = 1, 2, 4, 8, 16, 32, 64, 128)

仅 AGTn (n = 1, 3, 5) 也可以连接到 AGTn (n = 0, 2, 4) 的下溢信号进行计数

外部事件输入(通过 AGTIO 引脚)

4. 比较匹配功能

见图中标注 ④ 处。

比较匹配功能可以用来输出 PWM。

5. 比较匹配输出引脚

见图中标注 ⑤ 处。

比较匹配的结果输出到 AGTOAn、AGTOBn 引脚。

6. 输出引脚

见图中标注 ⑥ 处。

这部分连接到 AGTOn 输出引脚。

7. 下溢事件信号/测量完成事件信号输出

见图中标注 ⑦ 处。

下溢事件信号/测量完成事件信号属于内部信号,通过这两个信号均可触发中断。

三、AGT工作模式详解

定时器模式
在定时器模式下,计数值在计数源的每个上升沿递减1。 当计数值到达 0x0000 并输入下一个计数源时,发生计数器下溢事件并产生中断请求。

脉冲输出模式
可以从 AGTIOn 和 AGTOn 引脚输出脉冲。每次发生下溢时,输出电平都会反转。

事件计数器模式
在事件计数器模式下,计数器由输入到 AGTIOn 引脚的外部事件信号(计数源)驱动(递减计数)。

脉冲宽度测量模式
在脉冲宽度测量模式下,测量输入到 AGTIOn 引脚的外部信号的脉冲宽度。

脉冲周期测量模式
在脉冲周期测量模式下,测量输入到 AGTIOn 引脚的外部信号的脉冲周期。 仅测量周期长于计数源周期两倍的输入脉冲。此外,低电平和高电平宽度都必须长于计数源的周期。 如果输入比这些条件短的脉冲周期,输入可能会被忽略。

比较匹配功能:PWM模式
比较匹配功能可用于 PWM 输出。

四、实验:比较匹配功能——PWM输出

1. 硬件设计

PWM 输出引脚使用的开发板引出的 IO 引脚: P500,如下图所示。
在这里插入图片描述

2. 文件结构

_AGT_PWM_Output
├─ ......
└─ src
   ├─ led
   │  ├─ bsp_led.c
   │  └─ bsp_led.h
   ├─ debug_uart
   │  ├─ bsp_debug_uart.c
   │  └─ bsp_debug_uart.h
   ├─ agt
   │  ├─ bsp_agt_pwm_output.c
   │  └─ bsp_agt_pwm_output.h
   └─ hal_entry.c

3. FSP配置

因为 PWM 输出需要使用 IO 口进行输出,因此需要先在“Pins”配置页中为 AGT 配置引脚, 将 AGT 的 AGTOA0 信号输出连接到 P500 引脚,如下图所示。
在这里插入图片描述
随后在“Stacks”配置页中加入 AGT 模块,并对其作如下图所示的配置。
在这里插入图片描述
AGT 的“Output”部分属性描述如下表所示。
在这里插入图片描述

4. AGT初始化函数

/* AGT初始化函数 */
void AGT_PWM_Init(void)
{
    /* 初始化 AGT 模块 */
    R_AGT_Open(&g_timer_agt0_ctrl, &g_timer_agt0_cfg);

    /* 启动 AGT 定时器 */
    R_AGT_Start(&g_timer_agt0_ctrl);

    /* 重新设置占空比为 80% */
    AGT_PWM_SetDuty(80);
}

需要注意的是,在 AGT 初始化函数里面,我们重新设置了占空比:50% → 80%。 设置PWM占空比使用了我们自己写的 AGT_PWM_SetDuty 函数。

5. 设置PWM占空比函数

/** 自定义函数:设置PWM占空比
    @param duty 占空比范围:0~100 %
*/
void AGT_PWM_SetDuty(uint8_t duty)
{
    timer_info_t info;
    uint32_t current_period_counts;
    uint32_t duty_cycle_counts;

    if (duty > 100)
        duty = 100; //限制占空比范围:0~100

    /* 获得AGT的信息 */
    R_AGT_InfoGet(&g_timer_agt0_ctrl, &info);

    /* 获得计时器一个周期需要的计数次数 */
    current_period_counts = info.period_counts;

    /* 根据占空比和一个周期的计数次数计算比较匹配寄存器的值 */
    duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);

    /* 最后调用FSP库函数设置占空比 */
    R_AGT_DutyCycleSet(&g_timer_agt0_ctrl, duty_cycle_counts, AGT_OUTPUT_PIN_AGTOA);
}

该函数的主要思路是需要先知道计数器的计数周期(即当前输出的PWM信号的一个周期需要计数的值 current_period_counts), 然后计算与要设定的占空比(duty)对应的计数值(duty_cycle_counts), 最后调用FSP库函数 R_AGT_DutyCycleSet 写入该占空比对应的计数值。

调用 R_AGT_DutyCycleSet 函数时需要注意传入的第三个参数是 AGT_OUTPUT_PIN_AGTOA, 因为使用的PWM输出引脚 P500 连接到的是 AGT0 的 AGTOA 信号。 如果换用别的引脚,需要注意检查这个参数是否需要修改。

6. hal_entry入口函数

/* 用户头文件包含 */
#include "led/bsp_led.h"
#include "debug_uart/bsp_debug_uart.h"
#include "gpt/bsp_gpt_pwm_output.h"


void hal_entry(void)
{
    /* TODO: add your own code here */

    LED_Init();         // LED 初始化
    Debug_UART4_Init(); // SCI4 UART 调试串口初始化
    AGT_PWM_Init();     // AGT 初始化

    printf("这是一个 AGT 的PWM输出功能实验\r\n");
    printf("使用示波器测量 P500 输出的PWM波形\r\n");

    // LED1 闪烁指示程序正在运行...
    while(1)
    {
        LED1_ON;
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
        LED1_OFF;
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
    }


#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础篇:新手使用vs code新建go项目(从0开始到运行)

学习新语言,搭建新环境。在网上找了一些教程,感觉还是写一个比较详细的方便以后自己使用。其实vs code没有新建项目这个功能,具体怎么运行go语言的项目请看下文。 一、下载GO安装包 1.点击go安装包下载链接下载相应的版本(本次下…

【计算机网络自顶向下】简答题习题总结(三)

文章目录 第三章 传输层UDP用户数据报协议可靠数据传输原理面向连接传输TCP流量控制可靠数据传输机制 题目 第三章 传输层 传输层服务:在两个不同的主机的运行应用程序之间提供逻辑通信 在接收主机多路分解 将接收到的数据段传递给正确的套接字【多路分解】 在发送…

线程与轻进程(OS)

目录 1、进程的引入 2、线程的概念 3、线程的结构 3、线程控制块 5、线程的实现 (1)用户级别线程 (2)核心级别线程 (3)混合线程 6、线程的应用 1、进程的引入 进程切换 上下文涉及内容多&#xf…

软件测试面试,从简历到面试常问,不学几招怎么跳槽?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 软件测试面试环节…

关于Java多线程不安全的问题简析

在了解多线程不安全的问题之前 让我们先来看如下代码 public class demo18 {public static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(()->{for (int i 0; i < 10000; i) {count;}});Thread t2 new …

软件测试报告需要做哪些测试内容?软件测试外包服务公司靠谱吗?

在软件开发领域中&#xff0c;测试是最为重要的环节之一&#xff0c;它在确保软件质量方面有着至关重要的作用。软件测试是一种检验软件代码是否符合设计和用户期望的过程。软件测试的主要目的是发现缺陷并确保软件在实际使用中的可靠性&#xff0c;安全性&#xff0c;以及稳定…

Linux中centos修改系统时间并写到硬件,Linux中centos设置定时自动同步网络时间

文章目录 前言一、centos修改系统时间并写到硬件1.1查看当前的系统时间1.2修改系统时间1.3查看硬件时间1.4同步系统时间和硬件时间1.5本地时间写入硬件时间 二、centos设置定时自动同步网络时间2.1安装ntpdate工具2.2CentOS安装/操纵crontab2.3启动crontab并查看状态2.4写一个c…

Ubuntu系统安装Mysql服务并设置远程连接-Navicat连接Mysql-物联网系统

目录 一、前言 二、Mysql的安装 三、Mysql服务管理 四、配置Mysql远程连接 五、修改登录限制 六、修改Root密码 七、Navicat连接Mysql 一、前言 在我们购买服务器后&#xff0c;常需要在服务器上部署数据库以存储我们所需要的数据&#xff0c;因此我们本文将在Ubuntu系统…

LeetCode - #81 搜索旋转排序数组 II

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

解决阿里云服务器被植入挖矿脚本过程

文章目录 前言一、服务器为什么会被告警挖矿&#xff1f;二、怎么解决&#xff1a;1.top 命令查看进程cpu 占用情况&#xff1a;2.通过pid进程号&#xff0c;查找改程序所在的目录&#xff1a;3. 强制删除脚本文件&#xff1a;4. 强制杀死进程&#xff1a;5. 检查是否有脚本的定…

three.js物体纹理及其常用属性介绍

一、Three中的纹理和材质介绍 THREE中的纹理和材质是用来渲染3D场景中的物体表面的。纹理贴图定义物体表面的颜色和外观&#xff0c;而材质则定义物体表面如何反射光线。 纹理可以使用多种类型的图像文件&#xff0c;包括JPEG、PNG、GIF等。纹理可以是简单的颜色、图案或者是复…

史上最卷618背后:国产手机厂商突围的“新武器”

智能手机&#xff0c;究竟还是不是个好生意? 这个问题在近些年被市场反复追问&#xff0c;在最近被称为“史上最卷”的618期间&#xff0c;更是被增添了悲观的色彩。IDC中国研究经理郭天翔表示&#xff0c;本次618智能终端市场是低于预期的&#xff0c;同时也低于去年同期。除…

Qt6.2教程——1.Qt安装及编写登录界面

本文旨在帮助读者理解如何使用ChatGPT来辅助安装和学习Qt 6.2。我们将从Qt 6.2的基本概念开始&#xff0c;然后深入了解其安装过程&#xff0c;并探讨如何使用ChatGPT作为一个强大的辅助工具。对于那些寻求在学习和使用Qt 6.2中找到有效支持的人来说&#xff0c;这篇文章将提供…

FBM207C RH917GY将相关调节系统打到手动状态,必要时到现场进行调节

​ FBM207C RH917GY将相关调节系统打到手动状态&#xff0c;必要时到现场进行调节 FBM207C RH917GY将相关调节系统打到手动状态&#xff0c;必要时到现场进行调节 随着自动化水平的提高&#xff0c;dcs控制系统(集散控制系统)逐渐代替了常规仪表&#xff0c;其优越性已被广大操…

Vue 常用属性

数据属性 组件的 data 选项是一个函数&#xff08;data里面是有return的&#xff09;。Vue 会在创建新组件实例的过程中调用此函数&#xff08;将里面定义的变量都放到实例里面去&#xff0c;你就可以使用this点出来&#xff0c;包括HTML里面就能够使用这些变量的&#xff09;。…

LabVIEW开发航空航天器风洞的数据采集系统

LabVIEW开发航空航天器风洞的数据采集系统 空气动力及其系数的评估是航空航天器设计中的一项基本任务&#xff0c;对于考虑制造高效飞行器非常重要。航空航天器的效率是根据其稳定性、最小阻力和更高的机动性来定义的。在风洞中使用航空航天飞行器模型进行测试&#xff0c;而不…

【Leetcode】11.盛最多水的容器

一、题目 1、题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 示例1: 输…

Nautilus Chain:模块化Layer3的先行者

“模块化特性的 Nautilus Chain 正在成为 Layer3 的早期定义者之一&#xff0c;并有望进一步推动区块链更广泛的应用与实践 ” 自以太坊创始人 Vitalik Buterin 在去年提出 Layer3 的概念后&#xff0c;行业始终对“Layer3”进行讨论&#xff0c;并期望推动该概念&#xff0c;从…

mysql版本5.5.*升级为5.7.*,遇到的问题和解决方法都来看看吧,最终升级成功~

背景&#xff1a;由于项目比较老&#xff0c;用的数据库版本也是相当低&#xff0c;现在业务需求需要做数据同步&#xff0c;使用FlinkCDC的时候报数据库版本低&#xff0c;查询FlinkCDC要求的最低版本后果断升级mysql~ FlinkCDC对mysql最低版要求如下图&#xff1a; &#x…

excel导出百万数据与进度条展示

前言 需求&#xff1a;用户在UI界面上选择想要导出的列&#xff0c;然后点击导出按钮&#xff0c;就能导出用户想要的数据。 效果展示 可能会产生的问题 1.如果同步到数据&#xff0c;接口很容易造成超时。 2.如果把数据一次性装载到内存里&#xff0c;很容易造成OOM与GC。 3…