前言
本文是BES2300X,BES2500X系列博文UI部分
涉及耳机电量的检测,显示,充电检测相关逻辑
主要分为三点:
一,电量检测
在电池初始化(app_battery_open)的时候,会新建一个电池的定时器(app_battery_timer)定时器中断如下:
hal_gpadc_open(HAL_GPADC_CHAN_BATTERY, HAL_GPADC_ATP_ONESHOT, app_battery_irqhandler);
这是一个触发ADC检测的函数,第一参数是ADC通道,第二参数是检测次数,第三参数是检测结果中断处理函数。
在中断处理函数app_battery_irqhandler中,根据不同的电量给予app_battery_measure.cb函数不同的参数,最终参数通过
static void app_battery_event_process(enum APP_BATTERY_STATUS_T status, APP_BATTERY_MV_T volt)
函数,把电量信息发送到app_thread线程中进行处理。
在app_battery_open函数中,可以看到以上流程需要的函数注册信息。
app_set_threadhandle(APP_MODUAL_BATTERY, app_battery_handle_process);
app_thread线程中app_battery_handle_process函数同时处理充电状态转换以及电量信息处理如下图:
二,充电检测
在充电检测开启函数app_battery_charger_indication_open中
pmu_charger_set_irq_handler(app_battery_charger_handler);
这条是打开充电IO中断用的,中断处理函数app_battery_charger_handler也通过app_battery_event_process将充电脚状态发送到app_thread线程中
app_battery_event_process(APP_BATTERY_STATUS_PLUGINOUT,
(status == PMU_CHARGER_PLUGIN) ?APP_BATTERY_CHARGER_PLUGIN : APP_BATTERY_CHARGER_PLUGOUT);
根据特殊状态标识APP_BATTERY_STATUS_PLUGINOUT先对IO进行消抖(本文唯一的图片中有标识)
app_battery_pluginout_debounce_start();
再进行充电状态转换
app_battery_event_process(APP_BATTERY_STATUS_CHARGING, status_charger);
三,电量处理
主要是以下两个函数:
app_battery_handle_process_normal((uint32_t)status, msg_prams);
app_battery_handle_process_charging((uint32_t)status, msg_prams);
处理充电时和非充电时的电量信息,对低电,关机电压,正常电压,满电电压进行处理。
同时其中的app_status_battery_report函数会承担
1,UI定时器(app_start_10_second_timer)的计时功能。
app_10_second_timer_check();
2,电池电量上报功能
app_hfp_set_battery_level(level);
电池模块已经总结完毕,有问题大家评论区探讨