stm32cubemx HAL库之定时器

article/2025/10/5 10:37:13

定时器原理简单说明:
在这里插入图片描述
如上图所示,定时器存在3个寄存器,分别是:
计数器寄存器(CNT)
预分频器寄存器(PSC)
自动重载寄存器(ARR)

预分频寄存器的输入频率是时钟树配置的频率,比如输入频率是60MHz,设置预分频器寄存器的值为600-1,则预分频器寄存器输出的频率60MHz/(600-1)=100KHz。

计数器寄存器的输入频率是经过预分频器寄存器分频后的频率。比如输入频率是100KHz,则计数器寄存器每经过(1/100KHz)s计数一次,可以是递增计数也可以是递减计数。如果是递增计数,则当递增到自动重载寄存器所设置的值时,计数器寄存器就会重新清0,再重新计数。

一、定时器中断

1、选择内部时钟

在这里插入图片描述

2、设置预分频寄存器PSC值和自动重载寄存器ARR的值

在这里插入图片描述
这里PSC为60-1,ARR为1000-1,则每隔1/(60MHz/(60-1)/(1000-1))=1ms中断一次

3、设置中断

在这里插入图片描述

4、使能中断

HAL_TIM_BASE_START_IT(&htim3);

5、重写中断回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim->Instance==TIM1){HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);//这里的代码根据项目自行修改}
}
/* USER CODE END 4 */

二、定时器PWM输出

1、PWM周期设置

PWM周期的设置和定时器中断周期设置一样,上面我们设置了定时器的中断周期为1ms,如按上面设置PSC和ARR,则PWM周期也为1ms。

2、设置PWM占空比(即高电平所占时间/周期)

设置占空比有两种方法:cubemx设置,代码实现

2.1 cubemx设置

在这里插入图片描述
通过cubemx设置pulse值。pulse的取值范围大于0小于等于ARR的值,比如上图的pulse值设置为500,则占空比为(500/1000)=50%。pulse的值其实就是比较寄存器CCRx的值。
在这里插入图片描述
如上图所示,当CCRx=4且计数器寄存器小于4时,OCXREF输出高电平,从这里我们可以知道为什么CCRx的值最大为ARR,若CCRx的值大于ARR,则计数器寄存器的值永远小于CCRx,则定时器一直输出高电平。高电平所占时间也可以这样计算:pulse乘于(预分频器输出频率的倒数),因为计数器是每隔 (预分频器输出频率的倒数) 秒计数的。

2.2代码设置PWM占空比

__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,500);//设置TIM2时钟通道2pwm输出的pulse值为500

3、使能PWM输出

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

三、定时器输入捕获

1、选择Input Capture direct mode

在这里插入图片描述

2、设置PSC的值

在这里插入图片描述这里建议设置为(60MHz/6)=10MHz。

3、设置为上升沿捕获

在这里插入图片描述

3、设置中断

在这里插入图片描述

4、使能捕获中断

HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1);/使能定时器4通道一捕获

5、输入捕获测PWM的周期,高电平所占时间,占空比

系统时钟频率为60MHz,PSC为6-1,则计数器寄存器CNT每隔1/(60MHz/(6-1))秒计数一次。这里的PWM和输入捕获的各种数据按照上文配置。

while循环里的代码

