
本例程出自STM32MED1开发板附带光盘,其工程目录路径为:\Code Package\Peripheral Devices\06 TIM\0603_PWM_Output。" S6 U) J( h# |6 _2 E / H) K. a7 z4 z! O* { S 高级定时器TIM1的通道1位于GPIOA.8引脚,此管脚正好与开发板上LED1相连,这样就可以通过观察LED1亮度变化来判断TIM1的PWM输出波形变化情况。/ r. d0 i9 O) E' P/ u% K6 T; [. t 通过调用函数TIM1_PWMOutputConfig()可对TIM1的PWM输出进行配置。其代码定义如下:, K& D& O# L5 H0 P: S, c7 ^ 9 y0 o7 f( `# F: ]" a void TIM1_PWMOutputConfig(u16 Period). J1 S+ ~& F! y5 N" Y: \) u8 T { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE); // 1) // (2$ _3 A, \+ E. {3 r$ K GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! R+ |; R+ T! P6 Q GPIO_Init(GPIOA, &GPIO_InitStructure); // 2) & s {# q ?5 e. E" d [7 G // (3 TIM_TimeBaseStructure.TIM_Period = Period; TIM_TimeBaseStructure.TIM_Prescaler = (u16)(SystemCoreClock / 100000) - 1;0 Q0 Q' G3 f( W) d, Y' E TIM_TimeBaseStructure.TIM_ClockDivision = 0;$ i; M R6 C1 ? TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;9 N* c& m7 W, _$ G; ? TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);) y0 s" A; ?% W7 V/ F. o: D w // 3) $ z, y: M# A: W H // (4 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;, h D' p# I. ~+ @ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;4 @; h+ n3 F# h: j$ F d5 G# ~ TIM_OC1Init(TIM1, &TIM_OCInitStructure);! k" N' ~- e2 t" }( }- b" z // 4)' o# U8 Z+ @- O8 Y! O) P0 h ) |) J6 B+ @ V: ^ TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); // 5) ! n' S+ F' d- E" A3 f" F: v7 x5 {" L TIM_ClearFlag(TIM1, TIM_FLAG_Update); // 6)8 Z+ ]( y$ q( l TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 7) TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global); // 8)0 ?9 s4 w4 i0 p9 |; \7 ?" U 3 a7 V( a5 X `; O! F0 S // (9 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;6 E$ h. u6 J ^- _3 K* Y NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;3 U' ]) x. L \' m* b NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 9) " d) _+ p" ?( A1 I TIM_CtrlPWMOutputs(TIM1, ENABLE); // 10) TIM_Cmd(TIM1, ENABLE); // 11) }1 E/ E* w2 N' W; M! A! X! v3 z7 T % w6 T1 y- I( |) z 代码行1)开启GPIOA及TIM1外设的时钟。代码段2)将PA.8管脚配置为复用推挽输出,因此TIM1产生的PWM信号能输出到PA.8管脚。代码段3)是对TIM1的时间基配置。代码段4)配置TIM1的输出比较通道1,将其配置为PWM模式2;起始寄存器TIM1_CCR1的值设为0;开启OC1的输出状态,关闭OC1的互补输出状态。代码行5)关闭OC1通道的预装载功能,使得每次向捕获/比较寄存器中写入的数据立即生效。代码行6)是清除TIM1的更新标志位。代码行7)是开启TIM1的更新中断,代码行8)将更新事件源限制为计时器的上溢或下溢。代码行9)是对TIM1的中断通道进行初始化。代码行10)是开启TIM1的PWM输出。代码行11)是使能TIM1外设。4 p8 D$ [ ?* s/ F ^. N+ F 当TIM1计数器的值达到最大时就会产生更新中断,其中断处理函数定义如下: , ?. a# k3 {- G& F+ @* _ void TIM1_UP_IRQHandler(void)- C/ [* Q; k* W; p" C { if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { . A4 c( j+ I. m: ~ <span style="color: rgb(0, 0, 255);"> if ((CompareValue > PRELOAD_VALUE - INCREMENTS) || (CompareValue |
RE:STM32MED1开发板例程解析(二):定时器的PWM输出