STM32定时器与PWM快速使用入门

yewuyi   2008-10-31 15:56 楼主
STM32  定时器与 PWM 快速使用入门

要求:在 万利的开发板 EK-STM32F 上产生 周期为1秒,占空比分别为 50% 10%的 PWM
       并且点亮 板上的 LD1,LD2 灯闪烁。
       
       做法很简单。
       
        STM32的PWM是由 定时器来产生的。
       
        可以看出 。定时器3的通道1至4在GPIO端口的映像。如果是完全映射。
        各通道的连接引脚如下:
        CH1=PC6,     CH2=PC7,     CH3=PC8,     CH4=PC9
        
        这样,刚好与板上的LD1,LD2灯符合,因为LD1连接到PC7,LD2连接到PC6引脚。
        
        关于PWM一些知识. 
        
        STM32的TIMx 是 TIMx_ARR 寄存器确定频率(周期)、由TIMx_CCRx  寄存器确定占空比的信号。
        
        使用定时器3。而TIM2、3、4的时钟源是 APB1 即是 PCLK1  ( APB1 对应 PCLK1 )
    PCLK1 = APB1 = HCLK/2 = SYSCLK/2 = 36MHZ (36,000,000 HZ)
        但是注意: 倍频器会自动倍2, 即是 【72MHZ】!
        
        代码如下:
        
void 
STM32_PWM_GPIO_Configuration(void)
{  
        // 11:完全映像
         STM32_Afio_Regs->mapr.bit.TIM3_REMAP=3;
         
        // LD1 =P7 LD2=PC6
         /*GPIOA Configuration: ( PC6 PC7 ) TIM3 channel 1 and 2 as alternate function push-pull */
    STM32_Gpioc_Regs->crl.bit.CNF6=Output_Af_push_pull;   // PC.06 复用功能推挽输出模式
    STM32_Gpioc_Regs->crl.bit.MODE6=Output_Mode_50mhz;    // PC.06 输出模式,最大速度50MHz

    STM32_Gpioc_Regs->crl.bit.CNF7=Output_Af_push_pull;   // PC.07 复用功能推挽输出模式
    STM32_Gpioc_Regs->crl.bit.MODE7=Output_Mode_50mhz;    // PC.07 输出模式,最大速度50MHz
    
}//end sub
    
        
        
void 
STM32_TIM3_Configuration(void)
{        
       //  TIM_DeInit( TIM3);//复位TIM3定时器      
      STM32_Rcc_Regs->apb1rstr.all |=  RCC_TIM3RST;
      STM32_Rcc_Regs->apb1rstr.all &= ~RCC_TIM3RST;
        //时钟使能
        STM32_Rcc_Regs->apb1enr.all |=RCC_TIM3EN;        
         
      /* TIM3 base configuration */
      //TIM_TimeBaseStructure.TIM_Period = 9999;
      //TIM_TimeBaseStructure.TIM_Prescaler = 7200;
      //TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
      //TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
      //TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    STM32_Tim3_Regs->arr.all=9999;  //   定时周期,PWM频率! 10毫秒*100=1秒 
    STM32_Tim3_Regs->psc.all=720;    //  7200分频        72MHZ/72,00  72,000,000/72,00=10,000
    STM32_Tim3_Regs->cr1.bit.CKD=0; //  时钟分频因子
    STM32_Tim3_Regs->cr1.bit.DIR=0; //  0:计数器向上计数        
    
      /* Clear TIM3 update pending flag[清除TIM3溢出中断标志] */
      //TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    STM32_Tim3_Regs->sr.bit.UIF=0;    //更新中断标记 由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化
        

      /* PWM1 Mode configuration: Channel1  Channel2 */
        //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        //TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
        //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        //TIM_OC1Init(TIM3, &TIM_OCInitStructure);
        
        // timer3 的  通道1 是 PC6 引脚, AFIO完全映射
    STM32_Tim3_Regs->ccer.bit.CC1P=0; // 输入/捕获1输出极性  0:OC1高电平有效   1:OC1低电平有效
    STM32_Tim3_Regs->ccer.bit.CC1E=1; // 输入/捕获1输出使能  1: 开启- OC1信号输出到对应的输出引脚。
        
    STM32_Tim3_Regs->ccer.bit.CC2P=0; // 输入/捕获2输出极性  0:OC1高电平有效   1:OC1低电平有效
    STM32_Tim3_Regs->ccer.bit.CC2E=1; // 输入/捕获2输出使能  1: 开启- OC2信号输出到对应的输出引脚。
        
        STM32_Tim3_Regs->ccmr1.ou_bit.CC1S=0;//00:输出比较1 通道1 被配置为输出
        STM32_Tim3_Regs->ccmr1.ou_bit.CC2S=0;//00:输出比较2 通道2 被配置为输出
        
        STM32_Tim3_Regs->ccmr1.ou_bit.OC1M=6;//0110:PWM模式1
        STM32_Tim3_Regs->ccmr1.ou_bit.OC2M=6;//0110:PWM模式1
        
        
        STM32_Tim3_Regs->ccr1.all=5000;// 占空比 50%
        STM32_Tim3_Regs->ccr2.all=1000;// 10%
        
       // TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
        STM32_Tim3_Regs->ccmr1.ou_bit.OC1PE=1; //OC1PE:输出比较1预装载使能1:开启TIMx_CCR1寄存器的预装载功能       
        STM32_Tim3_Regs->ccmr1.ou_bit.OC2PE=1; //OC1PE:输出比较2预装载使能1:开启TIMx_CCR2寄存器的预装载功能    

        
        //TIM_ARRPreloadConfig(TIM3, ENABLE);
        STM32_Tim3_Regs->cr1.bit.ARPE=1;     // 7    自动重装载预装载允许位    0:TIM1_ARR寄存器没有缓冲
        
        // TIM3 enable counter 
        //TIM_Cmd(TIM3, ENABLE);
      STM32_Tim3_Regs->cr1.bit.CEN=1;//    开启计数器
        
        STM32_Tim3_Regs->egr.bit.UG=1; //触发一次事件中断。
        STM32_Tim3_Regs->sr.bit.UIF=0;
        
      
}//end sub 
       
   希望对各位初学者了解STM32的TIMx和PWM有帮助。    


回复评论 (7)

自己顶。

STM32的CAN 和万利的入门级EK-STM32F开发板的CAN口,
自发自收不知道可否,

下次搞搞STM32 CAN 开速使用入门!
点赞  2008-11-4 14:22

支持CAN?

                                 这个好
点赞  2008-11-4 17:02

环回模式

                                  
点赞  2008-11-5 11:42
为什么我将 TIM_TimeBaseStructure.TIM_Period = 9999;改成STM32_Tim3_Regs->arr.all=9999;
后编译会出现Error[Pe020]: identifier "STM32_Tim3_Regs" is undefined C:\Documents and Settings\Administrator\桌面\LCDDemo\project\main.c 397
要怎么样才改才能通过呢!
点赞  2010-3-1 14:07
STM32_Tim3_Regs->arr.all=9999;

你为什么会这样写?哪里抄来的?
点赞  2010-3-1 14:08
                                 就是上面写的这样的嘛!我想按照一楼程序那样试一下,结果重建出错了!
点赞  2010-3-2 10:03
                                 就是楼主的程序中这么写的!
点赞  2010-3-2 10:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复