Raspberry Pi Pico C/C++ インターバルタイマ割り込みを試してみる


Raspberry Pi Pico C/C++ SDKのタイマ用関数のまとめでタイマの使い方がなんとなく分かったので実際に動かしてみます

1msタイマ割り込みを試してみる

1ms毎にGPIO0をトグルしてみます。

timier_test.c
#include "pico/stdlib.h"

#define GPIO_00   ( 0 )

bool timer_callback( repeating_timer_t *rt )
{
    /* 割り込み毎にトグルする */
    if ( gpio_get( GPIO_00 ) != 0 )
    {
        gpio_put( GPIO_00, 0 );
    }
    else
    {
        gpio_put( GPIO_00, 1 );
    }

    /* 500us待機 */
    busy_wait_us_32( 500 );

    return ( true );
}

void main( void )
{
    static repeating_timer_t timer;

    /* GPIO設定 */
    gpio_init( GPIO_00 );
    gpio_set_dir( GPIO_00, GPIO_OUT );

    /* インターバルタイマ設定 */
    add_repeating_timer_ms( -1, &timer_callback, NULL, &timer );

    while( true )
    {

    }

}

※コールバック関数(割り込み関数)timer_callbackには実験のためあえて0.5msの待機を入れています。

add_repeating_timer_msでタイマ周期(引数の1番目),コールバック関数(割り込み関数)(引数の2番目)を設定します。

    /* インターバルタイマ設定 */
    add_repeating_timer_ms( -1, &timer_callback, NULL, &timer );

引数の3番目,4番目はなにかよくわかっていませんが、これでとりあえず動きます。
実際に動かしてみると

確かに1ms毎にトグルしています。

タイマ周期(引数の1番目)の符号を+にしてみると

    /* インターバルタイマ設定 */
    add_repeating_timer_ms( 1, &timer_callback, NULL, &timer );


1.5ms毎のトグルになりました。

実はタイマ周期(引数の1番目)の符号によって時間の計測開始タイミングが変わるようになっています。

計測時間 実際のコールバック処理間隔
>0 コールバック関数終了~コールバック関数開始 タイマ周期 + コールバック処理時間
<0 コールバック関数開始~コールバック関数開始 タイマ周期

timer_callbackに入っている0.5ms待機分時間が伸び1.5ms毎になったというわけです。

コールバック関数の戻り値

コールバック関数(割り込み関数)timer_callbackの戻り値は割り込みを継続するかを意味しています。
ためしに10回で戻り値がfalseになるようにしてみます。

bool timer_callback( repeating_timer_t *rt )
{
    static uint count = 0;
    bool ret;
    count++;

    /* 割り込み毎にトグルする */
    if ( gpio_get( GPIO_00 ) != 0 )
    {
        gpio_put( GPIO_00, 0 );
    }
    else
    {
        gpio_put( GPIO_00, 1 );
    }

    if ( count >= 10 )
    {
        count = 0;
        ret = false;
    }
    else
    {
        ret = true;
    }

    return ( ret );
}


確かに10回トグルで止まっています。