STM32通用定时器

本文实践:实现通过TIM14_CH1输出PWM,外部显示为呼吸灯。 

通用定时器简介

拥有TIM2~TIM5、TIM9~TIM14 一共10个定时器,具有4路独立通道,可用于输入捕获、输出比
较,同时包含了基本定时去的所有功能。

通用定时器的结构框图

主从模式触发

触发信号

概念:可以理解为某器件在接收到某个信号后,此信号可以触发本器件的一些功能。
在STM32中触发信号分为两大类:TRGI 和 TRGO,即触发输入信号和触发输出信号。
TRGO:定时器输出给其它定时器或外设的信号。可以理解为主模式触发信号。
TRGI : 可以理解为从外部引入到定时器中的信号。可以理解为从模式触发信号。 

触发输入信号

第⼀类:TI1F_ED/TI1FP1/TI2FP2,来自输⼊通道1或通道2的触发信号,连接到从模式控制器,从而控制计数器的工作。
第⼆类:来自外部触发脚[ETR]的信号经过处理后,连接到从模式控制器。
第三类:来自其他定时器的触发信号,通过内部线路连接到从模式控制器

从模式控制器

复位模式:当有效触发信号出现时,将会复位计数器,并产生更新事件。向上计数的将会复位到0,向下计数的将会复位到ARR的值。

门控模式:定时器根据触发输⼊信号的电平来启动或停止计数器的计数。

触发模式:当有效触发输⼊信号出现时,会将本来处于未使能状态的计数器使能激活,让计数器开始计数

外部时钟模式1: 由所选触发信号 (TRGI) 的上升沿提供计数器时钟。

小结

(1)不论来自本定时器外部的哪⼀类触发输入信号,它们有个共同特点,就是都要经过触发
输入选择器而连接到从模式控制器,从而使得计数器的工作受到从模式控制器的控制或影响。(2)从模式控制器可以对定时器作如下操控:对计数器复位、启动或停止计数动作、使能计数器、通过触发信号为计数器提供时钟源。

触发输出信号

触发输出信号是定时器自身产生的,它的产生途径如下:

1.定时器更新事件
2.定时器的输入捕获和输出比较事件
3.复位
4.使能
5.更新: 选择更新事件作为触发输出 (TRGO)。例如,主定时器可用作从定时器的预分频器。

时钟源选择

内部时钟(CK_INT):类似于基本定时器时钟。
外部时钟模式1:TIx
外部时钟模式2:ETR
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。

外部时钟模式1

外部时钟源信号 (来自于芯片外部)---> IO口 --->TIMx_CH1 /TIMx_CH2(外部模式1时钟源信号只能从CH1和 CH2输入定时器)

外部时钟模式2

外部时钟源信号 --->IO口 --->TIMx_ETR

内部输入触发

内部触发输⼊是使用一个定时器作为另一个定时器的预分频器,即实现定时器的级联。

如图示例:

 输出比较

捕获/比较寄存器

捕获比较寄存器也存在影子寄存器。当有上升沿到来时,IC1PS信号就会触发输入捕获事件发生器。计数器的值就会被锁存到捕获/比较影子寄存器里。 当 CCR1 寄存器没有被进行读操作的时候,捕获/比较影子寄存器里的值就会锁存到 CCR1 寄存。

输出模式选择寄存器

结构框图

工作原理

PWM模式1: 

向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平

向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平

PWM模式2:

向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平

向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平

示例如图(PWM模式1):

PWM简介

PWM(Pulse Width Modulation)脉冲宽度调制。控制⼀个周期中高低电平的比重。我们将高电平
占整个周期的比重称为占空比。脉冲宽度调制说到底就是调节占空比。

以上图中的PWM模式1举例:

当CNT值小于CCR时,IO输出高电平。当CNT值大于CCR时,IO输出低电平。当CNT和ARR的
值相等时,重新归零,然后重新向上计数,依次循环。
那么,改变CCR的值就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM的输出
频率。
PWM频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比:Duty = CCR/(ARR + 1)

开发步骤

第⼀步:查看原理图,找到TIM14的输出通道复用在哪个IO引脚上

第⼆步:开启时钟
TIM14的时钟 和 GPIOF的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //开启定时器的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//开启GPIOF的时钟

第三步:配置GPIOF
将GPIOF的Pin_9复⽤为TIM14的输出通道

第四步:初始化TIM14的时基单元,设置预分频值和重装值
TIM_TiMmeBaseInit();

第五步:使能ARR 和 CCR
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //使能比较/捕获预装载寄存器 CCR1
TIM_ARRPreloadConfig(TIM14,ENABLE); //ARR 使能

第六步:使能TIM
TIM_Cmd(TIM14,ENABLE);

第七步:实现PWM控制函数
通过TIM_SetCompare1();函数来改变RCC的值,达到调节PWM的效果。

代码如下:

