NORDIC BLE SoC 软件入门-Apptimer的使用
App Timer是一个软件的定时器,由RTC1和软件中断SW0构成。各个版本SDK中,它的用法基本是一样的。
非OS下的使用
- 初始化app timer模块,一般在系统初始化时,调用app_timer_init函数即可。注意不要重复调用。
- 创建一个定时器实体(timer id),例如 APP_TIMER_DEF(my_timer_id) 。my_timer_id是这个app timer的id,后续对这个app timer的操作都会用到它。用户创建的app timer个数不限,但更多的app timer会消耗系统资源,同时碰撞率越高。当几个app timer同时time up时,模块会进行排队,让它们依次逐个进入回调事件中。app timer模块队列最大数在sdk_config.h中,由宏定义 APP_TIMER_CONFIG_OP_QUEUE_SIZE 控制,用户可以根据实际应用来修改它。
- 创建定时器,例如 err_code = app_timer_create(&my_timer_id, mode, timeout_handler)。 mode代表这个app timer的模式,它可以设置为APP_TIMER_MODE_SINGLE_SHOT单次模式 和 APP_TIMER_MODE_REPEATED重复模式。当选择单次模式时,定时器time up进入回调函数之后会自动停止,无需用户手动停止。当选择重复模式时,定时器会根据定时周期进入回调函数,直到用户停止它。
- 根据需要启动/停止定时器。使用函数 app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * p_context) 即可启动定时器,第二个参数为定时时长,第三个参数为传入回调函数的指针(一般没使用,直接填写NULL)。定时时长使用APP_TIMER_TICKS来进行转换,定时时长为毫秒级别,例如使用APP_TIMER_TICKS(5)作为第二个参数则设置该定时器time up时间为5毫秒。当我们不需要继续使用该定时器时,可以使用app_timer_stop来停止定时器。 如果需要修改定时时长,应先停止定时器。app_timer_stop_all可以用来停止所有的app timer。
- 注意。app timer没有清除timer count的功能,不能在定时途中清除计时count从而延缓time up事件的到来。
- app timer 的调度模式(选用)。app timer可以使用schedule模式,必需要先添加app schedule的代码,并打开app schedule功能。app timer 模块中,打开APP_TIMER_CONFIG_USE_SCHEDULER即可。
OS下的使用
Nordic标准SDK中带有几个FreeRTOS的例程,app timer也可以在FreeRTOS上运行。SDK中带有app_timer_freertos相关功能,但是并不建议在应用程序中使用它!
在FreeRTOS中,建议使用系统的xTimer模块来实现软定时功能,这样能更好的兼容系统!
文中提到app定时器用到RTC1和SW0,但是我查看SDK16.0源码app定时器只用到RTC1。因此,想问一下,SW0用来干嘛的
这个问题非常好。
在SDK16.0及以后,App timer模块的代码更新到了第二版本,在SDK中你可以看到文件名字为“app_timer2”,而在此之前,如SDK15.3中,app timer使用到了软中断。
在SDK15.3中的app timer里,会在RTC的中断里触发软中断,再到软中断中处理timer list handle