STM32:定时器

  • TIM(Timer)定时器
    • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
    • 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时72/65536/65536
    • 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
    • 类型 编号 总线 功能
    • 高级定时器 TIM1、TIM8 APB2 拥有通用定时器全部功能,并额外具有重 复计数器、死区生成、互补输出、刹车输入等功能
    • 通用定时器 TIM2、TIM3、TIM4、TIM5 APB1 拥有基本定时器全部功能 并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
    • 基本定时器 TIM6、TIM7 APB1 拥有定时中断、主模式触发DAC的功能
    • STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
  • 基本定时器:基准时钟->预分频器->计数器

    • 预分频器
      • 如果预分频器写0,不分频,输出频率=输入频率=72MHz
      • 如果预分频器写1,二分频,输出频率=输入频率/2=36MHz
      • 如果预分频器写,三分频,输出频率=输入频率/3=24MHz
      • 最大值可以写65535也就是65536分频,输出频率=72/65536
    • CNT计数器
      • 对预分频后的始终进行计数,计数时钟每来一个上升沿,计数器的值就加
    • 自动重装寄存器,当计数值等于自动重装值时,代表计时时间到,会产生中断信号,并且清零计数器。(图中向上箭头:更新中断;更新中断通往NVIC)(图中向下箭头:更新时间,更新事件不睡出发中断,但是可以触发内部其他电路的工作)
    • 主模式触发DAC的功能:主模式把更新事件映射到 触发输出TRGO的位置,TRGO直接接到DAC的触发转换引脚上,直接触发DAC,不需要软件的参与,实现了硬件的自动化。
  • 通用定时器:

    • 除了向上计数,通用定时器和高级定时器还支持向下计数模式和中央对齐模式
    • 向下计数模式:从重装值开始,向下自减。
    • 中央对齐模式:从0开始,先向上自增,到重装值,申请中断,然后向下自减到0 再次申请中断。
    • 内外时钟源选择:
      • 第一个外部时钟:TIMx_ETR引脚(PA0)上的外部时钟。两个输出:1.ETRF进入触发控制器,进而到时基单元,这一路也叫外部时钟模式2;2.TRGI:用作触发输入使用,触发输入和从模式,以后课程讲。这一路叫外部时钟模式1.
      • ITRx(ITR0~ITR3)信号来来源于其他定时器,主模式的TRGO可以通向其他定时器。
      • 表格意思为:例如:TIM2定时器的ITR0信号来自于上一个时钟(TIM1)

      • 定时器级联功能,比如:先初始化TIM3,然后使用主模式把它的更新事件映射到TRGO上,然后再初始化TIM2,这里算则ITR2,对应的就是TIM3的TRGO
      • 时钟还能通过CH1获得,ED是边沿的意思,可以是上升沿可以是下降沿。
      • last :时钟还能通过TI1FP1和TI2FP2获得。
      • 总结:外部时钟模式1的引脚可以是ETR引脚、(ITR)其他定时器、CH1引脚的边沿、CH1和CH2引脚的TI1FP1和TI2FP2获得
      • 右下角是输出比较电路,共有四个通道,分别对应CH1到CH4的引脚,可以用于输出PWM波形,驱动电机。
      • 左下角是输入捕获电路,也有四个通道。对应的也是CH1到CH4的引脚,可以用于侧输入方波的频率等。
      • 中间是捕获/比较寄存器,是输入捕获和输出比较电路共用的。因为输入捕获和输出比较不能停驶使用,所以寄存器共用,引脚共用。之后再具体分析。
  • 高级定时器:

    • 申请中断的地方加了一个重复次数计数器,可以实现每隔几个计数周期,才发生一次更新事件和更新中断。
  • 定时中断基本结构图:

    • 中断输出控制(即,中断输出允许位):解决定时器模块有很多地方都要申请中断,看是否需要这个中断,如果需要就允许,如果不需要这个中断,就禁止。(更新会申请中断,触发信号(TRGO)也会申请中断、输入捕获和输出比较匹配时也会申请中断)
  • 时基单元运行细节问题:
    • 预分频时序:

    • 计数器计数频率:CK_CNT= CK_PSC/(PSC + 1)
    • CK_PSC:预分频器的输入时钟。一般为72Mhz
    • CNT_EN:计数器使能,高电平计数器正常运行,低电平计数器停止。
    • CK_CNT:计数器时钟,即时分频器的时钟输出,也是计数器的时钟输入。
    • 一个计时周期结束时,产生了更新事件,预分频(控制)寄存器的值才会杯传递到缓冲器里去,才会生效。
    • 计数器时序:

    • 计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR +1)=CK_PSC / (PSC +1) / (ARR +1)
    • 计数器无预装时序:

    • 计数器有预装时序:

    • RCC时钟树:

    • P13 TIM定时中断,44分钟。
    • 无论什么定时器,内部基准时钟都是72Mhz。
  • void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);初始化时基单元;
  • void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); 把结构体变量赋一个默认值;
  • void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);使能计数器;
  • void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);使能中断输出信号;TIM_IT 选择配置哪个中断输出,NewState使能还是失能。
  • void TIM_InternalClockConfig(TIM_TypeDef* TIMx);选择内部时钟
  • void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);选择ITRx其他定时器的时钟。
  • void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);选择TIx捕获通道的时钟。TIM_TIxExternalCLKSource选择TIx的某个引脚;TIM_ICPolarity输入的极性;ICFilter滤波器。
  • void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);选择ETR通过外部时钟模式1输入的时钟。TIM_ExtTRGPrescaler外部触发预分频器:可以对ETR的外部时钟再提前做一个分频;
  • void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);选择ETR通过外部时钟模式2输入的时钟。如果不需要触发输入的功能,上两个函数可以互换
  • void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);单独用来配置ETR引脚的预分频器,极性滤波器这些参数的。
  • void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);写预分频值;TIM_PSCReloadMode选择模式:1.听从安排等待更新事件生效,2.在写入后,手动产生一个更新事件,让这个值立即生效。
  • void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);用来改变计数器的计数模式。
  • void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);自动重装器预装功能配置
  • 定时器代码如下:
  • #include "stm32f10x.h"                  // Device header
    
    extern uint16_t Num;
    void Timer_Init(void)
    {
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
    	
    	TIM_InternalClockConfig(TIM2);//选择时基单元的时钟
    	
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//配置采样频率(滤波器),消除抖动;
    	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
    	TIM_TimeBaseInitStructure.TIM_Period=10000-1;//ARR自动重装器的值
    	TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//预分频器的值 72MHz/7200/10000=1
    	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给0即可)
    	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//时基单元配置完毕 更新事件和更新中断是同时发生的,
    	
    	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除更新事件带来的更新中断标志位的变化,否则会导致上电立刻进入中断
    	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断;开通更新中断到NVIC的通路
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	NVIC_InitTypeDef NVIC_InitStruct;
    	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//定时器2在NVIC里的通道
    	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
    	NVIC_Init(&NVIC_InitStruct);
    	
    	TIM_Cmd(TIM2,ENABLE);//开启定时器;
    }
    void TIM2_IRQHandler(void)
    {
    	if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
    	{
    		Num++;
    		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    	}	
    	
    }

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Grid布局

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Flex布局和Grid布局</title><style&…

