目录
1. STM32有哪些定时器
2. 基本定时器
2.1 基本定时器主要功能
2.2 基本定时器的框图
2.2.1 时钟输入
2.2.2 至DAC
2.2.3 至时基单元(重点)
2.2.4 影子寄存器
2.2.5 基本定时器寄存器说明
2.2.5.1 控制寄存器1(TIMx_CR1)
2.2.5.2 TIMx_DIER、TIMx_SR、TIMx_EGR
2.3 如何在STM32中进行基本定时器定时
1. STM32有哪些定时器
STM32定时器分为三种类型:高级定时器、通用定时器、基本定时器。
作为接触定时器的第一章节,本节介绍基本定时器,需要掌握如何通过定时器来产生指定时间的中断,其余影子寄存器等概念做了解。
2. 基本定时器
2.1 基本定时器主要功能
1. 提供基本定时中断功能
2. 触发DAC同步电路
2.2 基本定时器的框图
2.2.1 时钟输入
首先从框图左上部分看,基本定时器的时钟输入只有一个,即:来自RCC的TIMxCLK,我们翻看下时钟树部分的框图STM32之二:时钟树,定时器2-7在APB1总线上,且对其频率有要求。“如果APB1预分频系数=1,则频率不变,否则频率*2”,我们知道,由于APB1最大频率为36MHz,SYSCLK时钟为72MHz,所以,APB1预分频器的系数=2,因此此处频率*2,即,至TIMxCLK的时钟为72MHz。因此,内部时钟CK_INT为72MHz。
2.2.2 至DAC
CK_INT输入的矩形兵分两路,一路触发控制器至DAC。
基本定时器在芯片内部直接连接到DAC,并通过触发输出直接驱动DAC。
本节主要探讨定时器的基本定时中断作用,此功能不做过多介绍。
2.2.3 至时基单元(重点)
红框框到的地方为时基单元,时基单位由预分频器(PSC)、计数器(CNT)和自动重装载寄存器(ARR)组成。
预分频器(PSC):PSC是16bit的预分频器,可以对定时时钟进行1~65536之间的任何一个数进行分频。分频过后的时 。PSC+1是因为实际PSC寄存器从0开始计数,PSC=0即代表不分频(或1分频),PSC=1即代表2分频,因此此处PSC需+1。
计数器(CNT):CNT是一个16bit的只向上计数的计数器,最大值为65535。当计数器中的数值达到自动重装载寄存器的值时产生更新时间,并清零从头开始计数。
自动重装载寄存器(ARR):ARR是一个16bit的寄存器,里面装着计数器能计数的最大值,当CNT中的值和ARR中的值一致时,如果使能中断,定时器会溢出中断。
那么,如果要定义1ms中断的时钟,PSC和ARR该如何取值呢?
定时器的时钟CK_CNT=CK_INT/(PSC+1),则计数器计数一次的时间=1/CK_CNT,当计数器计数数值达到ARR时候,产生一次中断。因此产生中断的时间可以计时为=(PSC+1)/ CK_INT*ARR
则PSC可以取值为71,ARR取值为1000,则(71+1)/72000000*1000 = 1ms
PS:PSC和ARR的取值不固定,满足公式即可
至此,即可给寄存器赋值来进行定时器中断。
2.2.4 影子寄存器
在基本定时器的框图中我们看到,标绿色的框框带有阴影。且时基单元中,自动重装载寄存器和预分频器也有阴影。这部分带有阴影的寄存器表示在物理上这个寄存器对应2个寄存器,其中一个是程序员可以写入或读出的寄存器,称为预装载寄存器,另一个是程序员看不见,但在操作中真正起作用的寄存器,称为影子寄存器。
我们观察STM32F10xx参考手册可以看到,影子寄存器被描述为缓冲。至于下句“可以在运行过程中改变它的数值,新的预分频数值将在下一个更新事件时起作用”,在运行中改变的其实是预装载寄存器,用户随时可以更改预装载寄存器的值,但是影子寄存器的值会在下一个更新事件时起作用。
2.2.5 基本定时器寄存器说明
虽然基本定时器只有定时和触发DAC两个功能,但是观看其寄存器,很多的标志位还是让人有些搞不清楚,在此将这些寄存器梳理下。
2.2.5.1 控制寄存器1(TIMx_CR1)
- CEN:
位0是一个标志位CEN,CEN意为计数器CNT使能位。
即CNT=1,使能计数器。CNT=0,关闭计数器,计数器不计数。因此可见,如果要进行定时器中断功能,必须要使CNT=1.
- UDIS:
位1为UDIS,表示禁止更新位。由软件设置和清除,以使能或禁止UEV事件的产生。
UDIS=0,UEV使能。更新事件UEV可以由下列事件产生:
-计数器CNT上溢或下溢。
-设置UG位(UG位为事件产生寄存器TIMx_EGR的0位,置1表示由软件产生更新事件)
-通过从模式控制器产生的更新(高级定时器功能,此处可以不看)
UDIS=1
不产生UEV更新事件。
- URS和OPM
位2为URS,URS表示UEV事件的请求源。
为3为OPM,OPM表示单脉冲模式。
- ARPE :自动重装载预装载使能。
ARPE即ARR自动重装载寄存器是否开启影子寄存器,也叫做缓冲。
ARPE=1:TIMx_ARR寄存器没有缓冲;即关闭影子寄存器,预装载寄存器的内容直接传送到影子寄存器。
APPE=0:TIMx_ARR寄存器具有缓冲;即开启影子寄存器。当ARR被重新赋值之后,必须在下一次更新事件UEV发生后才能更新影子寄存器的值。(如果想更改完立即同步到影子寄存器,可以通过软件设置UG位产生更新事件)
可以看到图151中ARPE=0时,修改了TIMx_ARR的值为0x36,则计数器在0x36时已产生动作。而在图152中,ARPE=1,在计数器还未达到0x36时,将ARR的修改为0x36,但是在计数器=0x36时却为产生更新,在计数器达到上次ARR的值0xF5产生更新事件之后,ARR的值(影子寄存器)才更新为0x36。
2.2.5.2 TIMx_DIER、TIMx_SR、TIMx_EGR
这些寄存器的标志位有些多且易混杂,在此统一列出,方便分辨。
- UDE 跟新DMA请求使能;UDE=0,禁止更新DMA请求;UDE=1,使能更新DMA请求。
- UIE 更新中断使能;UIE=0,禁止更新中断;UIE=1,使能更新中断。
- UIF 更新中断标志位;UIF=1表示产生更新中断,UIF=0表示未产生更新中断。
- UG 是否开启软件产生更新事件。UG=1表示由软件产生更新中断。
这么多标志位,除了时基单元的寄存器,实际在我们定时器定时的时候,只需要用到:
TIMx_CR1->CEN :计数器使能
TIMx_DIER->UIE:允许中断
TIMx_SR->UIF:是否产生中断;清除中断标志位
2.3 如何在STM32中进行基本定时器定时
例如若使用TIM6定时器定时1ms产生中断,则需要以下几个步骤
- TIM6时钟使能
- 初始化定时器参数(自动装载值、预分频系数、计数方式等)
- 设置TIM6允许中断(TIMx_DIER->UIE)
- 设置NVIC中断优先级
- 使能TIM6(TIMx_CR1->CEN )
- 编写中断服务函数(判断中断标志位和清楚中断标志位:TIMx_SR->UIF)
通过这几个步骤,就能实现使用基本定时器来定时产生更新中断。