見出し画像

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 をイネーブルにします。

画像3

画面が出るまでに時間かかりますので気長に待ってください。画像2

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から見たいレジスタを選択できます。

画像1

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);




この記事が気に入ったらサポートをしてみませんか?