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が点滅することを確認してみてください。
デバッグ実行の方法はここを参照
コメント
コメントを投稿