RT1052的定时器

news2024/11/15 16:35:49

文章目录

  • 1 通用定时器
    • 1.1 定时器框图
    • 1.2 实现周期性中断
  • 2 相关寄存器
  • 3 定时器配置
    • 3.1 时钟使能
    • 3.2 初始化GPT1定时器
      • 3.2.1 base
      • 3.2.2 initConfig
        • 3.2.2.1 clockSorce
        • 3.2.2.2 divider
        • 3.2.2.3 enablexxxxx
    • 3.3 设置 GPT1 比较值
      • 3.3.1 base
      • 3.3.2 channel
      • 3.3.3 value
    • 3.4 设置 GPT1 输出比较 1 的 中断
    • 3.5 使能 GPT
    • 3.6 设置 GPT1 中断 优先级
    • 3.7 编写中断服务函数
      • 3.7.1 GPT_GetStatusFlags
      • 3.7.2 GPT_ClearStatusFlags
    • 3.8 最终代码

1 通用定时器

RT1052 内部包含 2 个通用定时器(GPT1 和 GPT2,以下简称 GPT)

1.1 定时器框图

在这里插入图片描述一个 32 位定时器,拥有 2 个输入捕获通道、3 个输出比较通道以及相应的中断。

1)32 位计数器(CNT),仅支持递增计数方式。
2)12 位可编程预分频器(PR),计数器时钟频率的分频系数为 1~4096 之间的任意数值。
3)2 个输入捕获通道,支持上升沿、下降沿和任意边沿捕获。
4)3 个输出比较通道,支持取反、设置、清零和生成单脉冲(1 个输入时钟)模式。
5)支持捕获、比较和溢出中断。
6)支持低功耗模式下继续运行。
6)支持重启(Restart)模式和自由运行(Free Run)模式

  • 重启模式:当计数器值与比较值匹配时,计数器自动清零,重新开始计数。
  • 自由运行模式:计数器值总是从 0 开始计数,一直到 0XFFFFFFFF 溢出,发生匹配事件不会导致定时器清零。

1.2 实现周期性中断

使用重启模式,利用比较值1 来设置溢出时间

2 相关寄存器

3 定时器配置

GPT 相关的库函数在 fsl_gpt.c 和 fsl_gpt.h 这两个文件中

3.1 时钟使能

GPT 初始化函数 GPT_Init 默认会使能GPT 使能。函数里面通过 CLOCK_EnableClock 来使能了 GPT1 时钟。

3.2 初始化GPT1定时器

void GPT_Init(GPT_Type *base, const gpt_config_t *initConfig)

gpt_config_t gpt1_onfig;
GPT_GetDefaultConfig(&gpt1_onfig); //先初始化 GPT1 为默认值
gpt1_onfig.clockSource=kGPT_ClockSource_Periph; //初始化时钟源 perclk_clk_root
gpt1_onfig.divider=psc; //设置分频值
GPT_Init(GPT1,&gpt1_onfig); //初始化 GPT1

3.2.1 base

GPT1

3.2.2 initConfig

typedef struct _gpt_init_config
{
	gpt_clock_source_t clockSource; //选择时钟源
	uint32_t divider; //时钟源分频
	bool enableFreeRun;
	bool enableRunInWait;
	bool enableRunInStop;
	bool enableRunInDoze;
	bool enableRunInDbg;
	bool enableMode;
} gpt_config_t;

3.2.2.1 clockSorce

clockSource 用来设置用于 GPT 的时钟源

typedef enum _gpt_clock_source
{
	kGPT_ClockSource_Off = 0U, //关闭时钟
	kGPT_ClockSource_Periph = 1U, //外设时钟(ipg_clk)
	kGPT_ClockSource_HighFreq = 2U, //高速参考时钟(ipg_clk_highfreq)
	kGPT_ClockSource_Ext = 3U, //外部参考时钟
	kGPT_ClockSource_LowFreq = 4U, //低速参考时钟(ipg_clk_32k)
	kGPT_ClockSource_Osc = 5U, //24M 晶振
} gpt_clock_source_t;

