由于玩 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 通道真正的未重映射前的管脚
来源: http://www.bubuko.com/infodetail-3231624.html