while(1){switch(capture_cnt){case 0:capture_cnt++;__HAL_TIM_SET_CAPTUREPOLARITY(&htim4,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);//设置为高电平捕获HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_1);使能捕获中断break;case 4:pwm_cycle=capture_buf[2]-capture_buf[0];printf("Cycle:%.4fms\r\n",pwm_cycle/10000.0); //此处的printf已重定向到串口high_time=capture_buf[1]-capture_buf[0];printf("high_time:%.4fms\r\n",high_time/10000.0);duty = (high_time/10000.0)/(pwm_cycle/10000.0);printf("duty:%.2f%%\r\n",duty*100);HAL_Delay(1000);capture_cnt=0;break;}
}

捕获中断函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){if(htim->Instance==TIM4){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){switch(capture_cnt){case 1:capture_buf[0]=__HAL_TIM_GET_COMPARE(htim,	TIM_CHANNEL_1);//获取计数器CNT的值__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);capture_cnt++;break;case 2:capture_buf[1]=__HAL_TIM_GET_COMPARE(htim,	TIM_CHANNEL_1);__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);capture_cnt++;break;case 3:capture_buf[2]=__HAL_TIM_GET_COMPARE(htim,	TIM_CHANNEL_1);HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_1);//停止中断capture_cnt++;break;default:break;}}}
}

运行后得到如下结果
在这里插入图片描述
从上文可以看出,所输出的周期为1ms,高电平所占时间为0.5ms,占空比为50%,与上文的PWM输出的配置一样。

测量基本思路是:
1.设置TIM4 CH1为输入捕获功能;
2.设置上升沿捕获;
3.使能TIM4 CH1捕获功能;
4.捕获到上升沿后,将此时计数器寄存器的值存入capture_ buf[0] ,改为捕获上升沿;
5.捕获到下降沿后,将此时计数器寄存器的值存入capture
buf[1] ,改为捕获上升沿;
6.捕获到上升沿后,将此时计数器寄存器的值存入capture_ buf[2] ,关闭TIM4 CH1捕获功能;
7.计算: 由于计数器寄存器每隔1/(60MHz/(6-1))秒计数一次,故周期为【(capture
buf[2] - capture_ buf[0])乘于(1/(60MHz/(6-1))】秒,高电平所占时间为【(capture_ buf[1] - capture_ buf[0])乘于(1/(60MHz/(6-1))】秒。


http://chatgpt.dhexx.cn/article/g7OPyvKi.shtml

相关文章

CRC详解

CRC-知识解析 cyclic redundancy check 写在前面的话: 之前在做学校项目的时候用到了CRC 原理,但在网上查找的过程中,发现讲解CRC知识的资源很多,但是对新手比较友好的、讲的十分清楚的又很少,很多博主也不求甚解&am…

CCR(Condition Code Register:条件代码寄存器)的作用

CCR是一个显示执行指令后的结果和处理器的状态的8位寄存器。根据微型计算机的不同,名称也会不同,但是所有的微型计算机都有。在大多数微型计算机的情况下,用户不能直接读写,但有些微型计算机可以读写。您可以通过执行可以测试CCR位…

STM32定时器的预装寄存器及影子寄存器PSC—ARR-CCRx

在谈预装寄存器及影子寄存器的差别前,不妨先对STM32定时器的时基单元做个基本了解。STM32各系列的定时器结构和框架基本是一样的,时基单元也一样。 下面时基单元是以STM32F3系列为参考。 时基单元中的TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIM…

输出比较功能中的pwm以及其他功能的区分

首先我们要知道的是pwm是输出比较的子集 PWM模式下: ARR 决定输出频率 ,CCR决定输出占空比 输出比较模式下: ARR 决定输出频率 CCRx 决定每个通道的初始相位。 一般使用输出比较都是想要去输出一个频率可变的pwm信号,那怎么通过…

STM32 PWM输出

STM32 PWM输出 工作过程&#xff1a; 我们假定定时器工作在向上计数PWM 模式&#xff0c;且当 CNT<CCRx 时&#xff0c;输出 0&#xff0c;当 CNT>CCRx 时输出1。那么就可以得到如上的PWM 示意图&#xff1a; 当 CNT 值小于 CCRx 的时候&#xff0c;IO 输出低电平(0)&a…

简单明了的说明STM32的PWM原理以及实现方法

申明以下都是个人理解&#xff0c;仅供参考。如果错误欢迎指教。本文不讲底层&#xff0c;根据实际使用来逆向讲解。 1.什么是pwm&#xff1f; pwm最简单的理解就是“功率”&#xff0c;调节PWM的占空比就是调节功率。 2.如何调节占空比&#xff1f; 图1 根据图1很容易看出…

CCRX寄存器

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);// TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形&#xff0c;条件是未使用预装载寄存器(OCxPE’0’&#xff0c;否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable 就是为了…

JavaScript权威指南 第13章 异步JavaScript

JavaScript权威指南 第13章 异步JavaScript 13章 异步JavaScript13.1 使用回调的异步编程13.1.1 定时器13.1.2 事件13.1.3 网络事件13.1.4 Node中的回调与事件 13.2 期约13.2.1 使用期约使用期约处理错误 13.2.2 期约链13.2.2 解决期约13.2.4 再谈期约和错误catch和finally方法…

javascript权威指南(第四版)

Java Script是一种功能强大的基于对象的脚本语言。Java Script程序可以直接嵌入HTML页面。与Web浏览器定义的文档对象模型(DOM)一起使用时&#xff0c;JavaScript可以创建动态HTML(DHTML)内容&#xff0c;允许用户与客户端的Web应用程序交互。 JavaScript语法以流行的程序设计语…

《JavaScript权威指南》学习笔记(一)

跟着《JavaScript权威指南》整理的一些知识点和自己的小拓展。有不足之处请指正。 1、try catch 防止程序异常直接报错退出&#xff0c;而是能对异常进行一些处理&#xff0c;具体处理就在catch中。最好是在最外层函数使用。 2、HTML不区分大小写、XHTML区分大小写、JavaScri…

《javascript权威指南》精读笔记-持续更新

《javascript权威指南》 作用域链 表达式 原始表达式 对象和数组的初始化表达式 函数定义表达式 函数直接量 属性访问表达式 调用表达式 对象创建表达式 运算符 表达式计算 var function for in with debugger use strict 对象 创建对象 属性的查询和设置 作为关联数组的对象 继…

JavaScript权威指南(第6版)

JavaScript权威指南&#xff08;第6版&#xff09; JavaScript权威指南 第6版&#xff08;影印版&#xff09;上册 Beginning iOS Programming, 2014年 Gradle for Android (2016年3月 Finished)

JavaScript权威指南 第11章JavaScript标准库

JavaScript权威指南 第11章JavaScript标准库 第11章 JavaScript标准库11.1 集合与映射11.1.1 Set类11.1.2 Map类11.1.3 WeakMap和WeakSet 11.2 定型数组与二进制数据11.2.1 定型数组的类型11.2.2 创建定型数组11.2.3 使用定型数组11.2.4 定型数组的方法与属性11.2.5 DateView与…

JavaScript 权威指南-学习笔记(一)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!JavaScript 权威指南-学习笔记 JavaScript是一门高级、动态、解释型变成语言,非常适合面向对象和函数式编…

JavaScript权威指南笔记-masaikk

JavaScript权威指南笔记-马赛柯柯 源代码位于masaikk/interviewAccess - Gitee.com 前五章笔记略 第六章 对象 防止某个对象被第三方库意外修改&#xff0c;建议使用Object.create()方法 ★ \bigstar ★ let o {foo: bar}; library.func(Object.create(o))解释Object.crea…

【JavaScript权威指南(第七版)】之阅读学习总结

写在前面 最近借着空闲时间断断续续两个月看完了《JavaScript权威指南(第七版)》&#xff0c;《JavaScript权威指南》一直以来被称为“犀牛书”&#xff0c;前面的第六版我大概略过一遍&#xff0c;由于书的厚度实在有点“厚重”&#xff0c;将近1000多页左右&#xff0c;有一些…

JavaScript权威指南(原书第7版) 犀牛书

第3章 语法结构 3.10.1 使用let和const声明 ES6后&#xff0c;变量通过let关键字声明 let i let sum可以使用一条let语句声明多个变量 let i, sum声明变量的同时&#xff0c;&#xff08;如果可能&#xff09;也为其赋予一个初始值 let message hello let i 0, j 1let …

JavaScript权威指南-总结

章2 词法结构 1.什么是字面量&#xff0c;标识符&#xff0c;保留字&#xff1f; 字面量即程序中的数据的值&#xff1b;标识符指数据的名字&#xff08;字母、下划线_或美元符号$开头&#xff0c;为了和数值区分开&#xff0c;标识符不能用数字开头&#xff0c;&#xff09;…

javascript 权威指南笔记

1.如果没有用var语句给一个变量指初始值&#xff0c;那么虽然这个变量被声明了&#xff0c;但是在给它存一个值之前&#xff0c;它的初始值就是 undefined 2.使用var语句多次声明一个变量不仅是合法的&#xff0c;而且也不会造成任何错误。如果重复的声明有一个初始值&#xf…

【WCF】使用WCF测试客户端

【是什么】 WCF测试客户端&#xff08;WCF Test Client&#xff09;是一个用来测试WCF服务程序的调试工具&#xff0c;能够使开发WCF服务更加方便。 【打开方法】 有四种打开方式 1、找到Vs的安装路径&#xff0c;找到Common7\IDE\WcfTestClient.exe&#xff0c;双击打开。如…