实 际 上 设 置 的 是 CR 寄 存 器 的 CLKSRC 位 , 一 般 选 择 外 设 时 钟
kGPT_ClockSource_Periph (ipg_clk)作为 GPT 的时钟源

  • 外设时钟配置一般为75Mhz。

3.2.2.2 divider

divider 设置时钟源分频,可以设置的值范围为 0~4095,分别对应 1~4096 分频。

  • 实际设置的是 PR 寄存器的 PRESCALER 位
  • 比如我们将分频值设置为 2,那么 GPT1 最终的时钟就是:75MHz/(2+1)=25MHz。

3.2.2.3 enablexxxxx

使能 GPT 的相应模式

3.3 设置 GPT1 比较值

设置好比较值就可以决定确定GPT1的溢出时间了,也就是定时时间。

  • GPT1 比较值的设定通过函数 GPT_SetOutputCompareValue 来完成
static inline void GPT_SetOutputCompareValue(GPT_Type *base,gpt_output_compare_channel_t channel,uint32_t value)

3.3.1 base

GPT1

3.3.2 channel

typedef enum _gpt_output_compare_channel
{
	kGPT_OutputCompare_Channel1 = 0U, //输出比较通道 1
	kGPT_OutputCompare_Channel2 = 1U, //输出比较通道 2
	kGPT_OutputCompare_Channel3 = 2U, //输出比较通道 3
} gpt_output_compare_channel_t;

3.3.3 value

第三个参数就是要设置的比较值。

  • 比如我们设置 GPT1 分频值为 3749
  • 那么GPT1 的时钟就是 75MHz/(3749+1)=20000Hz
  • 比较值设置为 10000 的话那么每 0.5s 就会产生一次比较中断,这样就实现了 0.5s 的定时。

3.4 设置 GPT1 输出比较 1 的 中断

输出比较中断设置通过函数 GPT_EnableInterrupts 来完成

GPT_EnableInterrupts(GPT_Type *base, uint32_t mask);

GPT_EnableInterrupts(GPT1, kGPT_OutputCompare1InterruptEnable);

使用 GPT1 的输出比较通道 1,所以设置为 kGPT_OutputCompare1InterruptEnable。

3.5 使能 GPT

调用函数 GPT_StartTimer 来使能 GPT 定时器

void GPT_StartTimer(GPT_Type *base)

设置 CR 寄存器的 EN 位

3.6 设置 GPT1 中断 优先级

因为要产生中断,必不可少的要设置 NVIC 相关寄存器

RT1052_NVIC_SetPriority(GPT1_IRQn,5,0); //抢占优先级 5,子优先级 0
EnableIRQ(GPT1_IRQn); //使能 GPT1 中断

3.7 编写中断服务函数

中断产生后,需要通过函数 GPT_GetStatusFlags 判断是否为比较中断。在处理完中断之后调用函数 GPT_ClearStatusFlags 来清除该中断标志。

3.7.1 GPT_GetStatusFlags

static inline uint32_t GPT_GetStatusFlags(GPT_Type *base, gpt_status_flag_t flags)
  • GPT1
  • flags
typedef enum _gpt_status_flag
{
	kGPT_OutputCompare1Flag = GPT_SR_OF1_MASK, //输出比较通道 1 中断标志
	kGPT_OutputCompare2Flag = GPT_SR_OF2_MASK, //输出比较通道 2 中断标志
	kGPT_OutputCompare3Flag = GPT_SR_OF3_MASK, //输出比较通道 3 中断标志
	kGPT_InputCapture1Flag = GPT_SR_IF1_MASK, //输入捕获通道 1 中断标志
	kGPT_InputCapture2Flag = GPT_SR_IF2_MASK, //输入捕获通道 2 中断标志
	kGPT_RollOverFlag = GPT_SR_ROV_MASK, //溢出中断标志
} gpt_status_flag_t;

3.7.2 GPT_ClearStatusFlags

中断状态(标志位)清除函数 GPT_ClearStatusFlags 原型如下:

static inline void GPT_ClearStatusFlags(GPT_Type *base, gpt_status_flag_t flags)
  • GPT1
  • kGPT_OutputCompare1Flag。

3.8 最终代码

gpt_config_t gpt1_onfig;
	
