投稿

12月, 2021の投稿を表示しています

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(pi

RP2040のPIOのJMP, MOV, PUSHとかの解説(C言語向け)

RP2040(Raspberry Pi Pico)のPIOのJMPやMOVといったアセンブラのような命令について解説します。 1. JMP 条件によって設定したラベル位置に処理を移動させます。 JMP 例 loop: ; ラベルloopを設定(名前は自由に付けれる) ~その他処理~ jmp !x loop ; レジスタXが0の場合、ラベルloopに処理をジャンプします。 命令は次のフォーマットで記述します。 jmp (<条件>) <ラベル> かっこ()は省略可を意味します。(『jmp <ラベル>』と書くことも可能ということ) 条件が成立(true)する場合に、ラベルにジャンプします。条件は次の8パターンの書き方があります。 条件 動作 記載なし 条件は常に成立(true)となり、常にラベルにジャンプします。 !x レジスタXが0の場合、ラベルにジャンプします。 x-- レジスタXが0では無い場合、ラベルにジャンプします。ついでにレジスタxの値を1引きます。 !y レジスタYが0の場合、ラベルにジャンプします。 y-- レジスタYが0では無い場合、ラベルにジャンプします。ついでにレジスタyの値を1引きます。 x!=y レジスタXとYが違う値の場合、ラベルにジャンプします。 pin あらかじめsm_config_set_ jmp _pin関数で設定しておいたGPIOピンがHレベルの場合、ラベルにジャンプします。 !OSRE OUTシフトレジスタが空でなければ、ラベルにジャンプします。(OUTシフトレジスタにはPULL命令によってTX FIFOから32bitのデータが格納される) 2. WAIT 条件が成立するまで待機します。遅延命令を付けた場合は、条件成立直後に遅延処理が実施されます。 WAIT 例 wait 1 gpio 28

RP2040データシートのPIOブロック図を解説

イメージ
RP2040(Raspberry Pi Pico)の データシート に記載されてるPIO(Programmable I/O)のブロック図を解説します。私なりにブロック図を書き直して、それを元にPIOについて説明します。 RP2040のPIO(Programmable I/O)とは、簡単に言うとメインのCPUとは別で動く非常に小さなCPUのことです。この小さなCPU(ステートマシンと呼びます)は合計8つ存在し、IO操作等が可能です。 CPUとは独立して動作しますので、タイミングのシビアなI/O制御に向いており、プログラミング次第でUARTやSPIといった周辺回路と大体同様の機能を作成できます。 全体のブロック図は次のようになります。 ステートマシンはPIO0とPIO1の2ブロックに4つずつ、合計8つ存在します。 詳細なブロック図は次のようになります。 ① TX FIFO 32bit CPUからステートマシンにデータを送る際に使用される32bitのバッファ。CPU側はC言語の場合『pio_sm_put_blocking』関数等を利用して目的のデータをTX FIFOに入れる。PIO側は『PULL』命令によってTX FIFOからOutシフトレジスタへ値を移動できる。FIFOは他のFIFOと結合してサイズを拡張可能。(単方向では最大8×32bitまで拡張可能) ② RX FIFO 32bit ステートマシンからCPUにデータを送る際に使用される32bitのバッファ。CPU側はC言語の場合『pio_sm_get_blocking』関数等を利用してRX FIFOから目的のデータを取得する。PIO側は『PUSH』命令によってInシフトレジスタからRX FIFOへ値を移動できる。TX FIFOと同じく結合してサイズ拡張可能。 ③ Outシフトレジスタ32bit 32bitのデータを保持できるビットシフト機能の付いたレジスタ。『OUT』命令で保持データ(指定ビット数分)をGPIO等に反映し、ビットシフトする。 ④ Inシフトレジスタ32bit 32bitのデータを保持できるビットシフト機能の付いたレジスタ。『IN』命令でGPIO等の値(指定ビット数分)を取得し、ビットシフトする。 ⑤ 汎用レジスタX 32bit 32bitのデー