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); 
TIM_ARRPreloadConfig(TIM14,ENABLE); 

第六步:使能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结构体*/GPIO_Init(GPIOF,&GPIO_InitStruct); /*函数用于配置GPIOF引脚9为TIM14的复用功能*/GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);/*定义时基单元结构体*/TIM_TimeBaseInitTypeDef TIM_TimeInitStruct;/*TIM_ClockDivision表示时钟分割,TIM_CKD_DIV1将时钟分割成1份,即不分割*/TIM_TimeInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeInitStruct.TIM_CounterMode = TIM_CounterMode_Up;/*将定时器的溢出周期设置为900个时钟周期*/TIM_TimeInitStruct.TIM_Period = 899;/*对时钟进行预分频,实际计数频率要除以8399*/TIM_TimeInitStruct.TIM_Prescaler = 8399;/*初始化时基单元*/TIM_TimeBaseInit(TIM14,&TIM_TimeInitStruct);/*定义输出比较配置结构体*/TIM_OCInitTypeDef TIM_OC1InitStruct;/*将TIM14的输出比较单元配置为PWM模式*/TIM_OC1InitStruct.TIM_OCMode = TIM_OCMode_PWM1;/*启用输出通道,当计数器的值小于比较寄存器CCR的值时通道将处于使能状态,产生PWM波形*/TIM_OC1InitStruct.TIM_OutputState = TIM_OutputState_Enable;/*当计数器值小于比较寄存器值时,输出为高电平*/TIM_OC1InitStruct.TIM_OCPolarity = TIM_OCPolarity_High;/*初始化输出比较配置*/TIM_OC1Init(TIM14,&TIM_OC1InitStruct);/*启用比较通道1的预装载寄存器。预装载功能的启用意味着对预装载寄存器的任何更改都会等到下一个溢出周期或触发事件时才会生效*/TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);/*使能或禁用TIM14的自动重装载寄存器*/TIM_ARRPreloadConfig(TIM14,ENABLE);/*启用TIM14定时器,即让TIM14的计数器开始计数*/TIM_Cmd(TIM14,ENABLE); uint8_t i;while (1){for(i=0; i <= 100; i++){/*改变PWM波形的占空比,i的值从0逐渐增加到100,使PWM的占空比从0%逐渐增加到100%*/TIM_SetCompare1(TIM14,i);}for(i=0; i<= 100; i++){TIM_SetCompare1(TIM14,100-i);}}}

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

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

相关文章

前端开发_CSS

CSS定义 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签里面书…

【Vulnhub 靶场】【BuffEMR: 1.0.1】【简单 - 中等】【20210831】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/buffemr-101,717/ 靶场下载&#xff1a;https://download.vulnhub.com/buffemr/BuffEMR-v1.0.1.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年08月31日 文件大小&#xff1a;4.6 GB 靶场作…

vue2使用wangeditor实现手写输入

1.效果 2.实现 2.1&#xff1a;先看我上一篇&#xff0c;这篇就是在上一篇的基础上添加一个手写功能&#xff0c;导入注册就行了 vue2使用wangeditor实现数学公式富文本编辑器-CSDN博客 在components中添加myscriptMath.js svg也就是个显示的图标&#xff0c;可以替换为其…

基于FPGA的温度控制系统设计(论文+源码)

1.系统设计 本次基于FPGA的智能温度控制系统&#xff0c;以FPGA为控制核心&#xff0c;采用自顶向下的设计方法&#xff0c;按照模块化设计的思路分别实现各个模块&#xff0c;再加以整合实现整个系统&#xff0c;从而达到了温度控制的目的。系统以水箱为被控对象&#xff0c;…

【算法系列篇】递归、搜索和回溯(二)

文章目录 前言1. 两两交换链表中的节点1.1 题目要求1.2 做题思路1.3 代码实现 2. Pow(X,N)2.1 题目要求2.2 做题思路2.3 代码实现 3. 计算布尔二叉树的值3.1 题目要求3.2 做题思路3.3 代码实现 4. 求根节点到叶结点数字之和4.1 题目要求4.2 做题思路4.3 代码实现 前言 前面为大…

docker:部署java Springboot项目

