では、前回に引き続き CSV 加工と書き込みプログラムの作成を行っていきましょう。
CSVを加工
前回 IDE で生成した csv ファイルがあります。これを見てみましょう。
$ cat blink.csv
1F
00
00
00
00
00
00
...
いや、これ CSV じゃないじゃん。
いや、強いて言うなら CSV ファイルです。各行につき1つしか要素がないがね。
では、このファイルをC言語の配列として使えるように加工します。ここで役立つのがシェル芸なのですが、誠に残念なことに Windows ユーザーはデフォルトでは使えません。WSL 入れるとかして頑張れ。
$ cat ~/blink.csv | sed 's/^/0x/;s/$/, /' | xargs -n16
0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...
よっしゃいい感じ。これをファイルとしてリダイレクトすればそのまま使えますね。
STM32CubeIDEでI2C書き込みプログラムを作成
手持ちの STM32F042 で作ってみました。参考にしたサイトでは M5StickC や Arduino 環境で作っているのが多かったので、ぼくのエゴとして、これらとは違う独自の書き込み環境を作りたかったのです。
プログラム一覧
ここで全文示すと長いので、以下を GitHub Gist にまとめました。もちろん、STM32 HAL は使っていません。当然だよね。
また、ヘッダファイルは省略しているのでその変察してください。
以下、動作説明です。
まず、クロックとペリフェラルの初期化をします。クロックは内部の HSI を利用して 48MHz、GPIO の PB4 を(デバッグ用に)設定していますが、本プログラムでは最終的に使用していません。プログラム作成時に動作不良等を確認するために使いました。
実際の動作は、GreenPak の不揮発性メモリ初期化→データ書き込み→POR(Power-on Reset) を実行 です。
転送されるプログラムは先程作成したデータを書き込むものです。greenpak.c
にある邪悪なインクルードにあるこちらのデータです。
static const uint8_t gp_nvmdata[] = {
#include "../../blink.array"
};
プロジェクト設定
STM32CubeIDE において、プロジェクトのプロパティを以下のように設定して、ビルド前にシェル芸が発動するようにしました。$
はそのまま書くと変数となって Eclipse によって代入されてしまいますので、$$
とエスケープしています。
これのテキストバージョンはこちら。
$ cat ../blink.csv | sed 's/^/0x/' | sed 's/$$/, /' | xargs -n16 > ../blink.array
これでビルド後に、プロジェクトルートに blink.array
というファイルができているはずです。これをソースコードで参照しています。
書き込みプログラムをSTM32に書き込む
例えば STM32F042 は内蔵オシレータで USBを動かせるので USB DFU が使えます。こちらに示すような結線をすることで可能です。
$ dfu-util -d 0483:df11 -s 0x08000000 -a 0 -D SLG46824Flash.bin
STM32からGreenPAKに書き込む
まずは以下のように GreenPAK と結線します。
GreenPAK ピン番号 | ピン名称 | 備考 |
---|---|---|
1 | IO14 | 抵抗を介して LED へ |
12 | SDA | STM32F042 の 30 番ピンへ |
13 | SCL | STM32F042 の 29 番ピンへ |
そうしたら、STM32 側をリセットすると書き込みが完了し以下のようになるはずです。
GreenPAKのNVM書き込み、完全に理解した pic.twitter.com/eBVxdtmXEN
— しまじゃき (@obknt) August 22, 2021
〆
以上、「とりあえず動かしてみた」という記事でした。
まだ理屈もなにもないですが、今後少しづつ研究していきます。