RT1052 的四定时器

news2024/10/6 14:33:47

文章目录

  • 1 Quad Timer,简称:QTMR
  • 2 单个通道的框图
  • 3 QTMR配置
    • 3.1 QTMR1 时钟使能。
    • 3.2 初始化 QTMR1。
      • 3.2.1 QTMR_Init
    • 3.3 设置 QTMR1 通道 0 的定时周期。
      • 3.3.1QTMR_SetTimerPeriod
    • 3.4 使能 QTMR1 通道 0 的比较中断。
      • 3.4.1 QTMR_EnableInterrupts
    • 3.5 开启 QTMR 。
    • 3.5.1 QTMR_StartTimer
    • 3.6 使能 QTMR1 中 断并设置优先级。 。
    • 3.7编写中断服务函数。
      • 3.7.1 QTMR_GetStatus
      • 3.7.2 QTMR_ClearStatusFlags

1 Quad Timer,简称:QTMR

RT1052 内部集成了 4 个 QTMR 定时器,每个 QTMR 定时器又有 4 个通道.
每个通道都有独立的:

  • 1 个 16 位计数器、
  • 1 个预分频器、
  • 1 个加载值寄存器、
  • 1 个捕获寄存器、
  • 2 个比较寄存器、
  • 两个状态寄存器
  • 1 个控制寄存器等

完全就是一个独立定时器的功能。
可以将QTMR 看成是一个拥有 4*4 个定时器的集合,这样光 QTMR 就拥有 16 个定时器之多

2 单个通道的框图

在这里插入图片描述RT1052 内部有 16 个这样的通道!
RT1052 四定时器每个通道的功能包括:
1)16 位计数器(CNTR),支持向上/下计数。
2)可级联,组成 32/48/64 位计数器。
3)独立分频器(支持:1/2/4/8/16/32/64/128 分频)。
4)支持输出比较和输入捕获功能。
5)支持多种工作模式(14 种)。
6)支持输入滤波器(输入捕获时用)。
7)最大计数频率可达 150Mhz。
8)支持单次计数/连续计数。
9)比较寄存器具有预装载功能。
10)4 个通道可以同时开启计数(同步启动)。
四定时器单个通道的工作模式非常多(14 种),具体某个模式的使用方法请参考《RT1050参考手册》第 47.6.5 节。

3 QTMR配置

QTMR 相关的库函数在 fsl_qtmr.c 和 fsl_qtmr.h 这两个文件中
我们使用 QTMR1 的通道 0 产生中断

3.1 QTMR1 时钟使能。

使用函数 CLOCK_EnableClock 使能 QTMR1 时钟,使用方法如下:

CLOCK_EnableClock(kCLOCK_Timer1)

此函数会被 Q TMR 定时器初始化函数 QTMR_Init 调用,所以不需要我们显示的调用。

3.2 初始化 QTMR1。

使用函数 QTMR_Init 来初始化 QTMR,此函数原型如下:

3.2.1 QTMR_Init

void QTMR_Init(TMR_Type * base,qtmr_channel_selection_t channel,const qtmr_config_t * config)

qtmr_config_t qtimer1_config;
QTMR_GetDefaultConfig(&qtimer1_config); //先设置为默认配置
qtimer1_config.primarySource= kQTMR_ClockDivide_128; //设置第一时钟源
QTMR_Init(TMR1, kQTMR_Channel_0, &qtimer1_config); //初始化 QTIMER
  • 第一个参数指定初始化哪个 QTMR,可以选择:TMR1、TMR2、TMR3 和 TMR4
  • 第二个参数选择使用哪个通道,可选择的通道如下:
typedef enum _qtmr_channel_selection
{
		kQTMR_Channel_0 = 0U, //QTMR 通道 0
		kQTMR_Channel_1, //QTMR 通道 1
		kQTMR_Channel_2, //QTMR 通道 2
		kQTMR_Channel_3, //QTMR 通道 3
} qtmr_channel_selection_t;
  • 第三个参数为指向结构体 qtmr_config_t 的指针
typedef struct _qtmr_config
{
	qtmr_primary_count_source_t primarySource; //指定第一时钟源
	qtmr_input_source_t secondarySource; //指定第二时钟源
	bool enableMasterMode;
	bool enableExternalForce;
	uint8_t faultFilterCount;
	uint8_t faultFilterPeriod;
	qtmr_debug_action_t debugMode;
} qtmr_config_t;

