NINA-B302(nRF52840)のTIMERを使いたい(1)
こつこつと、NINA-B302(nRF52840)のTIMERをいじっていきたいと思います。環境の立ち上げはこちらを見てください。zephyrになってTIMERの割り込みの使用方法がココがわからなかったので、調べてまとめていこうと思います。
1.TIMER0を動かしてみる。
”Hello World”を開いて内容を下記に書き換える。
#include <zephyr.h>
#include <sys/printk.h>
#include <nrfx_timer.h>
static const nrfx_timer_t timer1 = NRFX_TIMER_INSTANCE(1);
void my_work_handler(struct k_work *work)
{
/* do the processing that needs to be done periodically */
printk("Timer Thread\n");
}
K_WORK_DEFINE(my_work, my_work_handler);
static void timer_event_handler(nrf_timer_event_t event_type, void * context)
{
switch (event_type)
{
case NRF_TIMER_EVENT_COMPARE0:
break;
case NRF_TIMER_EVENT_COMPARE1:
k_work_submit(&my_work);
break;
case NRF_TIMER_EVENT_COMPARE2:
break;
case NRF_TIMER_EVENT_COMPARE3:
break;
case NRF_TIMER_EVENT_COMPARE4:
break;
default:
break;
}
}
void main(void)
{
nrfx_err_t err_code;
printk("Hello World! %s\n", CONFIG_BOARD);
nrfx_timer_config_t timer_cfg = NRFX_TIMER_DEFAULT_CONFIG;
timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
err_code = nrfx_timer_init(&timer1, &timer_cfg, timer_event_handler);
if (err_code != NRFX_SUCCESS) {
printk("nrfx_timer_init failed with: %d\n", err_code);
return;
}
IRQ_CONNECT(TIMER1_IRQn, NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY, nrfx_timer_1_irq_handler, NULL, 0);
uint32_t time_ticks = nrfx_timer_us_to_ticks(&timer1, 16667);
nrfx_timer_extended_compare(&timer1, NRF_TIMER_CC_CHANNEL1, time_ticks, NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK, true);
nrfx_timer_enable(&timer1);
}
このままでは、エラーが出るので、モジュールを下記のように許可する。
[Project] → Configure nRF Connect SDK Project → (-)Module → hal_nordic (-) → nfx drivers の TIMER1 / TIMER2 / TIMER3 / TIMER4 をイネーブルにします。
画面が出るまでに時間かかりますので気長に待ってください。
Buildして、実行すると、シリアルに下記が出力されます。
T*** Booting Zephyr OS build v2.6.0-rc1-ncs1 ***
Hello World! ubx_evkninab3_nrf52840
Timer Thread
Timer Thread
Timer Thread
Timer Thread
Timer Thread
Timer Thread
2. デバグしてみる。
デバグではレジスタ見たいと思いますが、Groupsから見たいレジスタを選択できます。
3. 考察してみる。
nrfx_timer_config_t timer_cfg = NRFX_TIMER_DEFAULT_CONFIG;
がタイマーの設定ですが、下記のように設定されてます。
#define NRFX_TIMER_DEFAULT_CONFIG \
{ \
.frequency = NRF_TIMER_FREQ_16MHz, \
.mode = NRF_TIMER_MODE_TIMER, \
.bit_width = NRF_TIMER_BIT_WIDTH_16, \
.interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY, \
.p_context = NULL \
}
bit_widthの変更をしてますね。
timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
タイマーの初期化してます。
err_code = nrfx_timer_init(&timer1, &timer_cfg, timer_event_handler);
この記事が気に入ったらサポートをしてみませんか?