使用STM8S003定时器的PWM功能输出PWM波

时间:2024-03-29 09:54:14

一、使用定时器TIM2的CH1、CH2、CH3通道PWM输出

1. 在使用stm8s系列的单片机的时候,使用的头文件大部分都是通用的stm8s.,第一步修改头文件:

/* Uncomment the line below according to the target STM8S or STM8A device used in your
   application. */

 /* #define STM8S208 */      /*!< STM8S High density devices with CAN */
 /* #define STM8S207  */    /*!< STM8S High density devices without CAN */
 /* #define STM8AF52Ax */    /*!< STM8A High density devices with CAN */
 /* #define STM8AF62Ax */    /*!< STM8A High density devices without CAN */
 /* #define STM8S105 */      /*!< STM8S Medium density devices */
 /* #define STM8AF626x */    /*!< STM8A Medium density devices */
  #define STM8S103       /*!< STM8S Low density devices */
 /* #define STM8S903 */      /*!< STM8S Low density devices */

 

2. 取消stm8s103的注释,103和003的寄存器地址都是一样的,所以我们这里用103替代003.

3. 引脚使用PWM功能时无需配置GPIO状态,直接配置寄存器即可。例如TIM2的库函数配置如下:

    TIM2_TimeBaseInit(TIM2_PRESCALER_1, 7999);         /*    1分频 ,计数值8000,频率=16M/8000=2kHZ   */
   
    /* PWM1 Mode configuration: Channel1 */
    TIM2 Channel1 duty cycle = [TIM2_CCR1/(TIM2_ARR + 1)] * 100 = 50%*/ 
    TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,2000, TIM2_OCPOLARITY_HIGH);
    TIM2_OC1PreloadConfig(ENABLE);


    /* PWM2 Mode configuration: Channel2 */
    TIM2_OC2Init(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE,2000, TIM2_OCPOLARITY_HIGH);
    TIM2_OC2PreloadConfig(ENABLE);


     /* PWM3 Mode configuration: Channel3*/

    TIM2_OC3Init(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE,2000, TIM2_OCPOLARITY_HIGH);
    TIM2_OC3PreloadConfig(ENABLE);
    

    TIM2_Cmd(ENABLE);

4.  配置完成后,调试输出2kHz 占空比为25%的PWM波,如下图所示:使用STM8S003定时器的PWM功能输出PWM波

 

5. 因为TIM2的这3个PWM通道都没有用到Alternative功能,不需要配置Options Bytes。

二、使用定时器TIM1的CH1、CH2、CH3通道的PWM功能

1. TIM1的CH1、CH2为需要配置的引脚复用功能,在调试程序之前,需要配置Option Bytes。AFR0设置为Alternate active.使用STM8S003定时器的PWM功能输出PWM波

使用STM8S003定时器的PWM功能输出PWM波

2. TIM1三通道输出PWM寄存器实例:

  CLK->CKDIVR= 0x00; //内部16M时钟不分频
  TIM2->PSCR = 0x00; //定时器2预分频系数为1
  TIM2->CR1 = 0x01; //内部计数器使能;
  TIM2->ARRH = 0x00;//0140,320分频,16M/320=50K,实测49.75K
  TIM2->ARRL = 0x8a;//自动装载寄存器低位;实测013e正好为50.0K
  /*PWM通道1设置*/
  TIM2->CCER1 |= 0x01; //开启OC1信号输出脚
  TIM2->CCMR1 = 0x60; //PWM1模式
  TIM2->CCR1H = 0x00; //占空比高位
  TIM2->CCR1L = 0x37; //占空比低位
  TIM2->CCMR1 |= 0x08; //输出比较1预装载使能
  /*PWM通道2设置*/
  TIM2->CCER1 |= 0x10; //开启OC2信号输出脚
  TIM2->CCMR2 = 0x60; //PWM1模式
  TIM2->CCR2H = 0x00; //占空比高位
  TIM2->CCR2L = 0x37; //占空比低位
  TIM2->CCMR2 |= 0x08; //输出比较2预装载使能
  /*PWM通道3设置*/
  TIM2->CCER2 |= 0x01; //开启OC3信号输出脚
  TIM2->CCMR3 = 0x60; //PWM1模式
  TIM2->CCR3H = 0x00; //占空比高位
  TIM2->CCR3L = 0x37; //占空比低位
  TIM2->CCMR3 |= 0x08; //输出比较3预装载使能
  TIM2->CR1 |= 0x01;