每周编辑精选|微软开源 Orca-Math 高质量数学数据集、清华大学研究团队发布条件去噪扩散模型 SPDiff...

Orca-Math 是微软研究院发布的数学推理模型&#xff0c;该模型展示了较小的专业模型在特定领域的价值&#xff0c;它们可以匹配甚至超越更大模型的性能。微软近期开源了用于训练 Orca-Math 的 Orca-Math-200K 数学单词问题数据集&#xff0c;现已在 hyper.ai 官网提供下载&…

深入学习NIO三大核心:缓冲区 Buffer、通道Channel、Selector选择器

缓冲区 Buffer 一、简单介绍 Buffer&#xff0c;顾名思义就是缓冲区的意思&#xff0c;它是NIO中数据交换的载体&#xff0c;实质上是一种承载数据的容器。在上一篇BIO文章中我们提到BIO的工作模式是使用流来进行数据交换&#xff0c;并且根据操作的不同&#xff0c;分为输入…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

《LeetCode热题100》笔记题解思路技巧优化_Part_5

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_5 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题图论&#x1f7e1;1. 岛屿数量&#x1f7e1;2. 腐烂的橘子…

量子计算+HPC!ORNL与Riverlane、Rigetti合作研发

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 1000字丨8分钟阅读 近日&#xff0c;英国量子计算初创公司Riverlane和美国量子计算公司Rigetti Computing宣布将参与由美国能源部橡树岭国家实验室&#xff08;OR…

day03vue学习

day03 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔仙首页 拆分模块-局部注册结构样式完善…