这个结构体最常用的就是前两个成员变量

  • 第一时钟源可选设置如下:
typedef enum _qtmr_primary_count_source
{
	kQTMR_ClockCounter0InputPin = 0,
	kQTMR_ClockCounter1InputPin,
	kQTMR_ClockCounter2InputPin,
	kQTMR_ClockCounter3InputPin,
	kQTMR_ClockCounter0Output,
	kQTMR_ClockCounter1Output,
	kQTMR_ClockCounter2Output,
	kQTMR_ClockCounter3Output,
	kQTMR_ClockDivide_1, //IPG 总线时钟 1 分频
	kQTMR_ClockDivide_2, // IPG 总线时钟 2 分频
	kQTMR_ClockDivide_4, // IPG 总线时钟 4 分频
	kQTMR_ClockDivide_8, // IPG 总线时钟 8 分频
	kQTMR_ClockDivide_16, //IPG 总线时钟 16 分频
	kQTMR_ClockDivide_32, // IPG 总线时钟 32 分频
	kQTMR_ClockDivide_64, // IPG 总线时钟 64 分频
	kQTMR_ClockDivide_128 // IPG 总线时钟 128 分频
} qtmr_primary_count_source_t;

第一时钟源为 IPG_CLK_ROOT 的 128 分频,也就是设置为 kQTMR_ClockDivide_128。
第二时钟源的选择类似。

3.3 设置 QTMR1 通道 0 的定时周期。

QTMR1 通道 0 的定时周期通过函数 QTMR_SetTimerPeriod 来设置

3.3.1QTMR_SetTimerPeriod

此函数原型如下:

void QTMR_SetTimerPeriod(TMR_Type *base, qtmr_channel_selection_t channel, uint16_t ticks)
  • 第一个参数指定要设置的 QTMR,这里为 TMR1。
  • 第二个参数指定要设置的通道,这里是通道 0 所以应该设置为 kQTMR_Channel_0。
  • 第三个参数设置匹配比较值,此值就是用来决定定时器溢出时间的。
    • QTMR 的计数方向是可以修改的
    • 当 CTRL 寄存器的 DIR 位为 0 的时候就是向上计数器
    • 当 DIR 位为 1 的时候就是向下计数器,默认是向上计数器。

3.4 使能 QTMR1 通道 0 的比较中断。

使用函数 QTMR_EnableInterrupts 来使能 QTMR1 通道 0 的比较中断,这样当定时器计数值(CNTR0)达到我们设置的匹配比较值的时候就会产生相应中断

3.4.1 QTMR_EnableInterrupts

此函数原型如下:

void QTMR_EnableInterrupts(TMR_Type * base,qtmr_channel_selection_t channel,uint32_t mask)
  • 第一个参数指定要操作的 QTMR,这里为 TMR1。
  • 第二个参数指定要使用的通道,这里是通道 0,即 kQTMR_Channel_0。
  • 第三个参数是要开启的中断类型
typedef enum _qtmr_interrupt_enable
{
	kQTMR_CompareInterruptEnable = (1U << 0), //比较中断
	kQTMR_Compare1InterruptEnable = (1U << 1), //比较 1 中断
	kQTMR_Compare2InterruptEnable = (1U << 2), //比较 2 中断
	kQTMR_OverflowInterruptEnable = (1U << 3), //溢出中断
	kQTMR_EdgeInterruptEnable = (1U << 4) //输入边沿检测中断
} qtmr_interrupt_enable_t;

我们要使能的是匹配比较中断,因此选择 kQTMR_CompareInterruptEnable。

3.5 开启 QTMR 。

在相关的配置完成以后,就可以使能 QTMR 了,使用函数 QTMR_StartTimer 来开启 QTMR定时器

3.5.1 QTMR_StartTimer

此函数原型如下:

static inline void QTMR_StartTimer(TMR_Type * base,qtmr_channel_selection_t channel,qtmr_counting_mode_t clockSource)

第三个参数用来设置定时器的计数模式,是上升沿计数还是下降沿计数、双边沿模式。

typedef enum _qtmr_counting_mode
{
	kQTMR_NoOperation = 0,
	kQTMR_PriSrcRiseEdge,
	kQTMR_PriSrcRiseAndFallEdge,
	kQTMR_PriSrcRiseEdgeSecInpHigh,
	kQTMR_QuadCountMode,
	kQTMR_PriSrcRiseEdgeSecDir,
	kQTMR_SecSrcTrigPriCnt,
	kQTMR_CascadeCount
} qtmr_counting_mode_t;

