前言现在为止也开发了许多杰理TWS蓝牙耳机、音响项目SDK的案子在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总方便各位同行和对杰理芯片SDK感兴趣的小伙伴们学习本章详细介绍杰理SDK中定时器接口的种类和使用方法在我们进行杰理蓝牙耳机、蓝牙音响等蓝牙产品软件开发时往往会遇到客户要求各种奇怪的功能这个时候就可以大多数功能就可以依靠定时器接口函数去实现定时器类型分为三种强节拍 :usr_timer 优先等级 1 异步usr_timer 的参数 priority优先级为 1使 用该类定时器系统无法进入低功耗usr_timer 属于异步接口 add 的时候注册的扫描函数将在硬件定时器中时基到时候被调用。弱节拍usr_timer 优先等级 0 异步usr_timer 的参数 priority优先级为 0使用该类定时器系统低功耗会忽略该节拍节拍不会丢失但是周期会变。usr_timer 属于异步接口 add 的时候注册的扫描函数将在硬件定时器中时基到时候被调用。normal节拍sys timer 优先等级无 同步系统会进入低功耗节拍不会丢失sys_timer 由 systimer 线程提供时基属于同步接口也就是说在哪个线程 add 的 sys_timer定时时基到了 systimer 线程会发事件通知对应的 add 线程响应回调函数被执行。注意对应 timer add 的线程响应问题 不建议在系统主循环线程做定时时间极短的扫描。个人小结1、user_timer由硬件定时器提供时序sys_timer由systimer线程提供时序2、user_timer分优先级优先级1系统将无法进入低功耗优先级0因为系统低功耗的原因会忽略该节拍计数周期会改变3、sys_timer会进入低功耗有些定时器会被低功耗影响到周期应该避免在系统主循环中做定时时间极短的扫描4、资料指出的低功耗是power down深度休眠并不是指的是soft poweroff软关机哟timer和timerout的区别sys_timer/usr_timer与sys_timerout/ust_timerout接口区别在于timeout的接口的回调只会被调用一次也就是设定一个未来的时间时间到了响应之后便结束这个定时器的生命周期。个人小结sys_timer/usr_timer就是设定一个时间到达时间后执行任务然后时间清零。重新开始计数到达时间后执行任务在时间请零。一直在重复执行。除非定时任务被删除sys_timerout/ust_timerout就是定时一个时间到达时间后执行定时任务。然后定时任务的生命周期就结束就只会执行一次sys_timer流程框架usr_timer流程框架杰理SDK详细接口说明sys定时接口/* * System Timer */ //*----------------------------------------------------------------------------*/ /**brief sys_timer定时扫描增加接口 param priv:私有参数 func:定时扫描回调函数 msec:定时时间 单位毫秒 return 定时器分配的id号 note 1、系统会进入低功耗节拍不会丢失 2、sys_timer由systimer线程提供时基属于同步接口 也就是说在哪个线程add的sys_timer定时时基到了 systimer线程会发事件通知对应的add线程响应回调函数被执行 3、与sys_timer_del成对使用 */ /*----------------------------------------------------------------------------*/ u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec); //*----------------------------------------------------------------------------*/ /**brief sys_timer定时扫描删除接口 param id:sys_timer_add分配的id号 return note 1、与sys_timer_add成对使用 */ /*----------------------------------------------------------------------------*/ void sys_timer_del(u16); //*----------------------------------------------------------------------------*/ /**brief sys_timer超时增加接口 param priv:私有参数 func:定时扫描回调函数 msec:定时时间 单位毫秒 return 定时器分配的id号 note 1、系统会进入低功耗节拍不会丢失 2、sys_timerout由systimer线程提供时基属于同步接口 也就是说在哪个线程add的sys_timerout定时时基到了 systimer线程会发事件通知对应的add线程响应回调函数被执行 3、timeout回调只会被执行一次 4、与sys_timerout_del成对使用 */ /*----------------------------------------------------------------------------*/ u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec); //*----------------------------------------------------------------------------*/ /**brief sys_timer超时删除接口 param id:sys_timerout_add分配的id号 return note 1、与sys_timerout_add成对使用 */ /*----------------------------------------------------------------------------*/ void sys_timeout_del(u16); //*----------------------------------------------------------------------------*/ /**brief sys_timer定时器重置 param id:sys_timer分配的id号 return note 1、重置之后重新计时 */ /*----------------------------------------------------------------------------*/ void sys_timer_re_run(u16 id); //*----------------------------------------------------------------------------*/ /**brief sys_timer定时器设置私有参数 param id:sys_timer分配的id号 priv:私有参数 return note */ /*----------------------------------------------------------------------------*/ void sys_timer_set_user_data(u16 id, void *priv); //*----------------------------------------------------------------------------*/ /**brief sys_timer定时器获取私有参数 param id:sys_timer分配的id号 return 返回add时的私有参数 note 注意如果有通过sys_timer_set_user_data重新设置私有参数,则返回的是设置后的私有参数 */ /*----------------------------------------------------------------------------*/ void *sys_timer_get_user_data(u16 id);user定时接口//*----------------------------------------------------------------------------*/ /**brief usr_timer定时扫描增加接口 param priv:私有参数 func:定时扫描回调函数 msec:定时时间 单位毫秒 priority:优先级,范围0/1 return 定时器分配的id号 note 1、usr_timer的参数priority优先级为1使用该类定时器系统无法进入低功耗 2、usr_timer的参数priority优先级为0使用该类定时器系统低功耗会忽略该节拍节拍不会丢失但是周期会变 3、usr_timer属于异步接口 add的时候注册的扫描函数将在硬件定时器中时基到时候被调用。 4、对应释放接口usr_timer_del */ /*----------------------------------------------------------------------------*/ u16 usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority); //*----------------------------------------------------------------------------*/ /**brief usr_timer超时增加接口 param priv:私有参数 func:超时回调函数 msec:定时时间 单位毫秒 priority:优先级,范围0/1 return 定时器分配的id号 note 1、usr_timerout的参数priority优先级为1使用该类定时器系统无法进入低功耗 2、usr_timerout的参数priority优先级为0使用该类定时器系统低功耗会忽略该节拍节拍不会丢失但是周期会变 3、usr_timerout属于异步接口 add的时候注册的扫描函数将在硬件定时器中时基到时候被调用。 4、对应释放接口usr_timerout_del 4、timeout回调只会被执行一次 */ /*----------------------------------------------------------------------------*/ u16 usr_timeout_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority); //*----------------------------------------------------------------------------*/ /**brief usr_timer修改定时扫描时间接口 param id:usr_timer_add时分配的id号 msec:定时时间 单位毫秒 return note */ /*----------------------------------------------------------------------------*/ int usr_timer_modify(u16 id, u32 msec); //*----------------------------------------------------------------------------*/ /**brief usr_timerout修改超时时间接口 param id:usr_timerout_add时分配的id号 msec:定时时间 单位毫秒 return note */ /*----------------------------------------------------------------------------*/ int usr_timeout_modify(u16 id, u32 msec); //*----------------------------------------------------------------------------*/ /**brief usr_timer删除接口 param id:usr_timer_add时分配的id号 return note 注意与usr_timer_add成对使用 */ /*----------------------------------------------------------------------------*/ void usr_timer_del(u16 id); //*----------------------------------------------------------------------------*/ /**brief usr_timeout删除接口 param id:usr_timerout_add时分配的id号 return note 注意与usr_timerout_add成对使用 */ /*----------------------------------------------------------------------------*/ void usr_timeout_del(u16 id); //*----------------------------------------------------------------------------*/ /**brief usr_time输出调试信息 param return note 1.调试时可用 2.将输出所有被add定时器的id及其时间(msec) */ /*----------------------------------------------------------------------------*/ void usr_timer_dump(void);定时接口使用案例循环执行定时器任务示例/**brief sys_timer定时扫描增加接口 param priv:私有参数 func:定时扫描回调函数 msec:定时时间 单位毫秒 return 定时器分配的id号 note 1、系统会进入低功耗节拍不会丢失 2、sys_timer由systimer线程提供时基属于同步接口 也就是说在哪个线程add的sys_timer定时时基到了 systimer线程会发事件通知对应的add线程响应回调函数被执行 3、与sys_timer_del成对使用 */ /*----------------------------------------------------------------------------*/ u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec); //*----------------------------------------------------------------------------*/ /**brief sys_timer定时扫描删除接口 param id:sys_timer_add分配的id号 return note 1、与sys_timer_add成对使用 */ /*----------------------------------------------------------------------------*/ void sys_timer_del(u16); //李永奉自定义定时任务// u32 LYF_flag 0; void LEY_FLAG_PP(void) { if(LYF_flag 0) { LYF_flag 1 ; LED 1 ; } else { LYF_flag 0 ; LED 0 ; } } //主函数// int main() { u16 LYF_ID 0; int i 0; LYF_ID sys_timer_add(NULL, LEY_FLAG_PP, 500); //调用sys定时器函数执行回调函数LYF_FLAG_PP while(1) { if(i 1) { sys_timer_del(LYF_ID); } } return 0; }代码讲解利用sys_timer_add(void *priv, void (*func)(void *priv), u32 msec);函数每500毫秒执行回调函数void LEY_FLAG_PP(void)反复将标志位置一或者置零超时执行定时器任务示例//*----------------------------------------------------------------------------*/ /**brief sys_timer超时增加接口 param priv:私有参数 func:定时扫描回调函数 msec:定时时间 单位毫秒 return 定时器分配的id号 note 1、系统会进入低功耗节拍不会丢失 2、sys_timerout由systimer线程提供时基属于同步接口 也就是说在哪个线程add的sys_timerout定时时基到了 systimer线程会发事件通知对应的add线程响应回调函数被执行 3、timeout回调只会被执行一次 4、与sys_timerout_del成对使用 */ /*----------------------------------------------------------------------------*/ u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec); //*----------------------------------------------------------------------------*/ /**brief sys_timer超时删除接口 param id:sys_timerout_add分配的id号 return note 1、与sys_timerout_add成对使用 */ void sys_timeout_del(u16); //李永奉自定义定时任务// u32 LYF_flag 0; void LEY_FLAG_PP(void) { if(LYF_flag 0) { LYF_flag 1 ; LED 1 ; } } //主函数// int main() { u16 LYF_ID 0; int i 0; LYF_ID sys_timeout_add(NULL, LEY_FLAG_PP, 1000); //调用sys定时器函数执行回调函数LYF_FLAG_PP sys_timer_del(LYF_ID); return 0; }代码讲解利用sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec);函数1000毫秒后执行回调函数void LEY_FLAG_PP(void)将标志位置1制作不易喜欢的小伙伴给个小赞赞喜欢我的小伙伴点个关注有不懂的地方和需要的资源随时问我哟