这是一个客户的要求:将耳机的充电红灯长亮修改为充电红灯闪烁,充满灭灯。具体实现如下:
首先就是创建变量:
bsp_sys.h中sys_cb1_t结构体下:
u8 charge_rled_change;//控制充电红灯闪烁
由于充电灯控是在芯片底层实现,代码中没有充电灯控处理,通过配置及修改IO口的方法是无法实现将长亮修改为闪烁,只能通过中断直接控制IO口来处理:
开中断:
在bsp_sys.c下bsp_sys_init()中:
if(CHARGE_DC_IN())//控制充电红灯闪烁,中断要在按键处理前面
{
/// enable user timer for display & dac
user_tmr_set_enable(1, 1);//中断控制函数,由于直接对IO口进行操作,可以写在灯初始化前面
led_init();
key_init();
plugin_init();
}
else//正常情况下开机之后,再开中断
{
led_init();
key_init();
plugin_init();
/// enable user timer for display & dac
user_tmr_set_enable(1, 1);
}
中断中的处理:
在bsp_sys.c下usr_tmr5ms_isr中:
u8 chbox_sta;
if(CHARGE_DC_IN()) //充电插入
{
chbox_sta = bsp_charge_box_sta();//判断是否充满电,充满灭灯
if(chbox_sta == 2) //耳机充满,红灯灭
{
GPIOADE |= BIT(7);
GPIOADRV |=BIT(7);
GPIOADIR &= ~BIT(7);
GPIOACLR = BIT(7);
}
else //耳机还在充电,闪烁频率在这里控制,250ms亮,250ms灭
{
sys_cb1.charge_rled_change++;
if((sys_cb1.charge_rled_change >=0)&&(sys_cb1.charge_rled_change <50))
{//亮灯
GPIOADE |= BIT(7);
GPIOADRV |=BIT(7);
GPIOADIR &= ~BIT(7);
GPIOASET = BIT(7);
}
else if((sys_cb1.charge_rled_change >=50)&&(sys_cb1.charge_rled_change < 100))
{//灭灯
GPIOADE |= BIT(7);
GPIOADRV |=BIT(7);
GPIOADIR &= ~BIT(7);
GPIOACLR = BIT(7);
}
else if(sys_cb1.charge_rled_change >= 100)//控制计时的循环
{
sys_cb1.charge_rled_change = 0;
}
}
}