完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
单片机开发过程中经常要使用到定时器,对于不需精确定时的流程,可使用本模块提供的定时器进行定时及超时处理
本模块管理一组定时器,其它模块可申请分配其中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; 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) { .... } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
1719 浏览 0 评论
3339 浏览 9 评论
3017 浏览 16 评论
3508 浏览 1 评论
9106 浏览 16 评论
1222浏览 3评论
632浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
621浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2363浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1928浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 01:58 , Processed in 1.100735 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号