SNSへはこちら

GreenPAKでお手軽ハードウェア設計(2) - 概要・開発環境その2

では、前回に引き続き 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 側をリセットすると書き込みが完了し以下のようになるはずです。

以上、「とりあえず動かしてみた」という記事でした。
まだ理屈もなにもないですが、今後少しづつ研究していきます。