キー処理、他のバックグランドで仕事させるのには、一定時間の処理が必要になるのでタイマー割り込みを確認してみた。
APIは下記で結構な使えるようなものがあり、ディレーも今までsleep_m()を使っているが、その他にもbusy_wait_usなどもある、使ううかは別にして、電源入れてから経過時間で割り込みの入るものもある、他にタイマー割り込みではbool add_repeating_timer_us()、bool add_repeating_timer_ms()、cancel_repeating_timer()が使えそうだ。
今回はadd_repeating_timer_us()を使って500us毎に割り込みを入れて、GPIOの0出力をトグロさせて、LED点灯&波形確認をしてみた。-500に設定するとジャスト1KHzを生成してくれる。+500だと処理時間込みになり若干低い周波数になる。0以上だとタイマ周期 含む処理時間、0以下だとタイマ周期のみなので記載はマイナスをつけて記載すればいい。
timer_callbackの戻値は割込み継続する場合はtrue、ストップする場合はfalseにすれば良い。
また、cancel_repeating_timer(&timer)でキャンセルできる。
今回はメインループで割り込みをキャンセルさせ、500msec後に再開している。
コード:
//
static repeating_timer_t timer;
bool cancel;
bool timer_int( repeating_timer_t *t ){
gpio_xor_mask(0x01); // 割込毎にトグロ
return ( true );
}
void setup() {
gpio_init(0);//GPIO pin0
gpio_set_dir_out_masked(0x01);//pin0 out setting
add_repeating_timer_us(-500, timer_int, NULL,&timer ); //interval setting
}
void loop() {
busy_wait_us_32(500000);//0.5sec
cancel=cancel_repeating_timer(&timer);//キャンセル
busy_wait_us_32(500000);//0.5sec
add_repeating_timer_us(-500, timer_int, NULL,&timer );//restart
API:
void busy_wait_us_32 (uint32_t delay_us)
void busy_wait_us (uint64_t delay_us)
void busy_wait_until (absolute_time_t t)//Wait until after the given timestamp to return.
void sleep_us (uint64_t us)// Wait for the given number of microseconds before returning.
void sleep_ms (uint32_t ms)// Wait for the given number of milliseconds before returning.
bool best_effort_wfe_or_timeout (absolute_time_t timeout_timestamp)//Helper method for blocking on a timeout.
bool alarm_pool_add_repeating_timer_us (alarm_pool_t *pool, int64_t delay_us, repeating_timer_callback_t callback, void *user_data, repeating_timer_t *out)//Add a repeating timer that is called repeatedly at the specified interval in microseconds.
static bool alarm_pool_add_repeating_timer_ms (alarm_pool_t *pool, int32_t delay_ms, repeating_timer_callback_t callback, void *user_data, repeating_timer_t *out)//Add a repeating timer that is called repeatedly at the specified interval in milliseconds.
static bool add_repeating_timer_us (int64_t delay_us, repeating_timer_callback_t callback, void *user_data, repeating_timer_t *out)//Add a repeating timer that is called repeatedly at the specified interval in microseconds.
static bool add_repeating_timer_ms (int32_t delay_ms, repeating_timer_callback_t callback, void *user_data, repeating_timer_t *out)//Add a repeating timer that is called repeatedly at the specified interval in milliseconds.
bool cancel_repeating_timer (repeating_timer_t *timer)// Cancel a repeating timer.
コメント