中科蓝讯532X系列PWM的使用

实例:
PB2实现呼吸灯

初始化

在pwm_port_inin函数下

GPIOBDIR &= ~BIT(3); //DIR OUT
	GPIOBDE |= BIT(3); //数字 IO 口要设置上.
	GPIOBFEN |= BIT(3); //function io enable
	FUNCMCON2 = (2 << 8); // TIMER3的G2   pwm map to G1 (PE1/2/3)timer5->16Bit timer4->12Bit timer3->8Bit
	TMR3CON = 0x00; //时钟源默认为系统时钟 24M
	TMR3CNT = 0;
	TMR3PR = 1000; //例如为 24M 时, 频率为 24M/(12000*4) = 500HZ, 即周期为0.002S. //U32
//	TMR3DUTY0 = 12000 - 1; //u16 //25% 负占空比 PE1 //注意 PR >= DUTY //DUTY ==PR, 全高. -1 (也就是 0xFFFF)时, 全低, 其他值表示"负占空比"
	TMR3DUTY1 = 1000-1; //u16 //50% 负占空比 PB2
//	TMR3DUTY2 = 12000*3- 1; //u16 //75% 负占空比 PE3
	TMR3CON |= BIT(10); //timer5 pwm0, pwm1, pwm2 enable
	TMR3CON |= BIT(0); //Timer enable (defualt work in counter mode)

注意:
如果是在port_pwm.c下写的初始化函数。
打开这个宏,不然程序不会执行

#define TIMER_PWM_EN                    1           //TIMER的PWM区别于LPWM

在bsp_sys_init函数下调用初始化函数

#if PWM_RGB_EN
    pwm_init();
#endif // PWM_RGB_EN
    pwm_port_init();
    /// enable user timer for display & dac
    sys_set_tmr_enable(1, 1);

编写扫描函数

AT(.com_text.rgb)
void rgb_breath_scan(void)      // 5ms  放5ms中断
{
    static u8 cnt = 0;
    static u8 dir = 0;
    static u16 cduty = 0;
    cnt++;
    if(cnt>=20){
        if(dir==0){
        if(cduty<999){
            cduty = cduty + 9;
        }else{
            dir = 1;
            cduty = 999;
        }
        }else{
            if(cduty>9)
            {
                 cduty = cduty - 9;
            }else{
                dir = 0;
                cduty = 0;
            }
        }
        cnt = 0;
    }
        TMR3DUTY1 = cduty;
}

调用扫描函数

在usr_tmr5ms_isr下调用,增加的标志位为真代表播放状态,否则是暂停状态

 if(RGB_LED_flag){
         rgb_breath_scan();
    }else{
     TMR3DUTY1=999;
    }

发布了65 篇原创文章 · 获赞 36 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40860986/article/details/102734382