STM32——TIM定时器日记之3.doc
文本预览下载声明
1、PWM输出模式
TIM_Period配置是代表波形的周期,因此其数值一定要比输出配置中TIM_OCInitStructure.TIM_Pulse的数值大。(如TIM_Period = 0x3E7则波形频率为TIMCLK/(0x3E7+1))且只要TIM_Period 不为零,则其TIMCLK为系统频率的一半。
TIM_Prescaler是在上述基础上再分频(如TIM_TimeBaseStructure.TIM_Prescaler = 0x2,以1中配置为例,则输出波形频率变为TIMCLK/(0x3E7+1)/(0x2+1))。若此时TIM_OCInitStructure.TIM_Pulse = CCR1_Val;(例如CCR1_Val=15则占空比为:CCR1_Val/(TIM_Period+1))所以TIM_Prescaler之改变输出波形的周期,并不改变占空比。
2、TIM_OCMode_Toggle TIM输出比较触发模式
此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。即TIM_TimeBaseStructure.TIM_Period配置大小对输出波形的频率没有影响(但是TIM_Period的值一定要大于TIM_OCInitStructure.TIM_Pulse,否则还没来得及更新时间就产生中断,这样结果肯定就会错误)
例如下面程序:
vu16 CCR2_Val = 0x4000;
TIM_TimeBaseStructure.TIM_Period = 0xFFF5;
TIM_TimeBaseStructure.TIM_Prescaler = 0x02;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);
/* Output Compare Toggle Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInit(TIM2, TIM_OCInitStructure);
TIM2 Configuration: 输出比较模式:
TIM2CLK = 36 MHz, Prescaler = 0x2, 所以TIM2 counter clock = 12 MHz
CC1 update rate (更新频率)= TIM2 counter clock / CCR1_Val = 366.2 Hz
3、TIM输出比较时间模式
在这种模式下TIM的计数时钟频率为TIM2CLK/TIM_PrescalerConfig,且TIMCLK同前面一样,只要TIM_Period不为零,就是系统时钟的一半。如下例子:系统时钟72M,所以TIMCLK=36M,而TIM_PrescalerConfig配置为36000,所以TIM计数时钟频率为1000HZ。由下面CCR1_Val=250可知,第一次中断发生在0.25s后,由于中断程序中TIM_SetCompare1(TIM2, capture + CCR1_Val);将比较值设置为两倍,所以以后每次都是0.5s产生一次中断来点亮LED.同理其他三个LED每隔1s,2s,3s点亮一次。(值得注意的是中断中每次都需要更新比较值,还有就是TIM_Period的值只要不是零或小于用于比较的值,其大小不会影响结果)。
vu16 CCR1_Val = 250;
vu16 CCR2_Val = 500;
vu16 CCR3_Val = 1000;
vu16 CCR4_Val = 1500;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
T
显示全部