文章目录 1、打 jar 包1、创建Dockerfile3、创建镜像4、启动容器其他注意事项docker中jdk的版本命名举例&#xff1a;openjdk:11-ea-17-jre-slim举例&#xff1a;8u312-jre-nanoserver-1809 通过find找文件 1、打 jar 包 将项目打一个 jar 包&#xff0c;可以使用 IDEA 1、…

xss 漏洞

xss 漏洞 1.1 漏洞简介1.2 漏洞影响范围1.3 漏洞详解1.3.1 漏洞原理、类型、影响、措施1.3.2 实例DVWA 靶场实验反射性 xss存储型xssDOM 型 XSS pikachu靶场实验反射 get 型 xss反射 post 型 xss xss 绕过 1.1 漏洞简介 XSS 的原理 跨站脚本攻击 XSS(Cross Site Scripting)&am…

观海微电子----LVDS接口

LVDS&#xff08;Low Voltage Differential Signaling&#xff0c;即低电压差分信号&#xff09; 常见于高清分辨率的屏幕&#xff0c;是TTL接口的升级版&#xff0c;LVDS接口是在TTL的技术上编码而成&#xff0c;使用低压差分信号来进行传输。 这种技术的核心是采用极…

Vue混淆与还原

Vue混淆与还原 引言 Vue是一种流行的JavaScript框架&#xff0c;用于构建用户界面。它简单易用且功能强大&#xff0c;备受开发者喜爱。然而&#xff0c;在传输和存储过程中&#xff0c;我们需要保护Vue代码的安全性。混淆是一种有效的保护措施&#xff0c;可以加密和压缩代码…

【VS Code开发】使用Live Server搭建MENJA小游戏并发布至公网远程访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通过cpolar内网穿透发布到公网&#xff0c;分…

UDP多人群聊

一&#xff0c;创建类 二&#xff0c;类 1&#xff0c;Liao类 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class Liao extends JFrame{ private static fi…

Diffusion Models: A Comprehensive Survey of Methods and Applications

摘要 扩散模型作为一个强大的新的深度生成模型系列出现&#xff0c;在许多应用中具有破纪录的性能&#xff0c;包括图像合成、视频生成和分子设计。在这项调查中&#xff0c;我们对迅速扩大的扩散模型的工作进行了概述&#xff0c;将研究分为三个关键领域&#xff1a;有效采样…

基于SSM的教师上课系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

2024年跨年倒计时代码祝福!

首先&#xff0c;本代码借鉴了陈橘又青这位博主的代码参考 如有冒犯&#xff0c;请联系我删除 <!doctype html><html><head><meta charset"utf-8"><title>新年快乐</title><style>body{overflow: hidden;margin: 0;}h1{…

C# UDP

UDP是一个无连接协议&#xff0c;传输数据之前源端和终端不建立连接&#xff0c;当它想传送时就简单地去抓取来自应用程序的数据&#xff0c;并尽可能快地把它扔到网络上。在发送端&#xff0c;UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天&#xff0c;数据的价值不可估量&#xff0c;尤其是金融行业&#xff0c;数据不仅代表着企业的核心资产&#xff0c;还涉及到客户的隐私和信任。因此对于金融行业而言&#xff0c;保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

Android渲染-AHardwareBuffer

本文主要从应用的角度介绍android的native层AHardwareBuffer创建纹理以及保存渲染数据。 HardwareBuffer 要介绍native层的AHardwareBuffer&#xff0c;就需要先从Java层的HardwareBuffer说起。Android官方对于HardwareBuffer介绍如下&#xff1a; HardwareBuffer wraps a na…

Java预科知识

以下内容是根据狂神的Java说、chatgpt和csdn相关博客&#xff0c;结合自己的理解完成的。 Java了解 基于Java 开发了巨多的平台&#xff0c;系统&#xff0c;工具 构建工具&#xff1a; Ant, Maven, Jekins应用服务器&#xff1a;Tomcat, Jetty, Jboss, Websphere, weblogic…

dell r720远程网络安装ubuntu20.04(无U盘)

登陆后界面&#xff0c;在主界面上&#xff0c;我们就可以看到各个硬件组件的状态。在快速启动任务栏中&#xff0c;可以对系统电源进行操作&#xff0c;如开机、关机等。安装操作系统&#xff0c;在虚拟控制台预览处点击>启动 按照浏览器出现的提示确定安装控件等&#x…

软件设计师——数据结构(一)

&#x1f4d1;前言 本文主要是【数据结构】——软件设计师——数据结构的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…