實例:
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;
}