sheng的学习笔记-AI-残差网络-Residual Networks (ResNets)

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 非常非常深的神经网络&#xff0c;网络发生了退化&#xff08;degradation&#xff09;的现象&#xff1a;随着网络层数的增多&#xff0c;训练集loss逐渐下降&#xff0c;然后趋于饱和&#xff0c;当你再增加网络深度的话&am…

【C++初阶】第七站:string类的初识(万字详解、细节拉满)

前言&#xff1a; &#x1f4cd;本文知识点&#xff1a;string的初识 本专栏&#xff1a;C 目录 一、什么是STL 二、STL的六大组件 三、STL的缺陷 四、为什么学习string类&#xff1f; 五、标准库中的string类 1、string类(了解) 2、string类的常用接口说明&#xff08;…

最新Java面试题2【2024初级】

下载链接&#xff1a;博主已将以上这些面试题整理成了一个面试手册&#xff0c;是PDF版的 互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字…

如何通过ETL做数据转换

在数字化时代&#xff0c;数据被誉为新时代的石油&#xff0c;而数据的价值往往隐藏在海量数据背后的信息中。然而&#xff0c;海量的原始数据并不总是直接可用的&#xff0c;这就需要一种有效的工具来对数据进行提取、转换和加载&#xff08;ETL&#xff09;&#xff0c;从而将…

【排序】快速排序

原理 对于一个数组x&#xff0c;快速排序流程如下&#xff1a; 确定分界点a&#xff0c;可以取x[l]、x[r]、x[l r / 2]、随机&#xff08;四种都可以&#xff09;调整区间&#xff0c;使得&#xff1a;区间被分成 < a 和 > a的两部分&#xff0c;左边 < a&#xff…

转录因子/组蛋白修饰靶基因数据库:Cistrome DB使用教程

最近有小伙伴经常询问怎么预测转录因子的下游靶基因&#xff0c;以及预测一些组蛋白修饰影响的靶基因信息。今天就给大家介绍一下Cistrome数据浏览器&#xff08;Cistrome Data Browser&#xff09;。 Cistrome DB是来自人类和小鼠的ChIP-seq、ATAC-seq和DNase-seq数据的资源&…

huawei 华为交换机 配置手工模式链路聚合示例

组网需求 如 图 3-21 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;SwitchA 和 SwitchB 之间有较大的数据流量。 用户希望SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同 VLAN 间互相通信。 同时用户也希望能够提…

京津冀自动驾驶产业盛会“2024北京国际自动驾驶技术展览会”

随着科技的飞速发展&#xff0c;自动驾驶技术成为了汽车产业变革的热点和前沿。智能化、网联化已经成为推动汽车产业创新发展的重要力量&#xff0c;而自动驾驶技术则是其中的关键一环。它不仅能够提高道路安全性、缓解交通拥堵&#xff0c;还能为乘客带来更加舒适、便捷的出行…

【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②

目录 ​编辑 1.二叉树的顺序结构及实现 1.1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1堆的代码定义 3.2堆插入数据 3.3打印堆数据 3.4堆的数据的删除 3.5获取根部数据 3.6判断堆是否为空 3.7 堆的销毁 4.建堆以及堆排序 4.1 升序建大堆&#xff0c;降序建小堆 4.2堆…

AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互

AR/MR产品设计&#xff08;二&#xff09;&#xff1a;如何用一双手完成与虚拟对象的自然交互 - 知乎 手是我们与现实世界交互最重要的方式&#xff0c;同样在虚实混合的世界中是最重要的交互方式 在AR/MR/VR的交互中&#xff0c;手势交互会作为XR的重要交互动作&#xff0c;因…

C++_day6

思维导图&#xff1a; 2试编程 封装一个动物的基类&#xff0c;类中有私有成员: 姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有:指针成员:腿的个数(整型 int count)&#xff0c;共有成员函数…

Qt5.14.2 深入理解Qt多线程编程,掌握线程池架构实现高效并发

在高并发的软件系统中&#xff0c;多线程编程是解决性能瓶颈和提高系统吞吐量的有效手段。作为跨平台的应用程序开发框架&#xff0c;Qt为我们提供了强大的多线程支持。本文将深入探讨Qt多线程编程的实现细节&#xff0c;并介绍线程池的设计思想&#xff0c;帮助读者彻底掌握Qt…

【低照度图像增强系列(3)】EnlightenGAN算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…
最新文章