TIM1
是 STM32
的高级定时器,功能很强大,它的每个通道都有对应的互补通道用来互补输出PWM。之前没使用过,今天要用来做 PWM
控制,花了好一番功夫才搞定。
- 记录下初始化代码:
void Led_PWM_Init(u16 arr, u32 ckCnt, u16 CCR1_Val)
{
uint16_t pscValue = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
GPIO_Config(); //PWM控制引脚初始化
TIM_DeInit(TIM1);
/* Time Base configuration */
pscValue = (uint16_t)(SystemCoreClock / ckCnt) - 1;
TIM_TimeBaseStructure.TIM_Prescaler = pscValue ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //高级定时器特有
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Channel 1, 2,3 and 4 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //占空比
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
}
高级定时器做PWM的话和其他定时器一样的使用。只是配置不一样。
对于高级定时器来说,要有这句TIM_CtrlPWMOutputs(TIM1, ENABLE);
使能PWM输出。
由于只是使用TIM1的通道1的互补通道,所以关闭通道1的 PWM
输出
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
打开通道1的互补通道
的PWM
的输出
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
百度和对照别人的代码,搞了好久也没搞定不能控制亮度。后来发现是没有这句
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
上面这句要和下面这句设置相反:
一个是TIM_OCIdleState_Reset
、另一个是TIM_OCNIdleState_Set
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;