#include "stm32f4xx.h"  // Device headerint main(void)
{/*开启定时器的时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); /*开启GPIOF的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);/*初始化GPIO结构体*/GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOF,&GPIO_InitStruct); GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //IO14口的复用/*初始化时基单元*/TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分割 输入捕获需要用到的TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeInitStruct.TIM_Period = 899;TIM_TimeInitStruct.TIM_Prescaler = 8399;TIM_TimeBaseInit(TIM14,&TIM_TimeInitStruct);/*初始化输出比较配置*/TIM_OCInitTypeDef TIM_OC1InitStruct;TIM_OC1InitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OC1InitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OC1InitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高 REF有效时输出高电平TIM_OC1Init(TIM14,&TIM_OC1InitStruct);/*使能比较/捕获预装载寄存器CCR1*/TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);/*ARR 使能*/TIM_ARRPreloadConfig(TIM14,ENABLE);/*定时器使能*/TIM_Cmd(TIM14,ENABLE); uint8_t i;while (1){for(i=0; i <= 200; i++){TIM_SetCompare1(TIM14,i);}for(i=0; i<= 200; i++){TIM_SetCompare1(TIM14,200-i);}}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux | 编程实践】防火墙 (网络无法访问)解决方案 Vim常用快捷键命令

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

字符串函数strlen的用法详解及其相关题目

strlne函数的使用 一.strlen函数的声明二.strlen函数的头文件三.相关题目代码1代码2题目1题目2题目3题目4题目5题目6 一.strlen函数的声明 size_t strlen ( const char * str );二.strlen函数的头文件 使用strlen函数我们需要使用以下头文件 #include <string.h>三.相…

景联文科技解读《2023人工智能基础数据服务产业发展白皮书》,助力解决数据标注挑战

前段时间&#xff0c;国家工业信息安全发展研究中心发布《2023人工智能基础数据服务产业发展白皮书》&#xff08;以下简称“白皮书”&#xff09;。 《白皮书》指出&#xff0c;2022年&#xff0c;中国人工智能基础数据服务产业的市场规模为45亿元&#xff0c;预计今年将达到5…

一篇解析context_switch进程切换(针对ARM体系架构)

一. 概述 在最近初学ebpf时&#xff0c;使用到了挂载点finish_task_switch统计内核线程的运行时间&#xff0c;遂进入内核源码对其进行学习分析。 finish_task_switch在context_switch被调用&#xff0c;其功能是完成进程切换的收尾工作&#xff0c;比如地址空间的清理。而co…

pycharm打断点调试

在PyCharm中使用断点调试可以帮助逐行执行代码并查看变量的值&#xff0c;以便更好地理解程序的执行过程。以下是在PyCharm中设置断点和使用调试功能的步骤和注意事项&#xff1a; 步骤&#xff1a; 打开PyCharm并打开要调试的项目。找到要设置断点的代码行。您可以在行号区…

大数据技术学习笔记(四)—— HDFS

目录 1 HDFS 概述1.1 HDFS 背景与定义1.2 HDFS 优缺点1.3 HDFS 组成架构1.4 HDFS 文件块大小 2 HDFS的shell操作2.1 上传2.2 下载2.3 HDFS直接操作 3 HDFS的客户端操作3.1 Windows 环境准备3.2 获取 HDFS 的客户端连接对象3.3 HDFS文件上传3.4 HDFS文件下载3.5 HDFS删除文件和目…

ROS2 galactic生成的bag包里的MarkerArray在humble下播放不正常

近期发现ROS2 galactic下生成的bag包在humble下回放时使用rviz可视化&#xff0c;bag里的点云可以正常看到&#xff0c;但是使用Marker和MarkerArray画的box却死活看不到&#xff0c;感觉很纳闷&#xff0c;看网上有人报告说foxy下生成的bag包在galactic下播放会报SQL错误&…

Oracle 中换行chr(10)、回车chr(13)

一、前言 chr(n)&#xff1a;返回 ascii 值对应的字符。 ascii(char)&#xff1a;返回字符 char对应的ascii 值。 chr(n) 和 ascii(char) 作用刚好是相反的。 SQL> select chr(65) from dual; 控制台显示&#xff1a;ASQL> select ascii(A) from dual; 控制台显示&am…

【C++】开源:Boost进程间通信库InterProcess配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Boost进程间通信库InterProcess配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一…

java--接口概述

1.认识接口 ①java提供了一个关键字interface&#xff0c;用这个关键字我们可以定义出一个特殊的结构&#xff1a;接口。 ②注意&#xff1a;接口不能创建对象&#xff1b;接口是用来被类实现(implements)的&#xff0c;实现接口的类称为实现类。 ③一个类可以实现多个接口(接…

LVS-DR+Keepalived+动静分离实验

架构图 解释一下架构&#xff0c;大概就是用Keepalived实现两台DR服务器的LVS负载均衡&#xff0c;然后后端服务器是两台Nginx服务器两台Tomcat服务器并且实现动静分离这个实验其实就是把 LVS-DRKeepalived 和 动静分离 给拼起来&#xff0c;真的是拼起来&#xff0c;两个部分…

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…