RaspberryPi-PicoをTinyGoでLチカする方法

f:id:irieda:20210318201908j:plain

144Labの入江田です。

TinyGoでRaspberryPi-Picoの実装を作れるらしいので試してみました。

現状、rp2040チップサポートはjeffmhastings氏によって試験的に作られたばかり。ソースコードからのビルドが必要ですのでclangかgccおよびmake、git、cmake、 ninjaコマンドなどが必要です。あと最新のGo(現時点で1.16.2)も必要です。

TinyGoのビルド

git clone --recursive https://github.com/jeffmhastings/tinygo.git
cd tinygo
git switch rp2040
make gen-device-rp2040
make llvm-build
make
cp build/tinygo $(go env GOPATH)/bin/tinygo-rp2040

make llvm-buildはマシンによって2時間〜数時間コースなので注意してください。

サンプルコード

package main

import (
    "machine"
    "time"
)

func main() {
    machine.LED.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        machine.LED.High()
        time.Sleep(100 * time.Millisecond)
        machine.LED.Low()
        time.Sleep(200 * time.Millisecond)
    }
}

ビルドと書き込み

tinygo-rp2040 build -target raspberrypi-pico -o sample.uf2 .

以上でビルドできることがわかれば、以下の手動操作で書き込むことができます。

  1. リセットを押しながらPicoにUSB給電すると書きこみモードになります。
  2. sample.uf2ファイルを「RPI-RP2」ドライブにドラッグ&ドロップします。
  3. 正常に書き込みができると強制アンマウントされます。

以下の表示が出るのは無視しましょう。

f:id:irieda:20210318201307p:plain

Pico基板上の緑LEDがチカチカすれば成功です!

tinygo flash対応

現状のrp2040ブランチはflashサブコマンドサポートがまだ入っていません。 こういうとき、以下のconfig.jsonを書けば追加対応が可能です。

{
  "inherits": ["raspberrypi-pico"],
  "flash-method": "msd",
  "msd-volume-name": "RPI-RP2",
  "msd-firmware-name": "firmware.uf2"
}
  1. リセットを押しながらPicoにUSB給電すると書きこみモードになります。
  2. targetにconfig.jsonを指定して以下のようにするとコンパイルと書き込みを行います。
tinygo-rp2040 flash -target config.json .

まとめ

  • USBまわり、DMA、PIOフルサポートはまだ
  • いろんな機能を叩くのにはコアレジスタを直接叩く必要があります
  • tinygo flashサブコマンドはまだ未対応
  • TinyGoの現行バージョンはv0.17.0です。
  • Picoサポートはとりあえずのお試しレベルですが、次のバージョンv0.18.0くらいでサポートが追加されそう?