Application Timer
Appplication Timerは、Real Time Counter1(RTC1)を用いた複数のTimerインスタンスを生成することができるモジュール。
nRF51内部には、Real Time Counterが2つ搭載されている(RTC0とRTC1)。Application TimerではRTC1を使用。RTC0は、SoftDeviceで使用。RTC1のアドレス番地は、0x40011000。(参考: Table 2. Peripheral protection and usage by SoftDevice )
nRF51 Series Reference Manual Version 1.1 P7 より抜粋
事前準備
Debug Loggerと Common application error handlerの環境を構築しておく。
SourceCode
main.c
#include "stdbool.h"
#include "app_trace.h"
#include "nrf_delay.h"
#include "app_timer.h"
// アプリケーションタイマーの設定.
#define APP_TIMER_PRESCALER 16 // RTC1 PRESCALER registerの値.
#define APP_TIMER_MAX_TIMERS 2 // このアプリケーションで使う最大のTimer数.
#define APP_TIMER_OP_QUEUE_SIZE 3 // Timer操作キーのサイズ.
int counter = 0;
void app_error_handler (uint32_t error_code, uint32_t line_num, const uint8_t *p_file_name)
{
app_trace_log("error_code: %d\r\n", error_code);
app_trace_log("line_num: %d\r\n", line_num);
app_trace_log("p_file_name: %s\r\n", p_file_name);
}
static void timer_handler(void *p_context){
app_trace_log("App timer counter:%d\r\n", counter);
counter++;
}
int main() {
// Debug loggerの初期化.
app_trace_init();
// TimerIDを定義.
APP_TIMER_DEF(mytimer_id);
// Application Timerの初期化.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
uint32_t error_code;
app_timer_id_t mytimer_id;
// Timerの作成.
error_code = app_timer_create(&mytimer_id, APP_TIMER_MODE_REPEATED, timer_handler);
APP_ERROR_CHECK(error_code);
// Timerの開始.
error_code = app_timer_start(mytimer_id, APP_TIMER_TICKS(1000, APP_TIMER_PRESCALER), NULL);
APP_ERROR_CHECK(error_code);
while(true){
}
}