投稿

【Raspberry Pi Pico】Flashメモリの空き領域に設定値保存 (C/C++)

イメージ
PicoではオンボードのFlashメモリにプログラム[.uf2]を書き込んで動作させますが、大抵の場合はメモリの一番後ろの方は空いているはずです。(メモリをフルに使うようなギリギリのプログラムを作成されているなら別ですが) その空いているFlashメモリの領域は使用できますので、電源が切れても保持しておきたい設定値等を保存することができます。 ※本当はUSB接続によりPicoのマスストレージにテキストファイルをコピーしてPicoで読み書きしたかったのですが、C/C++ではどうやらまだ難しそうでした。(2022/7月現在。MicroPythonならできるかも) 1. Pico基板上のFlashメモリについて 型式: W25Q16JVUXIQ 容量: 16Mbit (16777208bit = 2097151Byte) アドレス: 0x000000 ~ 0x1FFFFF 通信: SPI (Pico C/C++SDK有り) ブロック図 容量は16Mbitで、32ブロックに分かれています。.uf2のプログラムは先頭から書き込まれるため、大抵の場合32ブロック目(Block31)は空き容量となると思います。よってここ(Block31)を電源遮断時でも維持したいデータの保存場所とします。開始アドレスは 0x1F0000 です。 各ブロック自体も16セクタに分かれており、1セクタにつき4kByteとなっています。Flashの消去はこの1セクタ(4kByte)単位で行われ、書き込みは256Byte単位で行われるとのことです。 2. Flashメモリに設定値を書き込む例 用意されているC/C++SDKの関数で簡単に実現できます。アドレスはFlashメモリのアドレスを指定します。 #include <hardware/flash.h> static void save_setting_to_flash(void) { // W25Q16JVの最終ブロック(Block31)のセクタ0の先頭アドレス = 0x1F0000 const uint32_t FLASH_TARGET_OFFSET = 0x1F0000; // W25Q16JVの書き込み最小単位 = FLASH_PAGE_SIZE

【Windows11】簡単にできるRaspberry Pi Pico 開発環境構築 (VSCode, C言語, PicoProbe)

イメージ
Windows11でのRaspberry Pi Pico(RP2040)の開発環境の構築方法を紹介します。Pico Setupインストーラーを使用すると容易に構築できます。 ターゲット 対象OS: Windows 11 Pro (Windows10もほぼ同じ方法で可) エディタ: Visual Studio Code 使用言語: C言語 デバッグ環境: PicoProbeを用いてステップ実行可能 公式PDFにも説明がありますが、容易に構築できるようツールが準備されています。 1.Pico Setup の実行 こちら から最新のPico Setupインストーラーをダウンロードします。執筆時点では0.3.4が最新でしたので、私はこれを使用しました。 pico-setup-windows-0.3.4-x64.exe ダウンロードが完了したら、インストールを行います。 インストーラーを起動して、NEXTを押下します。 何も変更せず、NEXTを押下します。 インストールフォルダを選択します。デフォルトではユーザーのドキュメントフォルダが指定されています。私はそのままInstallを押下しました。 インストールが始まります。少し時間がかかります。(私の環境では5分程度) Completeと表示されたらNEXTを押下します。 『Clone and build pico repos』 にチェックが入った状態で Finish を押下します。 コマンドプロンプトが開きます。しばらく待つと『続行するには何かキーを押してください』と表示され、Y又はNキーを押下してインストールを終了します。 インストールフォルダをエクスプローラーで開き、『Visual Studio Code for Pico』のショートカット等が存在することを確認します。 2.Visual Studio Code for Pico の実行 Pico Setupのインストールフォルダ中に『Visual Studio Code for Pico』のショートカットが存在しますので、実行します。(Picoの開発時、Visual Studio Codeはこのショートカットから起動します) 『フォルダを開く』

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のデー

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

イメージ
Raspberry Pi 4とVSCodeを用いてRaspberry Pi Pico(RP2040)の開発環境(C言語)の構築の方法を解説します。最終的にはステップ実行・プロジェクトの新規作成までできるようになります。 対象マイコン: Raspberry Pi Pico(RP2040) 開発PC: Raspberry Pi 4 開発OS: Raspberry Pi OS IDE: Visual Studio Code (VSCode) 開発言語: C言語 1. セットアップスクリプトのダウンロード・実行 ターミナル(LXTerminal)を開いてセットアップスクリプトをダウンロード・実行します。 このブログではホームフォルダ(/home/pi)でセットアップスクリプトを実施したことを前提に説明します。ターミナルを開いた時に、『pi@raspberrypi:~ $』という表示になっていなければ、『cd ~ 』コマンドにてホームフォルダ(/home/pi)に移動してから以下のコマンドを実施してください。 Terminal # このブログではホームフォルダ(/home/pi)にて実施します。 pi@raspberrypi:~ $ cd ~ # wgetでセットアップスクリプトをダウンロード pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh # スクリプトに実行権限を与える pi@raspberrypi:~ $ chmod +x pico_setup.sh # スクリプト実行 pi@raspberrypi:~ $ ./pico_setup.sh # スクリプト実行後、再起動 pi@raspberrypi:~ $ sudo reboot このスクリプトの実行で、開発環境のセットアップはほぼ完了です。 pico-sdkやサンプルコードがインストールされる他、コードエディタ・デバッガとしてVisual Studio Codeがインストールされます。 2. ボード上のLEDを点滅させてみる : 既存のUF2ファイルを使用 セットアップスクリプトにより、サンプルコー