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;