由于玩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通道真正的未重映射前的管脚