//初始化GPTIMER1,时钟源为perclk_clk_root=75MHz
//pre:分频值,0~4096
//comcount:比较计数值,0~0xFFFFFFFF
//当ocrx==CNT时,产生中断.
//定时时间=ocrx*(psc+1)/PERCLK_CLK_ROOT
void GPT1_Int_Init(u16 psc,u32 ocrx)
{
	GPT_GetDefaultConfig(&gpt1_onfig);	//先初始化GPT1为默认值
	gpt1_onfig.clockSource=kGPT_ClockSource_Periph;	//初始化时钟源perclk_clk_root
	gpt1_onfig.divider=psc;	        //设置分频值
	GPT_Init(GPT1,&gpt1_onfig);
	
	GPT_SetOutputCompareValue(GPT1,kGPT_OutputCompare_Channel1,ocrx);	    //设置比较计数值
	GPT_EnableInterrupts(GPT1,kGPT_OutputCompare1InterruptEnable);			//使能GPT比较通道1中断
	RT1052_NVIC_SetPriority(GPT1_IRQn,5,0);									//抢占优先级5,子优先级0
	EnableIRQ(GPT1_IRQn);	//使能GPT1中断
	GPT_StartTimer(GPT1);	//开始定时器	
}


//GPT1中断服务函数
void GPT1_IRQHandler(void) 
{
    //OCR1中断
    if(GPT_GetStatusFlags(GPT1,kGPT_OutputCompare1Flag))
    {
        LED1_Toggle;			//LED1灯翻转
        GPT_ClearStatusFlags(GPT1,kGPT_OutputCompare1Flag);//清除中断标志位
    }
	__DSB();				//数据同步屏蔽指令
}

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

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

相关文章

10-矩阵(matrix)_方阵_对称阵_单位阵_对角阵

矩阵及其运算 [ a 11 ⋯ a 1 n ⋯ ⋯ ⋯ a m 1 ⋯ a m n ] \begin{bmatrix} a_{11} & \cdots & a_{1n} \\ \cdots & \cdots & \cdots \\ a_{m1} & \cdots & a_{mn} \\ \end{bmatrix} ​a11​⋯am1​​⋯⋯⋯​a1n​⋯amn​​ ​ 矩阵就是二维数组&…

【Golang 接口自动化02】使用标准库net/http发送Post请求

目录 写在前面 发送Post请求 示例代码 源码分析 Post请求参数解析 响应数据解析 验证 发送Json/XMl Json请求示例代码 xml请求示例代码 总结 资料获取方法 写在前面 上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单…

华为OD机试真题 Java 实现【输出指定字母在字符串的中的索引】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述说明: 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&#x…

四年前没做成的跑腿代驾平台,四年后再做也许就成了

​几年前新零售概念大火,不止是传统门店商家蠢蠢欲动,很多传统行业都在试图搭上互联网的快车,在传统实体中脱颖而出。当时炒的最热的除了社区团购、智慧门店就是同城跑腿、搬家、拉货、代驾代买这类服务型了。 社区团购几乎是各家杀的头破血流…

Zabbix分布式监控快速入门

目录 1 Zabbix简介1.1 软件架构1.2 版本选择1.3 功能特性 2 安装与部署2.1 时间同步需求2.2 下载仓库官方源2.3 Zabbix-Server服务端的安装2.3.1 安装MySQL2.3.1.1 创建Zabbix数据库2.3.1.2 导入Zabbix库的数据文件 2.3.2 配置zabbix_server.conf2.3.3 开启Zabbix-Server服务2.…

Day47 算法记录|动态规划14子序列

