RP2040でPIOをプロジェクト新規作成して動かすまで(C言語)

RP2040でPIOを動かすまでのプロジェクト新規作成・ビルド方法について解説します。

ここではPythonではなくC言語をターゲットとしています。

まず、『PIOTest』プロジェクトをプロジェクトの作成を参考にして作成します。

プロジェクトの作成を参考に、ビルド・デバッグができる所まで進めたら、VSCodeのエクスプローラーで、PIOTest.cと同一階層にPIOTest.pioというファイルを新規作成し、次のように編集します。(末尾の『%}』 以降に余計な改行等が無いように注意してください)

PIOTest.pio

.program PIOTest

; TX FIFOから32bitのデータを繰り返し取得し、
; FIFOが空になるとpullでFIFOにデータが入るまで待機します。
; また、取得したデータの最下位ビットをあらかじめ設定してある
; 出力ピン(GPIO)に書き込みます。

loop:
    pull
    out pins, 1
    jmp loop

% c-sdk {
static inline void PIOTest_program_init(PIO pio, uint sm, uint offset, uint pin) {
    pio_sm_config c = PIOTest_program_get_default_config(offset);

    // ステートマシンにてOUTの対象(『out pins, 1』等で値が入る対象)となるGPIOを設定します。
    // 変数pinにはGPIO番号が入ります。次の引数にはそのGPIO番号からいくつ連続で使用するかの値で、
    // ここでは"1"としていますので、pinのGPIOのみが使用されることになります。
    sm_config_set_out_pins(&c, pin, 1);

    // GPIO番号"pin"をGPIOとして使えるようにします。
    pio_gpio_init(pio, pin);

    // 対象のGPIOを出力に設定します。(true:出力 false:入力)
    pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);

    // プログラムをロードさせ、プログラムの実行位置を先頭(offsetの位置)に移動します。
    pio_sm_init(pio, sm, offset, &c);
    // ステートマシンを走らせます。 (true:開始 false:停止)
    pio_sm_set_enabled(pio, sm, true);
}
%}

次に、PIOTest.cを次のように編集します。

PIOTest.c

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "PIOTest.pio.h"

int main()
{
    // 使用するPIOを選択します。(PIOは2つ存在し、"pio0" 又は "pio1" で指定できます)
    PIO pio = pio0;

    // &PIOTest_program は アセンブラのPIOプログラムへのアドレスです。
    // pio_add_program関数でPIOにプログラム(アセンブラをバイナリに直したもの)を送ります。
    // 関数からはプログラムの位置が返ってくるので、offset変数にて維持します。
    uint offset = pio_add_program(pio, &PIOTest_program);

    // 空いているステートマシンの番号を取得します。
    // ステートマシンはPIO1つにつき、4つあります。
    uint sm = pio_claim_unused_sm(pio, true);
    // PIOTest_program_initは .pio ファイルに含めたヘルパー関数です。
    // この関数によりGPIOの設定、アセンブラプログラムの設定を行い、
    // ステートマシンを実行します。
    PIOTest_program_init(pio, sm, offset, PICO_DEFAULT_LED_PIN);

    // ステートマシンは既に実行状態です。
    // ここで、pio_sm_put_blocking関数により、TXFIFOにデータをプッシュします。
    // (LEDが点滅します)
    while (true) {
        // 点灯
        // TX FIFO(32bit)に0x00000001を入れます。
        // TX FIFOは32bit × 4 の領域があります。
        // TX FIFOが一杯になると、ステートマシン側で1データ(32bit)取り出されるまで待機します。
        pio_sm_put_blocking(pio, sm, 1);
        sleep_ms(500);
        // 消灯
        // TX FIFO(32bit)に0x00000000を入れます。
        pio_sm_put_blocking(pio, sm, 0);
        sleep_ms(500);
    }
}

次に『CMakeLists.txt』の『target_link_libraries』に『hardware_pio』を追記します。また、PIOTest.pio.hを生成するため、最下部に『pico_generate_pio_header』を追記し、保存します。

CMakeLists.txt

・・・

# 『hardware_pio』を追記
target_link_libraries(PIOTest pico_stdlib hardware_pio)

・・・

# 最下部に追記
pico_generate_pio_header(PIOTest  ${CMAKE_CURRENT_LIST_DIR}/PIOTest.pio)


次に、『PIOTest.pio.h』を生成するため、メニュバーの『ターミナル』→『新しいターミナル』をクリックして、VSCode上にターミナルを開いて次のコマンドを実行します。


Terminal

$ cd build
$ make

makeを実行すると『build』フォルダ内に『PIOTest.pio.h』が生成され、ビルドが通るようになると思います。デバッグ実行してLEDが点滅することを確認してみてください。
デバッグ実行の方法はここを参照

コメント

このブログの人気の投稿

v4l2-ctlで行うUSBカメラ設定方法まとめ

Raspberry Piでシリアル通信する方法(通信設定・通信確認)

Raspberry Pi Picoのステップ実行できる開発環境づくり