这个参数设置的就是寄存器 CTRL0 的 CM 位,本例程中我们选择 kQTMR_PriSrcRiseEdge,也就是第一时钟源上升沿计数模式。

3.6 使能 QTMR1 中 断并设置优先级。 。

在定时器配置完了之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,以使能QTMR1 的相关中断,设置方法如下:

RT1052_NVIC_SetPriority(TMR1_IRQn,6,0); //抢占优先级 6,子优先级 0
EnableIRQ(TMR1_IRQn); //是能 TMR1 中断

3.7编写中断服务函数。

通过函数 QTMR_GetStatus 来获取中断状态,判断此次产生的中断来自哪个通道
调用函数 QTMR_ClearStatusFlags 来清除相应的中断标志位。

3.7.1 QTMR_GetStatus

中断状态获取函数 QTMR_GetStatus 原型如下:

uint32_t QTMR_GetStatus(TMR_Type *base, qtmr_channel_selection_t channel)
  • 第一个参数是要获取的定时器,这里为 TMR1
  • 第二参数就要获取的通道,这里为kQTMR_Channel_0

其实就是读取寄存器 SCTRL0 的值

3.7.2 QTMR_ClearStatusFlags

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

void QTMR_ClearStatusFlags(TMR_Type * base,
qtmr_channel_selection_t channel,
uint32_t mask)

最后一个参数指定要清除的中断类型(中断标志位)

typedef enum _qtmr_status_flags
{
	kQTMR_CompareFlag = (1U << 0), //比较标志位
	kQTMR_Compare1Flag = (1U << 1), //比较 1 标志位
	kQTMR_Compare2Flag = (1U << 2), //比较 2 标志位
	kQTMR_OverflowFlag = (1U << 3), //溢出标志位
	kQTMR_EdgeFlag = (1U << 4) //输入边沿检测标志位
} qtmr_status_flags_t;

这里要清除的即使比较标志位,所以选择kQTMR_CompareFlag

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

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

相关文章

14. Spring AOP 的组成和实现

目录 1. Spring AOP 简介 2. AOP 的组成 2.1 切面&#xff08;Aspect&#xff09; 2.2 连接点&#xff08;Join Point&#xff09; 2.3 切点&#xff08;Pointcut&#xff09; 2.4 通知&#xff08;Advice&#xff09; 3. Spring AOP的实现 3.1 新建项目 3.2 添加 AOP …

Zebec Card 将在亚洲、拉美等地区推出,生态全球化加速

随着以Visa、特斯拉、BNY Mellon、BlackRock、Mastercard、Gucci等为代表的传统商业机构巨头&#xff0c;以及萨尔瓦多、中非共和国等为代表的国家不断的向加密货币领域布局&#xff0c;越来越多的投资者开始以新的眼光来看待加密货币&#xff0c;仅在2022年&#xff0c;加密货…

1400*B. I Hate 1111(思维+数学)

Example input 3 33 144 69 output YES YES NO 题意&#xff1a; 问一个数字是否可以由 11&#xff0c;111&#xff0c;1111&#xff0c;11111...... 任意倍数加和所得。 解析&#xff1a; 可以观察到 1111%110&#xff0c;11111%1110&#xff0c;而后面更大的11111111…

C++部署学习

gcc -E src/main.c -o src/main.i gcc -S src/main.c -o src/main.s gcc -C src/main.c -o src/main.o gcc src/main.c -o exec ./exec

Vue2第八节 收集表单数据

&#xff08;1&#xff09;文本类型/密码类型 v-model收集的是value值 用户输入的就是value值 <input type"text" v-model"usrInfo.account"> <input type"password" v-model"usrInfo.password"> &#xff08;2&#xf…

Java程序逻辑控制的几个小练习(熟悉一下Java的语法)

虽然都是一些很简单的题目&#xff0c;但是都是很经典的编程题&#xff0c;多写几道可以熟悉一些Java代码&#xff0c; 之前C语言敲多了一时半会有点不适应&#xff0c;敲起来怪怪的&#xff0c;感觉手不是自己的了哈哈 目录 1. 根据年龄, 来打印出当前年龄的人是少年(低于18)…

