中科蓝讯AB532X系列PWM的使用
实例:
PB3实现呼吸灯
初始化
在pwm_port_init函数下
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;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JSMCU!