STM32通用定时器

news2024/9/26 1:28:04

本文实践:实现通过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 header

int 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.coloradmin.cn/o/1284667.html

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

相关文章

Educational Codeforces Round 159 (Rated for Div. 2)(B 二分贪心 Cgcd D二分+前缀和 E字典树)

A - Binary Imbalance 有只要在01之间插入就能制造无限个0&#xff0c;没有0就统计0 1个数即可 #include<bits/stdc.h> using namespace std; const int N 110010,mod998244353; #define int long long typedef long long LL; typedef pair<int, int> PII; const…

java学习part34collect和map

153-集合框架-数组的特点、弊端与集合框架体系介绍_哔哩哔哩_bilibili 1.以前的数组 2.常用 3.Collection add只能加object&#xff0c;如果有基本类型会装箱 3.2集合和数组转换 3.3往集合添加对象的注意事项 4.迭代器 容易越界 一般不用 常用好用 5.for each 类似c的for( …

vue3 vue-router编程式导航(二)

文章目录 一、跳转到指定路径1. query传参2. Params传参 二、前进/后退三、替换当前页 Vue Router提供了强大且灵活的编程式导航功能&#xff0c;能够通过代码来控制路由的切换和跳转。本篇博客将介绍如何在Vue 3应用程序中使用Vue Router进行编程式导航。 一、跳转到指定路径…

Proteus仿真--基于51单片机的DS18B20温度采集及报警

本文介绍基于DS18B20温度采集及报警的仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中温度传感器选用DS18B20器件&#xff0c;主要用于获取温度数据并上传&#xff0c;温度显示选用数码管&#xff0c;报警模块选用蜂鸣器 仿真运行视频 Pr…

pip命令详解

pip命令介绍 pip是由Ian Bicking在2008年提出的&#xff0c;他将pyinstall重命名为pip。名称pip是首字母缩写词&#xff0c;全称为“Package Installer for Python”。自Python3的3.4版本以及Python2的2.7.9版本开始&#xff0c;pip被直接包括在Python的安装包内&#xff0c;成…

SpringBoot系列之使用Redis ZSet实现排序分页

软件环境&#xff1a; JDK 1.8 SpringBoot 2.2.1 Maven 3.2 Mysql 8.0.26 spring-boot-starter-data-redis 2.2.1 jedis3.1.0 开发工具 IntelliJ IDEA smartGit 实现思路 相对于set来说&#xff0c;sorted set是一种有序的set&#xff0c;排序是根据每个元素的score…

云原生之深入解析如何限制Kubernetes集群中文件描述符与线程数量

一、背景 linux 中为了防止进程恶意使用资源&#xff0c;系统使用 ulimit 来限制进程的资源使用情况&#xff08;包括文件描述符&#xff0c;线程数&#xff0c;内存大小等&#xff09;。同样地在容器化场景中&#xff0c;需要限制其系统资源的使用量。ulimit: docker 默认支持…

【Vue】使用 Vue CLI 脚手架创建 Vue 项目(使用命令行创建)

前言 在开始使用Vue进行开发之前&#xff0c;我们需要先创建一个Vue项目。Vue CLI&#xff08;Command Line Interface&#xff09;是一个官方提供的脚手架工具&#xff0c;可以帮助我们快速创建Vue项目。 步骤 打开终端或命令行工具&#xff0c;运行以下命令&#xff1a; vu…

传输层可靠传输的原理

目录 1.停止等待协议 2.连续ARQ协议 3.TCP报文段的首部格式 4.TCP的滑动窗口机制 &#xff08;1&#xff09;发送窗口 &#xff08;2&#xff09;接收窗口 &#xff08;3&#xff09;发送缓存 5.超时重传时间的选择 6.选择确认SACK(Selective ACK) 7.使用滑动窗口实现…

TCL - 库编译过程和官方手册

文章目录 TCL - 库编译过程和官方手册概述笔记编译步骤TCL官方手册END TCL - 库编译过程和官方手册 概述 想看看sqlite3的官方demo工程, 没看到. 想编译一下sqlite3源码, 看看编译后有没有example 工程. 看了sqlite3的官方说明, 他们工程使用tcl来编译的. 一听tcl, 咋这么耳熟…

基于Docker构建Python开发环境

1. Dockerfile dockerfile所在目录结构 FROM python:3.8 WORKDIR /leo RUN apt-get install -y wget RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai >/etc/timezone # ssh免密登录 COPY id_rsa.pub /leo RUN mkdir ~/.s…

戴森发布全新Airstrait吹风直发器,美发科技品类再添力作

——利用气流&#xff0c;吹干的同时拉直头发&#xff0c;无需热夹板&#xff0c;头发无热损伤 &#xff08;2023年11月30日&#xff0c;上海&#xff09;戴森今日重磅发布全新美发造型产品——戴森Airstrait™吹风直发器&#xff0c;作为戴森美发科技品类的又一创新力作&…

Redis Hash数据类型

Redis Hash数据类型 几乎所有的主流编程语言都提供了哈希(hash)类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#xff0c;哈希类型是指值本身又是一个键值对结构&#xff0c;形如key “key”&#xff0c;value {ffield1, value1 }, … {fieldN…

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 . 滑动窗口最大值 描述 : 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 题目 : …

探索图像生成中的生成对抗网络 (GAN) 世界

一、介绍 生成对抗网络&#xff08;GAN&#xff09;的出现标志着人工智能领域的一个重要里程碑&#xff0c;特别是在图像生成领域。GAN 由 Ian Goodfellow 和他的同事于 2014 年提出&#xff0c;代表了机器学习中的一种新颖方法&#xff0c;展示了生成高度逼真和多样化图像的能…

ping会出现的两种问题-----time out 和 unreachable

ping命令常见的返回信息有两种: Request timed out和Destination host unreachable 两者的区别是: Request timed out是ping包没有返回的路由&#xff0c;导致超时 Destination host unreachable是ping包没有去到目的地的路由 来看一个例子&#xff1a; 各部件配置如下&…

电子学会C/C++编程等级考试2022年09月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … &l…

React全站框架Next.js使用入门

Next.js是一个基于React的服务器端渲染框架&#xff0c;它可以帮助我们快速构建React应用程序&#xff0c;并具有以下优势&#xff1a; 1. 支持服务器端渲染&#xff0c;提高页面渲染速度和SEO&#xff1b; 2. 自带webpack开发环境&#xff0c;实现即插即用的特性&#xff1b;…

新华三数字大赛复赛知识点 网络访问控制

EAD解决方案、portal认证、以太网访问控制列表 EAD&#xff1a; 网络安全从本质上讲是管理问题&#xff0c;&#xff08;End user Admission Domination&#xff09;解决方案从控制用户终端安全接入网络的角度入手&#xff0c;整合网络接入控制与终端安全产品&#xff0c;通过…

nginx对多个服务器的高可用,容易出现鉴权失败

高可用简单测试正常&#xff0c;但是出现高概率401鉴权错误 抓包发现&#xff0c;确实是401 &#xff0c; 而鉴权是两次交互&#xff1a; 抓包发现鉴权到不同服务器上了&#xff0c;导致鉴权没有完成。 此时就需要我们的ip_hash,把同一IP地址的请求,都分配给同一台后端服务器&…