
一、STM32定时器分类众多,按照内核、外核标准分为两部分:核内定时器+核外定时器 1)核内定时器:Systick 2)外设定时器:特定应用定时器+常规定时器 3)特定应用定时器:LPTIM,RTC,WTD,HRTIM 4)常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2~TIM5,TIM9~TIM14)、高级定时器(TIM1&TIM8) 【常规定时器:
按照计数器的位宽来分:分为3部分 1)16bit定时器 2)32bit定时器(TIM2、TIM5) 3)24bit定时器(Systick) 二、三种定时器(高级&通用&基本)区别 对于STM32F4XX,三种定时器(高级、通用、基本)的区别如下表 根据以上表格,可以看出1)高级定时器(TIM1&TIM8)是16bit,支持向上、向下、向上/向下计数模式,可以产生DMA请求,捕获/比较通道有4个,支持互补输出(带可编程死区的互补输出)2)通用定时器又分为三种,32bit(TIM2&TIM5)和16bit(TIM3&TIM4),这两种支持向上、向下、向上/向下计数模式,且都可以产生DMA请求,捕获/比较通道4个,16bit(TIM9~TIM14)只能向上计数,不能产生DMA请求,捕获/比较通道只有2个,没有这三种都无互补输出,都能应用于定时器技术,PWM输出,输入捕获,输出比较。可以认为TIM9~TIM14是TIM2&TIM5&TIM3&TIM4的简单版本。3)基本定时器(TIM6&TIM7)是16bit,支持向上、向下、向上/向下计数,可以产生DMA请求,没有捕获/比较通道和互补输出,只能用于驱动DAC。 三、通用定时器的特性(以TIM2.TIM3,TIM4.TIM5为例) 1)16bit/32bit递增、递减、递增/递减(中心对齐)计数模式,自动重载计数器; ![]() 2)16bit可编程预分频器(可实时修改),用于对计数器时钟进行分频,分频系数介于1~65535之间; 3)多达4个独立通道 --输入捕获 --输出比较 --PWM生成(边沿和中心对齐模式) --单脉冲模式输出 4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用1个定时器控制另外一个定时器)同步电路 5)如下事件发生时,可以产生中断/DMA请求(6个独立的IRQ/DMA请求生成器)
6)STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM) 7)使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个us到几个毫秒之间调整。SMT32的每个通用定时器都是完全独立的,没有互相共享的任何资源。 四、计数器模式 通用定时器可以向上、向下、向上/向下双向计数模式
![]() 五、定时器框图分析 ![]() 框图可以分为以下4个部分 第一部分:定时器时钟源 定时器时钟可由下列时钟源提供:
第二部分:时基单元:主要包括预分频寄存器(TIMx_PSC)、自动重装载寄存器(TIMx_ARR)、计数器寄存器(TIMx_CNT) 第三部分:输入捕获通道 第四部分:输出比较通道 六、PWM输出 PWM输出主要用到定时器框图中的第四部分:时基单元和输出比较通道 PWM工作过程(通道1为例) ![]() CCR1:捕获/比较值寄存器(x=1,2,3,4),设置比较值 CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或PWM模式2【111】 CCER:CC1P位:捕获/比较1输出极性,0:高电平有效,1:低电平有效 CCER:CC1E位:捕获/比较1输出使能,0:OC1关闭,1:OC1打开 PWM模式1;在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为无效状态 (OC1REF=0),否则为有效状态 (OC1REF=1)。 PWM模式2:在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为无效状态,否则为有效状态。在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。 注意:在 PWM 模式 1 或 PWM 模式 2 下,仅当比较结果发生改变或输出比较模式由“冻结”模式切换到“PWM”模式时, OCREF 电平才会发生更改 如下图就是PWM模式2的例子 ![]() 当配置某个IO口为PWM1模式,TIMx_CNT<TIM_CCR1,通道1无效,输出低电平,当TIMx_CNT>=TIM_CCR1,通道1有效,输出高电平。 PWM模式本质是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入"110-PWM模式1","111-PWM模式2",能够独立地设置每个OCx输出通道产生一路PWM,必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最好还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。 注意:此处提到的“必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器...”目的是满足一些特殊的需求,使能预装载的意义在于可以多个通道同时输出时,时序能准确地同步。网上的一段有意义的解释是:设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。可见如果只是单通道输出,多通道输出时没时序精准的同步更新要求,不使能也可以的。 七、PWM编程 1)要求:使用TIM14的PWM功能,输出频率不变,占空比变化的PWM波,驱动LED灯,达到LED的亮度由暗变亮,由从亮变暗,如此往复。 2)编程步骤 2-1,使能定时器时钟和对应的GPIO时钟, 2-2 初始化IO口为复用功能输出,并将复用功能映射到对应的定时器 2-3 初始化定时器,ARR,PSC等 2-4 初始化输出比较参数 2-5 使能预装载寄存器和ARPE位 2-6 使能定时器 2-7不断改变比较值CCRx,达到不同的占空比; ![]() 在功能函数中,我们初始化要设置好arr和psc,TIM14采用的APB1(42MHz)经过2倍的倍频获得的频率(84MHz),预分频系数设置为84,那么PWM的频率为1MHZ,自动重装载值arr=500,则PWM的频率为1MHZ/500=2kHz。 TIM14_PWM_Init(500-1,84-1); //1Mhz的计数频率,2Khz的PWM. u16 led0pwmval=0; u8 dir=1; pwm_func{ if(dir)led0pwmval++; else led0pwmval--; if(led0pwmval>300)dir=0;//实测当TIM_CNT大于300时,亮度变化不明显,故此处设置为300为最亮 if(led0pwmval==0) dir=1; TIM14->CCR1 =led0pwmval; 转载自:diandianmo |
经验分享 | 更改STM32定时器周期后的输出疑问分析
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
定时器剩余通道是否可以做PWM输出呢?
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形
【NUCLEO-U545RE-Q评测】5. 基本计时器