子序列 1143. 最长公共子序列1035.不相交的线53. 最大子数组和 1143. 最长公共子序列 这道题和718. 最长重复子数组的区别:这道题的子序列可以不连续 这个视频讲解的很好 class Solution {public int longestCommonSubsequence(String text1, String text2) {char…

打开域名跳转其他网站,官网被黑解决方案(Linux)

某天打开网站,发现进入首页,马上挑战到其他赌博网站。 事不宜迟,不能让客户发现,得马上解决 我的网站跳转到这个域名了 例如网站跳转到 k77.cc 就在你们部署的代码的当前文件夹下面,执行下如下命令 find -type …

SQL-每日一题【1075. 项目员工 I】

题目 项目表 Project: 员工表 Employee: 请写一个 SQL 语句,查询每一个项目中员工的 平均 工作年限,精确到小数点后两位。 查询结果的格式如下: 解题思路 前置知识 AVG 函数 定义和用法: AVG 函数返回数…

基于ARM+FPGA (STM32+ Cyclone 4)的滚动轴承状态监测系统

状态监测系统能够在故障早期及时发现机械设备的异常状态,避免故障的 进一步恶化造成不必要的损失,滚动轴承是机械设备的易损部件,本文对以滚动 轴承为研究对象的状态监测系统展开研究。现有的监测技术多采用定时上传监 测数据,…

【Spring AOP + 自定义注解 + 数据源 实现主从库切换读写分离】—— 案例实战

💧 S p r i n g A O P 主从数据源切换 读写分离 自定义注解案例实战! \color{#FF1493}{Spring AOP 主从数据源切换 读写分离 自定义注解 案例实战!} SpringAOP主从数据源切换读写分离自定义注解案例实战!💧 …

提升开发效率,Lombok的链式编程和构建模式

目录 链式编程 定义 代码示例 ​编辑 Accessors(chaintrue) 开启链式编程 ​编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 ​编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 ​编辑 With 定义 代码示例 链式编程 定义 链…

SQL-每日一题【1070. 产品销售分析 III】

题目 销售表 Sales: 产品表 Product: 编写一个 SQL 查询,选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示: 示例 1: 解题思路 前置知…

永恒之蓝复现(ms17-010)

目录标题 一、漏洞原理二、影响版本三、永恒之蓝复现复现环境复现过程1.主机发现 2.使用MSF的永恒之蓝漏洞模块3.使用ms17-010扫描模块,对win7进行扫描4.使用ms17-010攻击模块,对win7进行攻击5.得到win7权限6.通过shell对win7进行控制 一、漏洞原理 永恒…

第101章#远程调试西门子PLC(明牛智能网关)入门

一、下载明牛网站上的MNConfig(用于配置MNGate系列产品)。 二、注册账号。 三、用注册的账号登录MNConfig 四、在左侧BOX列表中,点击BOX列表—右键—添加BOX 五、选择联网方式,一般都是用的4G。 可以用自己的手机卡进行测试。 1、插入4G卡&am…

【Docker 那些事儿】如何安全地进入到容器内部

文章目录 🌟 前言1. 容器运行🍇 自动重启的容器🍇 自定义名称的容器🍇 开启端口的容器🍇 与宿主机共享目录的容器 2. 进入容器2.1 容器的三种状态🍑 运行状态🍑 暂停状态🍑 终止状态…

操作系统4

文件管理 文件的逻辑结构 文件的目录 文件的物理结构 文件存储空间管理 文件的基本操作

stm32内存杂记

从上图中可以看出SRAM空间用来存放:1.各个文件中声明和定义的全局变量、静态数据和常量;2.未初始化的全局变量;3.HEAP区;4.STACK区 这是在.map文件中,双击工程target打开 堆栈是处于以0x2000xx地址处的 EQU伪代码&…

跟着《代码随想录》刷题(七)——回溯算法

7.1 组合问题 77、组合 LeetCode&#xff1a;77、组合 &#xff08;1&#xff09;未剪枝优化 class Solution { private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, i…

SMB协议简单免费搭建个人winNAS

SMB协议&#xff0c;让PC变身小型winNAS&#xff0c;简单免费搭建个人winNAS 打开SMB服务设置共享文件夹远程连接 SMB 的优点之一是兼容性好&#xff0c;在各平台获得了广泛支持&#xff0c;包括 Windows、Linux、macOS 等各系统挂载访问都很方便。另外 SMB 也是各种电视、电视…

Arcgis通过模型构建器计算几何坐标

模型 模型中&#xff0c;先添加字段&#xff0c;再计算字段 计算字段 模型的计算字段中&#xff0c;表达式是类似这样写的&#xff0c;其中Xmin表示X坐标&#xff0c;Ymin表示Y坐标 !Shape.extent.Xmin!