由於玩STM32的時候很少用它的重映射功能,所以做項目的時候需要PWM控制光強,用的是PB5控制。看了下手冊,這不是定時器的PWM通道管腳啊,后來在硬件的提醒下才想起來STM32管腳可以重映射,都忘了這茬了。唉!真是太菜。
TIM3_CH2
實際的引腳是PA7
,可以通過部分重映射到PB5
,這樣就可以通過PB5
輸出PWM信號。
初始化代碼:
void LED_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //重映射PA7為PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void LED_PWM_Init(uint16_t arr,uint32_t ck_cnt,uint16_t CCR2_Val)
{
uint16_t PrescalerValue;
// GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //復用功能模塊時鍾
LED_GPIO_Init();
/* Time base configuration */
PrescalerValue = (uint16_t) (SystemCoreClock / ck_cnt) - 1; //計算分頻值
TIM_TimeBaseStructure.TIM_Period = arr; //自動重裝載寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; //設置用來作為TIMx時鍾頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //與數字濾波器(ETR,TIx)使用的采樣頻率之間的分頻比例
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸出比較使能
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStructure); //初始化TIM3_CH2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3_CH2重裝載
// TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
// TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
注意事項:
初始化的管腳還是原來的PB5,而不是定時器PWM通道真正的未重映射前的管腳