多臂治疗规则的 Qini 曲线(Stefan Wager)

英文题目&#xff1a; Qini Curves for Multi-Armed Treatment Rules 中文题目&#xff1a;多臂治疗规则的 Qini 曲线 单位&#xff1a;Stefan Wager 论文链接&#xff1a; 代码&#xff1a;GitHub - grf-labs/maq: Treatment rule evaluation via the multi-armed Qini …

软件测试面试【证券项目公司】

这家公司是做证券项目的&#xff0c;约的9点钟&#xff0c;路程还是有点遥远&#xff0c;转了一趟公交两趟地铁&#xff0c;精力都花在了路上&#xff0c;感觉有点累&#xff0c;以下是今天得面试流程。 到公司前台给我了一张面试表&#xff0c;写完之后就是等待面试。一共面试…

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…

TMS XData v5.11 2023 crack,全功能查询机制

TMS XData v5.11 2023 crack,全功能查询机制 用于多层REST/JON-HTTP/HTTPS应用服务器开发和ORM远程处理的Delphi框架。 功能概述 基于REST/JONS架构风格的服务器 从不同的客户端平台(如.NET、Java、jаvascript)轻松访问&#xff0c;因为它是基于REST/JSON的 使用标准POST、GET…

【RabbitMQ】golang客户端教程2——工作队列

任务队列/工作队列 在上一个教程中&#xff0c;我们编写程序从命名的队列发送和接收消息。在这一节中&#xff0c;我们将创建一个工作队列&#xff0c;该队列将用于在多个工人之间分配耗时的任务。 工作队列&#xff08;又称任务队列&#xff09;的主要思想是避免立即执行某些…

[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联

上一节讲解了后台Rbac微服务角色增删改查微服务,这里讲解权限管理Rbac微服务管理员的增删改查微服务以及管理员和角色关联微服务功能 一.实现后台权限管理Rbac之管理员增删改查微服务服务端功能 1.创建Manager模型 要实现管理员的增删改查,就需要创建对应的模型,故在server/r…

使用Beego和MySQL实现帖子和评论的应用,并进行接口测试(附源码和代码深度剖析)

文章目录 小项目介绍源码分析main.gorouter.gomodels/user.gomodels/Post.gomodels/comment.gocontrollers/post.gocontrollers/comment.go 接口测试测试增加帖子测试查看帖子测试增加评论测试查看评论 小项目介绍 经过对需求的分析&#xff0c;我增加了一些额外的东西&#x…

Linux学习之脚本优先级控制

fork炸弹 在编写Shell脚本时不要写出不可控的死循环&#xff0c;比如func() { func | func& } ; func&#xff0c;简写版为.(){ .|.& };.。接下来见证一下这两条语句的威力。因为在root用户下许多资源没有限制&#xff0c;所以useradd userfork新建一个用户userfork&a…

fwrite函数

1、函数声明 size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 2、参数说明 buffer 指向要写入的数据的指针。 size 项大小&#xff08;以字节为单位&#xff09;。 count 要写入的项的最大数量。 stream 指向 FILE 结构的指针。 3、…

OpenCloudOS 与PolarDB全面适配

近日&#xff0c;OpenCloudOS 开源社区签署阿里巴巴开源 CLA (Contribution License Agreement, 贡献许可协议), 正式与阿里云 PolarDB 开源数据库社区牵手&#xff0c;并展开 OpenCloudOS &#xff08;V8&#xff09;与阿里云开源云原生数据库 PolarDB 分布式版、开源云原生数…

AD21原理图的高级应用(四)线束的设计及应用

&#xff08;四&#xff09;线束的设计及应用 Altium Designer 21 可以使用 Signal Harnesses(信号线束)的方法来建立元件之间的连接,也可用于不同原理图间的信号对接。信号线束是一种抽象连接,操作方式类似于总线,但信号线束可对包括总线、导线和其他信号线束在内的不同信号进…

el-button增加下载功能

vue3和element-plus <el-uploadv-model:file-list="fileList"action="/api/upload"multiple:limit="1":headers="headers" ><el-button type="primary">选择文件</el-button><template #file

【前缀和】560.和为 K 的子数组

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 和为K的子数组 题目:示例:题解&#xff1a;解法一:解法二: 题目: 示例: 题解&#xff1a; 解法一: 暴力解法:我们很容易想到通过两个for循环去遍…

【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…