STM8S---定时器产生PWM(TIM2)

时间:2022-06-28 23:33:18

1 说明

  • 采用STM8S内部时钟(HSI);
  • PWM模式2;
  • 占空比为50%,频率为2Hz(方便测试LED灯);
  • PD2口外接LED灯,PD2口输出PWM波;
  • 系统时钟初始化很重要:CLK_CKDIVR |= 0x08;

2 代码

/* TIM2_CH3 PWM PD2 output */
#include <STM8S003F3P.h>

void CLK_init(void)
{
    CLK_ICKR |= 0X01;           //使能内部高速时钟 HSI
    CLK_CKDIVR |= 0x08;         //16M内部RC经2分频后系统时钟为8M
    while(!(CLK_ICKR&0x02));    //HSI准备就绪 
    CLK_SWR=0xe1;               //HSI为主时钟源 
}

void Init_Tim2(void)
{
    TIM2_CCMR3 |=   0X70;   //设置定时器2三通道(PD2)输出比较三模式
    TIM2_CCMR3 |= 0X04;     //输出比较3预装载使能

    TIM2_CCER2 |= 0x03;     //通道3使能,低电平有效,配置为输出

    //初始化时钟分频器为1,即计数器的时钟频率为Fmaster=8M/64=0.125MHZ
    TIM2_PSCR = 0X06;   
    //初始化自动装载寄存器,决定PWM 方波的频率,Fpwm=0.125M/62500=2HZ
    TIM2_ARRH = 62500/256;
    TIM2_ARRL = 62500%256;
    //初始化比较寄存器,决定PWM 方波的占空比:5000/10000 = 50%
    TIM2_CCR3H = 31250/256;
    TIM2_CCR3L = 31250%256;


    // 启动计数;更新中断失能
    TIM2_CR1 |= 0x81;
    //TIM2_IER |= 0x00; 
}

void Init_GPIO(void)
{
    /*设置为推挽输出,PD2接了LED灯*/
    PD_DDR |= 0X04;             //设置PD2端口为输出模式
    PD_CR1 |= 0X04;             //设置PD2端口为推挽输出模式
    PD_CR2 &= 0XFD;

    PA_DDR |= 0X08;             //设置PA3端口为输出模式
    PA_CR1 |= 0X08;             //设置PA3端口为推挽输出模式
    PA_CR2 |= 0XF7;
}

void main(void)
{
    CLK_init();
    Init_GPIO();
    Init_Tim2();
    while (1);
}