STM32单片机定时器的分类
- 通用定时器:TIM2~TIM5,(TIM9~TIM14,部分含大容量flash的stm32单片机有,一般以字母F或G结尾)。
- 基本定时器:TIM6和TIM7。
- 高级定时器:小容量、中容量和互联型STM32单片机只有1个高级控制定时器TIM1,而大容量STM32单片机有2个高级控制定时器TIM1和TIM8。
STM32单片机的通用定时器
通用定时器的定时、计数机制
时基单元
通用定时器的时基单元包含:①16位的计数器(TIMx_CNT),②16位的预分频器寄存器(TIMx_PSC),③16位的自动装载寄存器(TIMx_ARR)。
定时时间 = CK_PSC周期 * TIMx_PSC * TIMx_ARR
定时频率 = fCK_PSC / TIMx_PSC / TIMx_ARR
TIMx_PSC(预分频器寄存器):它是一个16位寄存器,可以将计数器的始终频率按1到216之间的任意值分频。(建议不要设置为0,下载程序时有时会出故障)。
TIMx_CNT(计数器寄存器):16位计数器,由CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)为1时,CK_CNT才有效。
TIMx_ARR(自动装载寄存器):一个16位寄存器(带有缓冲器,即影子寄存器),可能取值为2到65536。
预装载寄存器(preload register)与影子寄存器(shadow register)
上图带阴影部分的寄存器,物理上这样的寄存器对应两个寄存器,一个是我们能够操作的,称为预装载寄存器,另一个是我们无法操作的,但在操作中实际起作用的寄存器,称为影子寄存器。
- 例如:根据TIMx_CR1寄存器中ARPE位(ARPE:Auto-reload preload enable,自动重装载预装载允许位) 的设置
- ARPE =0(默认值):TIMx_ARR寄存器的内容可以随时传递到其影子寄存器中,即两个寄存器是连通的,禁止预装载功能。
- ARPE =1:TIMx_ARR寄存器的内容在每一次更新事件(UEV)发生时,才传送到其影子寄存器中,开启预装载功能。
- 更新事件:当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时,产生更新事件。更新事件也可以由软件产生。
ARR( Auto Reload Register)、PSC(Prescaler)、CCRx(Capture/Compare Register x)都有影子寄存器。对应的使能或失能预装载寄存器的固件库函数如下表:
寄存器 | 固件库函数 | 例如 |
---|---|---|
ARR | void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState Newstate) | TIM_ARRPreloadConfig(TIM2, ENABLE); |
PSC | void TIM_PrescalerConfig(TIM_TypeDef* TIMx, u16 Prescaler,u16 TIM_PSCReloadMode) | TIM_PrescalerConfig(TIM2, TIMPrescaler, TIM_PSCReloadMode_Immediate); |
CCRx | void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload) | TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); |
其中PSC寄存器第二个参数设置预分频值,可以为0~65535,建议不要取0。最后一个参数TIM_PSCReloadMode选择预分频重载模式,具体取值如下表:
TIM_PSCReloadMode | 描述 |
---|---|
TIM_PSCReloadMode_Update | TIM预分频值在更新事件装入 |
TIM_PSCReloadMode_Immediate | TIM预分频值即时装入 |
设置影子寄存器的好处是,所有真正起作用的影子寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的预装载寄存器(preload register)的内容,这样可以保证多个通道的操作能够准确地同步。
计数模式
- 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数,并且产生一个计数器溢出(即更新)事件或中断。
- 向下计数模式:计数器从自动加载值(TIMx_ARR计数器的内容)开始向下计数到0,然后从自动装入的值开始重新向下计数,并且产生一个计数器向下溢出(即更新)事件或中断。
- 中心对称计数模式:计数器从0开始向上计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器溢出(即更新)事件或中断;然后向下计数到1,产生一个计数器下溢(即更新)事件或中断;之后再从0开始重新向上计数。
TIMx_ARR寄存器内容发生变化时,若ARPE = 0时,自动装载寄存器的内容随时可以传递到影子寄存器中,若ARPE = 1时,自动装载寄存器的内容在每一次更新事件发生时,才传递到影子寄存器。
计数器的时钟源
- 通用定时器的工作模式:
- 内部时钟模式,即关闭从模式,或称直通模式。SMS=0,并且CEN位=1,即CK_PSC=CK_INT(默认)
- 从模式(SMS[2:0]:从模式选择 )
- 复位模式(SMS=100):选中的触发输入(TRGI)的上升沿,重新初始化计数器,并且产生一个更新寄存器的信号。
- 门控模式(SMS=101):当触发输入(TRGI)为高时,计数器的时钟开启;一旦触发输入变为低,则计数器停止(但不复位)。计数器的启动和停止都是受控的。
- 触发模式(SMS=110):计数器在触发输入TRGI的上升沿:启动计数(但不复位),只有计数器的启动是受控的。
- 外部时钟模式1(SMS=111):选中的触发输入(TRGI)的上升沿驱动计数器,来1个上升沿,计数器+1。
- 编码模式1、2、3。
定时器的时钟不是直接来自APB1 或APB2,而是来自于输入为APB1 或APB2 的一个倍频器,当APB1或APB2的预分频系数为1 时,这个倍频器不起作用,定时器的时钟频率等于APBx的频率。设置倍频器的目的是保证其它外设使用较低时钟频率时,TIM2~7 仍能得到较高的时钟频率。
通用定时器的定时配置
设置TIMx的内部时钟
计数器的时钟源若来自于内部时钟:则使用RCC_Configuration( )函数,来设置TIMx的内部时钟;若来自外部时钟,则不用设置。
TIM(通用定时器)定义
每个TIM共有18个设置寄存器
定义的代码这里不再给出,大家可以参照<<stm32固件库使用手册>>
使能TIMx对应外设的时钟
RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE);
使能的时候一定要注意自己使用的是那个时钟,如果使用的是高速时钟,它是挂载在APB2总线上的,通用定时器和基本定时器是挂载在APB1总线上的。
复位通用定时器TIMx
TIM_DeInit(TIMx);
复位时为了使ARPE=0,让自动装载寄存器与影子寄存器直接连通。单片机上电即复位,所以一般可以省略。
TIMx的时基单元的参数设置
// TIM_TimeBaseInitTypeDef结构体定义了TIMx的时基单元的参数
typedef struct
{
u16 TIM_Period; // 设置通用定时器TIMx的周期值(TIMx_ARR = TIM_Period + 1)
u16 TIM_Prescaler; // 设置通用定时器TIMx的预分频值(TIMx_PSC = TIM_Prescaler + 1)
u8 TIM_ClockDivision; // 不用于定时,仅仅用于计数,用于定时时不用设置
u16 TIM_CounterMode; // 设置通用定时器TIMx的计数模式
} TIM_TimeBaseInitTypeDef;
TIM_CounterMode代表定时器的计数模式,其可以设置的值如下:
定时器的计数模式由TIMx_CR1来控制
- CMS[1:0]:选择中央对齐模式
- 00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。DIR=0向上计数,DIR=1向下计数。
- 01:中央对齐模式1。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位CCxIF ,只在计数器向下计数时被设置。
- 10:中央对齐模式2。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位CCxIF ,只在计数器向上计数时被设置。
- 11:中央对齐模式3。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位CCxIF ,在计数器向上和向下计数时均被设置。
注:在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式。
初始化TIMx时基单元
TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure); //初始化通用定时器TIMx
使能或失能TIMx外设
TIM_Cmd(TIMx,ENABLE); // 使能TIMx外设
TIM_Cmd(TIMx,DISABLE); // 失能TIMx外设
TIM_ITConfig
外围设备TIMx,具备若干个可以引起中断的中断源或中断事件,该设备的所有的中断都只能通过指定的“中断通道”TIMx_IRQChannel向内核申请中断。
参数TIM_IT的值如下图:
- TIM_IT_Update:包括上溢和下溢
- TIM_IT_Trigger:上升沿或下降沿触发,用于外部时钟模式1、外部时钟模式2
- 用或运算符“|”可以取上表的一个或者多个取值的组合,即可选择多个中断源。
- 注意:此处,不能选择TIMx中断通道的DMA中断源,它是通过TIM_DMAConfig()函数来设置。
注:每次进入中断后都需要清除中断标志位:TIM_ClearFlag(TIMx, TIM_Flag_Update);
STM32单片机的基本定时器
- 基本定时器TIM6和TIM7各包含一个时基单元(即16位计数器+16位预分频器+16位自动装载寄存器)。
- 不包含输入捕获单元、输出比较单元等。
- 计数模式:只有向上计数模式(没有向下、中央对齐模式)
- 它们可以为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。
- 这2个定时器是互相独立的,不共享任何资源。
STM32单片机的高级定时器
- 高级控制定时器(TIM1和TIM8)各包含:
- 一个时基单元(即16位计数器+16位预分频器+16位自动装载寄存器)
- 一个输入捕获单元(包含4个输入捕获通道)
- 一个输出比较单元(包含4个输出比较通道:其中3个通道可输出互补信号,故该单元共可以输出7路信号)
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等),特别适合于电机控制。
高级定时器和通用定时器配置的不同之处:
高级定时器有多个中断通道:
脑图
普通定时器和高级定时器课程学习目前较少,日后学习过后一定补充。