中科藍訊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;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章