单片机开发过程中经常要使用到定时器,对于不需精确定时的流程,可使用本模块提供的定时器进行定时及超时处理
本模块管理一组定时器,其它模块可申请分配其中1个定时器,本模块对所有的已被分配的定时器进行计时,达到超时时间时,通过回调函数调用超时处理函数。
通过索引定位特定的定时器,定义定时器索引:#define app_timer_hdl_t uint8_t
定义:
typedef void (*app_timeout_func)(void);//回调函数
#define APP_TIMER_TICK_MS 20 //定时周期,跟使用的硬件定时器的定时周期一致
typedef struct _app_timer_t
{
bool enable; //使能标志
uint32_t count; //当前计数值
uint32_t count_max; //最大计数值,当前计数值达到最大计数值时,即达到超时时间
app_timeout_func func; //回调处理函数
}app_timer_t;
#define APP_TIMER_LIST_SIZE 8 //定时器个数
typedef struct _app_timer_list_t
{
app_timer_t timers[APP_TIMER_LIST_SIZE]; //定时器列表
uint8_t count; //已分配定时器个数
}app_timer_list_t;
初始化&启动:
void app_timer_start(void)
{
///硬件定时器启动,硬件定时器定时周期 = APP_TIMER_TICK_MS
}
void app_timer_stop(void)
{
///硬件定时器停止
}
定时器分配,启动&停止
//分配一个定时器
app_timer_hdl_t app_timer_alloc(app_timeout_func func)
{
if(app_timer_list.count >= APP_TIMER_LIST_SIZE) return 0xff;
app_timer_hdl_t hdl = app_timer_list.count++;
app_timer_t *ptimer = &app_timer_list.timers[hdl];
ptimer->enable = false;
ptimer->count = 0;
ptimer->count_max = 0;
ptimer->func = func;
return hdl;
}
//启动一个定时器
void app_timer_enable(app_timer_hdl_t hdl, uint32_t ms)
{
if(hdl >= APP_TIMER_LIST_SIZE) return;
app_timer_list.timers[hdl].enable = true;
app_timer_list.timers[hdl].count = 0;
app_timer_list.timers[hdl].count_max = (uint32_t)((double)ms / APP_TIMER_TICK_MS);
}
//停止一个定时器
void app_timer_disable(app_timer_hdl_t hdl)
{
if(hdl >= APP_TIMER_LIST_SIZE) return;
app_timer_list.timers[hdl].enable = false;
app_timer_list.timers[hdl].count = 0;
app_timer_list.timers[hdl].count_max = 0;
}
定时器计时&超时处理,主循环每隔APP_TIMER_TICK_MS毫秒数,调用一次app_timer_tick函数。
不直接在硬件定时器的中断里计时,是因为要回调超时处理函数,不在中断里进行复杂的处理
void app_timer_tick(void)
{
for(uint8_t i = 0; i < app_timer_list.count; i++)
{
app_timer_t *ptimer = &app_timer_list.timers[i];
if(ptimer->enable)
{
if(++ptimer->count >= ptimer->count_max)
{
ptimer->count = 0;
ptimer->func();
}
}
}
}
硬件定时器中断处理函数
void timerX_irq(void)
{
中断标志处理....
_task_flag.app_timer_tick = 1;
}
主循环调用app_timer_tick
if(_task_flag.app_timer_tick)
{
_task_flag.app_timer_tick = 0;
app_timer_tick();
}
应用举例:
app_timer_hdl_t hdl = app_timer_alloc(xxx_app_timeout);
app_timer_enable(com_app_timer_hdl, 500);//500毫秒超时
app_timer_disable(com_app_timer_hdl);
//超时处理函数
void xxx_app_timeout(void)
{
....
}