首页 > 其他 > 详细

STM32重映射和PWM控制

时间:2019-10-09 00:07:29      阅读:150      评论:0      收藏:0      [点我收藏+]

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

STM32重映射和PWM控制

原文:https://www.cnblogs.com/AresGuangjie/p/11638808.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!