STM32系列的CPU,有多达8个定时器1.其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,APB22.其他6个为普通定时器,APB1定时器的作用:1.定时2.计数3.输入捕获4.匹配输出5.PWM脉冲波功能描述:定时器还可以与定时器形成级联,组建更大的定时范围。NOTE:只要你使用默认的库配置方式配置时钟为72M,无论TIM1还是TIMX,他们的计数器频率都是72M。一、关于框图:TIMx_ETR:TIMER外部触发引脚ETR:外部触发输入ETRP:分频后的外部触发输入ETRF:滤波后的外部触发输入ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。TI1FP1/2:滤波后定时器1/2的输入TRGI:触发输入TRGO:触发输出CK_PSC:应该叫分频器时钟输入CK_CNT:定时器时钟。(定时周期的计算就靠它)TIMx_CHx:TIMER的输入脚TIx:应该叫做定时器输入信号xICx:输入比较xICxPS:分频后的ICxOCx:输出捕获xOCxREF:输出参考信号关于框图要注意的:1.时钟源(参考STM32定时器时钟源)2.输入滤波(参考STM32定时器的输入滤波机制)3.输入引脚和输出引脚是相同的。二、时基:时基单元包含:●预分频器寄存器(TIMx_PSC)●计数器寄存器(TIMx_CNT)●自动装载寄存器(TIMx_ARR)CNT的计数方式分三种:向上、向下、中央对齐。通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1.三、时钟源:1.内部时钟(参考STM32定时器时钟源)2.外部时钟模式1以T2举例例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:1.配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿2.配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)注:捕获预分频器不用作触发,所以不需要对它进行配置3.配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性4.配置TIMx_SMCR寄存器的SMS=’111’,选择定时器外部时钟模式15.配置TIMx_SMCR寄存器中的TS=’110’,选定TI2作为触发输入源6.设置TIMx_CR1寄存器的CEN=’1’,启动计数器当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。3.外部时钟模式2选定此模式的方法为:令TIMx_SMCR寄存器中的ECE=1计数器能够在外部触发ETR的每一个上升沿或下降沿计数。例如,要配置在ETR下每2个上升沿计数一次的向上计数器,使用下列步骤:1.本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF[3:0]=00002.设置预分频器,置TIMx_SMCR寄存器中的ETPS[1:0]=013.设置在ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=04.开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=15.启动计数器,置TIMx_CR1寄存器中的CEN=1计数器在每2个ETR上升沿计数一次。从图上可以看出ETR可以直接作为时钟输入也可以通过触发输入(TRGI)来作为时钟输入即在时钟模式1中触发源选择为ETR,两个效果上是一样的,看起来好像这个外部时钟模式2没什么用处,实际上不是的,他可以跟一些从模式(复位、触发、门控)进行组合。比如当从模式选为触发时,我们不可能再通过触发源选择ETR了,因为从模式控制器被占了,好在有外部时钟模式2,我们选择这种模式后就可以把两者组合在一起完成一些功能了。总结一下,STM32的时钟选择比较特别,在SFR中关于时钟选择配置位不再一块,不是说两个位在一起00、01、11就选择了而是由SMCR中SMS和ECE来控制,这样感觉可以吧内部时钟与外部模式2同时打开(SMS:000,ECE:1),也可以吧外部模式1和外部模式2同时打开(SMS:111,ECE:1),实际上上述两种方式用的都是外部时钟2.1.PWM输出模式俩模式,在CCMRX寄存器中OCXM位确定110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。注1:一旦LOCK级别设为3(TIMx_BDTR寄存器中的LOCK位)并且CC1S=’00’(该通道配置成输出)则该位不能被修改。注2:在PWM模式1或PWM模式2中,只有当比较结果改变了或在输出比较模式中从冻结模式切换到PWM模式时,OC1REF电平才改变。ARR、计数模式PWMCCR2.PWM的管脚确定的、引脚映射、部分映射、完全映射…3.PWM输出信号PWM输出的是一个方波信号,信号的频率是由TIMX的时钟频率和TIMx_ARR预分频所决定的。而输出信号的占空比则是由TIMx_CCRx寄存器确定的。其公式为“占空比=(TIMx_CCRx/TIMx_ARR)*100%”因此,可以通过向CCR中填入适当的数来输出自己所需的频率和占空比的方波信号。4.PWM操作步骤1.设置RCC2.设置GPIO3.设置TIMx定时器的相关寄存器4.设置TIMx定时器的PWM相关寄存器第2步设置GPIO时,GPIO模式应设置为复用推挽输出GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用GPIO_PinRemapConfig()函数进行设置。第4步设置PWM相关寄存器,首先要设置PWM模式(默认情况下PWM是冻结的),然后设置占空比(公式),再设置输出比较极性:当设置位High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要的是要使能TIMx的输出状态和使能TIMx的PWM输出使能。相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了手册中的设置:在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。TIM_ARRPreloadConfig(TIM2,ENABLE);时钟系统:定时器的时钟不是直接来自APB1或APB2,而是来自输入为APB1或APB2的一个倍频器。APB1不但要为TIM2~7提供时钟,而且还要为其他外设提供时钟;设置这个倍频器可以保证其他外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。自动重装载寄存器该寄存器在物理上实际对应着2个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器叫做影子寄存器。事实上真正起作用的是影子寄存器。根据ARPE位的设置:ARPE=0时,预装载寄存器的内容可以随时传送到影子寄存器,此时2者是联通的;而ARPE=1时,在每一次更新事件(UEV)时,才把装载在寄存器的内容传送到影子寄存器。一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器);设计preloadregister和shadowregister的好处是,所有真正需要起作用的寄存器(shadowregister)可以在同一个时间(发生更新事件时)被更新为所对应的preloadregister的内容,这样可以保证多个通道的操作能够准确地同步。分频系数=CK_INT/(TIM_Perscaler+1)OC:输出比较IC:输入捕获