嵌入式(5定时器编程)

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)都有影子寄存器。对应的使能或失能预装载寄存器的固件库函数如下表:

寄存器固件库函数例如
ARRvoid TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState Newstate)TIM_ARRPreloadConfig(TIM2, ENABLE);
PSCvoid TIM_PrescalerConfig(TIM_TypeDef* TIMx, u16 Prescaler,u16 TIM_PSCReloadMode)TIM_PrescalerConfig(TIM2, TIMPrescaler, TIM_PSCReloadMode_Immediate);
CCRxvoid TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload)TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

其中PSC寄存器第二个参数设置预分频值,可以为0~65535,建议不要取0。最后一个参数TIM_PSCReloadMode选择预分频重载模式,具体取值如下表:

TIM_PSCReloadMode描述
TIM_PSCReloadMode_UpdateTIM预分频值在更新事件装入
TIM_PSCReloadMode_ImmediateTIM预分频值即时装入

设置影子寄存器的好处是,所有真正起作用的影子寄存器(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个设置寄存器

TIM

定义的代码这里不再给出,大家可以参照<<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代表定时器的计数模式,其可以设置的值如下:

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向内核申请中断。

ITConfig

参数TIM_IT的值如下图:

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等),特别适合于电机控制。

高级定时器和通用定时器配置的不同之处:

高级定时器有多个中断通道:

TIM高级


脑图

脑图



普通定时器和高级定时器课程学习目前较少,日后学习过后一定补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值