STM32 配置定时器让引脚输出PWM波形

      最近一个项目需要控制比较多的步进电机,而且还要求步进电机能几个同时转,用软件计时然后定时翻转IO脚太麻烦了,也不好用,好在STM32可以通过配置定时器让特定引脚输出PWM波形,配置好后打开输出,使能定时器,然后只需要在中断中判断是否应该停止即可。附定时器配置代码:

 

/*   
 * 函数名:void TIMx_PWMOutConf(TIM_TypeDef * TIMx,uint32_t RCC_APB1Periph)
 * 描述  :初始化通用定时器TIMx作为PWM输出  
 * 输入  :TIMx: where x can be 1 to 17 to select the TIM peripheral,定时器时钟地址,通道编号
 * 输出  :无   
 */ 
void TIMx_PWMOutConf(TIM_TypeDef * TIMx,uint8_t TIMx_Channelx,uint32_t RCC_APB1Periph_TIMx)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    TIM_DeInit(TIMx);
    
    /*开启TIM时钟*/
    if(RCC_APB2Periph_TIM8 == RCC_APB1Periph_TIMx || RCC_APB2Periph_TIM1 == RCC_APB1Periph_TIMx)
    {
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);
    }
    else
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);
    }
    
    /*设置周期*/
    TIM_TimeBaseInitStructure.TIM_Period = PWM_INIT_PERIOD;
    /*设置定时器时钟频率*/
    TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_INIT_PRESCALER;
    /*向上计数模式*/
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    /*设置TIMx预分频寄存器和自动重装寄存器*/
    TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);
    
    /*要设置TIMx_CR1 寄存器的ARPE 位,使TIMx_ARR 寄存器具有缓冲*/
    TIM_ARRPreloadConfig(TIMx,ENABLE);
    /* PWM1模式 在向上计数时,一旦TIMx_CNT<TIMx_CCR1 时通道1为有效电平,否则为
    无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1 时通道1 为无效电平
    (OC1REF=0) ,否则为有效电平(OC1REF=1) */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    /*有效电平为高电平*/
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    /*设置占空比*/
    TIM_OCInitStructure.TIM_Pulse = PWM_INIT_DUTY_CYCLE;
    /*允许PWM输出*/
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    switch(TIMx_Channelx)
    {
        case 1:
        {
            /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
            TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable ); 
            TIM_OC1Init(TIMx,& TIM_OCInitStructure);
            /*允许比较中断*/
            TIM_ITConfig(TIMx,TIM_IT_CC1,ENABLE);
        }break;
        
        case 2:
        {
            /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
            TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable ); 
            TIM_OC2Init(TIMx,& TIM_OCInitStructure);
            /*允许比较中断*/
            TIM_ITConfig(TIMx,TIM_IT_CC2,ENABLE);
        }break;
        
        case 3:
        {
            /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
            TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable ); 
            TIM_OC3Init(TIMx,& TIM_OCInitStructure);
            /*允许比较中断*/
            TIM_ITConfig(TIMx,TIM_IT_CC3,ENABLE);
        }break;
        
        case 4:
        {
            /*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
            TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable ); 
            TIM_OC4Init(TIMx,& TIM_OCInitStructure);
            /*允许比较中断*/
            TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE);
        }break;

        default:
            break;
    }

    if(RCC_APB2Periph_TIM8 == RCC_APB1Periph_TIMx || RCC_APB2Periph_TIM1 == RCC_APB1Periph_TIMx)
    {
         TIM_CtrlPWMOutputs(TIMx, ENABLE);
    }
}


转载于:https://my.oschina.net/FuXiRuo/blog/474306

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值