例程目录:C:ProgramFiles(x86)KeilARMDeviceNordicnrf51822Boardpca10001s110ble_app_proximityarmble_app_proximity.uvproj Nordic提供了个不错的timer机制:
源文件:app_timer.c 使用方式可参看app_timer.h
uint32_tapp_timer_create(app_timer_id_t * p_timer_id,
app_timer_mode_t mode,
app_timer_timeout_handler_t timeout_handler);
uint32_tapp_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void *p_context);
uint32_tapp_timer_stop(app_timer_id_t timer_id);
uint32_tapp_timer_stop_all(void);
简要介绍以上函数的使用方式~看名字就能知道它大概是什么意思了。
so,比如我们要创建个timer,每1s从串口中打印出数据。
1、create timer:
err_code =app_timer_create(&m_uart_output_timer_id,
APP_TIMER_MODE_REPEATED,
uart_output_timeout_handler);
第一个参数,实际只是个timer的id,是一个32位整型变量,
第二个参数,是定时器的模式,比如进入相应Handler一次或者重复的进入。
第三个参数,是定时器时间到的入口函数(handler),也就是时间到了,要在此处进行处理,比如打印数据。
对于static voiduart_output_timeout_handler(void * p_context)的定义是这样滴,有个参数void *p_context
该参数呢,比方说创建线程也会有个指针参数~,也就是说我们可以将某个数据的指针传进来。
2、start timer
err_code =app_timer_start(m_uart_output_timer_id,
APP_TIMER_TICKS(1000, APP_TIMER_PRESCALER),
(void*)data);
第一个参数,实际是timer的id,就是刚才我们create时候的id。
第二个参数当成计数值吧。
第三个参数则就是我们可以传数据进去,或者指针。
Nordic提供了个不错的宏定义(大家以后可以扣过去使用),APP_TIMER_TICKS(1000, APP_TIMER_PRESCALER) 这样得到的值就是1s的计数值了,具体细节大家可以仔细看进去。
3、在timer handler中进行数据打印。
static voiduart_output_timeout_handler(void * p_context)
{
printf("1s pass rn");
}
以上,如果你的代码能成功执行,那么恭喜你,见鬼了,哈哈,理论上是不行的,现象是:debug的时候都不知道跑到哪里去了,找了半天,发现有个APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS,APP_TIMER_OP_QUEUE_SIZE, false);
其中要修改两个参数:由原来的5和4改为6和5如下
#defineAPP_TIMER_MAX_TIMERS 6 #defineAPP_TIMER_OP_QUEUE_SIZE 5
这样timer才能成功跑起来,至于为什么呢~~看文档啊看文档。
小乌龙,记得把整个Nordic的工程文件夹里面的文件属性设置为非只读的!!!不然工程关了再打开就不一样了。哎。。白花花的代码不见了。