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.mzph.cn/news/197731.shtml

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

相关文章

深入分析爬虫中time.sleep和Request的并发影响

背景介绍 在编写Python爬虫程序时&#xff0c;我们经常会遇到需要控制爬取速度以及处理并发请求的情况。本文将深入探讨Python爬虫中使用time.sleep()和请求对象时可能出现的并发影响&#xff0c;并提供解决方案。 time.sleep()介绍 首先&#xff0c;让我们来了解一下time.s…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…

根据已有安装的cuda配置合适的pytorch环境

目前网络上根据电脑配置安装合适的深度学习环境的帖子已经很多了&#xff0c;但是现实中会出现很久之前已经安装了对应的cuda&#xff0c;但是现在忘记了当时安装的是什么版本。本文针对这一问题展开攻略。 1 cuda安装版本查询 我们在查询自己应该安装什么版本的cuda时&#…

【模电】直流通路与交流通路

直流通路与交流通路 通常&#xff0c;在放大电路中&#xff0c;直流电源的作用和交流信号的作用总是共存的&#xff0c;即静态电流、电压和动态电流、电压总是共存的。但是由于电容、电感等电抗元件的存在&#xff0c;直流量所流经的通路与交流信号所流经的通路不完全相同。因此…

【设计模式】职责链模式设计在线文档帮助系统

职责链模式设计在线文档帮助系统 任务三&#xff1a;使用职责链模式设计在线文档帮助系统 某公司欲开发一个软件系统的在线文档帮助系统&#xff0c;用户可以在任何一个查询环境中输入查询关键字&#xff0c;如果当前查询环境下没有相关内容&#xff0c;则系统会将查询按照一定…

获取Spring容器Bean工具类

获取Spring容器Bean工具类 1、创建SpringUtils工具类2、注册 SpringUtils工具类3、如果打包的是War方式&#xff0c;可能上面两个注册工具类的方法都没用 1、创建SpringUtils工具类 public class SpringUtils implements ApplicationContextAware {private static Application…

【鸿蒙应用开发】开发环境搭建及IDE安装使用

1.下载安装包 安装包下载地址&#xff1a; 点击跳转下载页面 可以根据自己的操作系统选择对应版本下载。 本文以Windows安装为例&#xff0c;Mac安装方式相同 2. 安装 下载好后&#xff0c;打开安装包&#xff0c;进入安装界面&#xff1a; 点击Next&#xff0c;进入安…

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

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

蔚碳科技联合中投会发布国内首个 ESG 尽职调查服务标准

11 月 26 日&#xff0c;蔚碳&#xff08;上海&#xff09;科技有限公司&#xff08;以下简称“蔚碳科技”&#xff09;受邀出席由深圳市人民政府主办&#xff0c;深圳市发展和改革委员会、深圳市生态环境局、龙岗区人民政府共同承办的 2023 碳达峰碳中和论坛暨深圳国际低碳城论…

手机升级到iOS15.8后无法在xcode(14.2)上真机调试

之前手机是iOS14.2的系统,在xcode上进行真机测试运行良好&#xff0c;因为想要使用Xcode的Instruments功能&#xff0c;今天将系统更新到了iOS15.8 &#xff0c;结果崩了 说是Xcode和手机系统不兼容不能进行真机测试。在网上查不好些方法&#xff0c;靠谱的就是下载相关版本的…

05、pytest断言确定的异常

官方用例 # content of test_sysexit.py import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()解读与实操 ​ 标准python raise函数可产生异常。pytest.raises可以断言某个异常会发现。异常发生了&#xff0c;用例执行成功&#x…

常见的几种计算机编码格式

前言&#xff1a; 计算机编码是指将字符、数字和符号等信息转换为计算机可识别的二进制数的过程&#xff0c;正因如此&#xff0c;计算机才能识别中英文等各类字符。计算机中有多种编码格式用于表示和存储文本、字符和数据&#xff0c;实际走到最后都是二进制&#xff0c;本质一…

CefSharp 获取POST(AJAX)、GET消息返回值(request)

CefSharp作为专门为爬虫工具开发的库比Selenium这种开发目的是页面测试工具然后用来做爬虫的工具要贴心得多。我们操作网页的时候发送或者做了某个动作提交表单之后需要知道我们的动作或者提交是否成功&#xff0c;因为有的页面会因为网络延迟问题提交失败&#xff0c;需要准确…

VIVADO-FFT IP核学习记录

根据用户手册使用IP核 ① 找到user guide / product guide 并打开 ② 找到Customizing and Generating the Core(不同手册可能题目不一样)&#xff0c;查看IP核的创建过程中各个参数的意义和设置方法。 ③ 找到port description &#xff0c;查看接口注释 根据网络教程使用…

微信小程序调用相机拍摄或手机相册

wx.chooseMedia(Object object) 功能描述 拍摄或从手机相册中选择图片或视频。

Facebook推广工具功能科普!

随着社交媒体的普及&#xff0c;Facebook已经成为全球使用最广泛的社交平台之一&#xff0c;对于广大营销人员来说&#xff0c;利用Facebook推广工具进行营销已经成为不可或缺的一部分。 那么&#xff0c;这些推广工具到底有哪些功能呢?本文将为您揭秘Facebook推广工具的强大…

SaToken利用Redis做持久化

官网解释 官网解释 教程 引入依赖 <!-- 提供Redis连接池 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId> </dependency><!-- Sa-Token 整合 Redis &#xff08;使用 jdk 默认序…

leecode | 从二叉搜索树到更大和树

官方的题目解释永远晦涩难懂 这就是最大的拦路虎 简单介绍&#xff0c;将二叉搜索树&#xff0c;转换成“更大和树”&#xff0c;“最大的和树”&#xff0c;就是更新节点val&#xff0c;二叉树中所有大于等于该节点的的val 总和&#xff0c;包括本身 #对着图看&#xff0c;会更…

pythonGUi不能立即刷新

今天遇到一个UI界面问题&#xff1a; 在修改控件的背景颜色或其他样式后&#xff0c;UI 没有立即更新&#xff0c;而需要晃动窗口或触发一些事件才能看到变化&#xff0c;可能是由于界面的刷新机制问题。这种情况下&#xff0c;我尝试使用 Refresh 方法来强制刷新控件。 在你的…

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;成…