例程目录: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的工程文件夹里面的文件属性设置为非只读的!!!不然工程关了再打开就不一样了。哎。。白花花的代码不见了。
|