历史上的今天
今天是:2024年12月06日(星期五)
2021年12月06日 | 正点原子STM32学习笔记——通用定时器基本原理
2021-12-06 来源:eefocus
以下描述适用于整个STM32FM10xxx系列。
本文依据《STM32中文参考手册_V10》
STM32 通用定时器简介
STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括:
1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
A.输入捕获
B.输出比较
C.PWM 生成(边缘或中间对齐模式)
D.单脉冲模式输出
4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外
一个定时器)的同步电路。
5)如下事件发生时产生中断/DMA:
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理

从图中可以看出,定时器的框图是很复杂的,所以学习的时候应该分成几个部分来学。
第一部分,时钟生成:产生一个时钟,作为时基单元的输入(图中红线)

图中产生时钟的方式有四种:
①由内部时钟产生,如上图的“来自RCC的TIMxCLK”。此种应用的比较多。
②由外部引脚输入,上图的TIMx_ETR,可以从STM32F103RCT6.PDF中查找对应的引脚。这种方法只适用定时器2,3,4,定时器5没有这样的功能。
③来自ITR0~ITR1(内部触发输入口),定时器的级联,是来自其它的定时器,其它定时器的TRGO(如上图)连接到ITR0 ~ ITR1,自己的TRGO也可以连接到其它定时器的ITR0 ~ ITR1。
④来自TI1F_ED、TI1FP1、TI1FP2(见上图),这三个来自于下图中的“输入滤波器和边沿检测器”,而“输入滤波器和边沿检测器”来自于TI1,TI1来自于外部通道(TIMx_CH1等)。
第二部分,输入捕获(可用于计算脉宽,参考输入捕获实验):

第三部分,时基单元(定时器中断实验):

任何一个定时器都有一个时基单元,CK_PSC信号进行一个预分频(除法运算)产生CK_CNT时钟,这个时钟才是计数器(CNT)最终的时钟。CNT在时钟的控制下可以向上或向下计数(可以通过配置相应寄存器来决定是向上还是向下计数),如CNT从0向上计数到重装载值会产生一个溢出事件,事件可以触发中断或者DMA请求。
可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器(CNT)、自动装载寄存器(ARR)和预分频器寄存器(PSC)可以由软件读写,在计数器运行时仍可以读写。
时基单元包含:
● 计数器寄存器(TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当
TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。
在图中可以看到自动重装载寄存器有一个阴影,有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器)。
关于影子寄存器,可以参考网上的一名博主的博客:
首先转载: STM32定时器的预装载寄存器与影子寄存器之间的关系
计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)时,CK_CNT才有效。
注:真正的计数器使能信号CNT_EN是在CEN的一个时钟周期后被设置。
预分频器描述 :
预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲器,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。

第四部分,输出比较(PWM输出):

由于定时器的内容比较多,这里简单的介绍下基本原理。
史海拾趣
|
急!哪位好心大侠帮忙!W77E58/w77e058双串口多机通讯遇到难题啦! 急!哪位好心大侠帮忙!W77E58/w77e058双串口多机通讯遇到难题啦! 我用的是一片W77E58/w77e058做为主机,通过分别寻址多台从机(从机也是W77E58/w77e058),与他们单独通讯(即主机一一号从机通讯完了,再与2号从机通讯,。。。。)。看资料好久 ...… 查看全部问答> |
|
#include sbit d1=P1^1; //接有发光二极管,低电平时灯亮 sbit rx=P3^0; void delayms(unsigned int x) & ...… 查看全部问答> |
|
串口使用DMA接收。手册上有这么说明:溢出错误如果RXNE 还没有被复位,又接收到一个字符,则发生溢出错误。数据只有当RXNE 位被清零后才能从移位寄存器转移到RDR 寄存器。RXNE 标记是接收到每个字节后被置位的。如果下一 ...… 查看全部问答> |
|
程序下载后,设备可正常运行,但有时设备受到一定冲击(如掉到地上或大一些的脉冲干扰)后,设备就无法正常工作了(设备可正常启动,就是部分功能不好用了)!最怪异的是,什么都不动,就是重新下一遍程序,设备马上恢复正常!!!求教各位看官这是 ...… 查看全部问答> |
|
你有没有这种感觉,当你极目远眺的下一秒,便开始为脚下的路迷茫;期待腾飞的翅膀,在现实的面前总有点不知所措。那么,怎么样找到你自己倾心想为之奋斗的事业?又如何去成功规划乃至实现它,而使自己少走弯路,截弯取直呢?独之秀职业顾问给了 ...… 查看全部问答> |




