投稿日: May 27, 2017 11:54:37 PM
RPi2をデスクトップとして、I/OはPiA+に任せて…なんて考えていたのだけども以前試したときにOpenOCDをPiA+で動かすのに失敗して、てっきり出来ないものだと諦めていたのですが。
どうやら出来たようなのでメモ。
これが出来るとリモートでビルド、フラッシュ書き込みが出来るので取り回しもしやすくて良い感じなのです。
これからやるならpi zeroでやった方が速度も速いのでその方がいいでしょう、pi zeroもRaspberry Pi 1の部類なので内容はまったく一緒です。
とりあえずplatformioのインストール。
sudo pip install -U platformio
今回はSTM32F303K8をターゲットに。使うのはピッチ変換しただけの素のMCUボードだけどnucleoとして利用。名前を調べる。
pio boards | grep 303
nucleo_f303k8という名前なのが解ったのでプロジェクトを作成。
pio init -b nucleo_f303k8
あとはsrc/の中にmain.cppなどを作って何かプログラムを作る。
#include "mbed.h"
DigitalOut myled(PB_0);
int main(){
while(1) {
myled = 1;
wait(1);
myled = 0;
wait(1);
}
}
こんなもんでしょうか。
プロジェクトルートに移動してビルド。
pio run
初回はツールチェインなどをインストールするので時間がかかる。
ビルド済みのバイナリをプロジェクトルートにコピー
cp .pioenvs/nucleo_f303k8/firmware.elf .
ここまでやってなんだけど、コンパイルもむちゃくちゃ遅い。
ビルドはRPi2でやってscpとかで送り込んだ方が良いかも。
とりあえず・・・OpenOCDのほう。基本的にAdafruitのLeranと同じ。
platformioのmbed環境インストールと同じくそこそこ時間がかかる。
git clone git://git.code.sf.net/p/openocd/code openocd-code
cd openocd-code
./bootstrap
./configure --enable-sysfsgpio --enable-bcm2835gpio
make
sudo make install
openocd.cfg をplatformioで作ったプロジェクトルートに作成する。
source [find interface/raspberrypi-native.cfg]
transport select swd
bcm2835gpio_swd_nums 25 24
bcm2835gpio_trst_num 7
bcm2835gpio_srst_num 18
set CHIPNAME stm32f303k8t6
source [find target/stm32f3x.cfg]
reset_config srst_nogate
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100
PiA+とSTM32F303をワイヤリングする。
GPIO #18 -> 4 NRST
GPIO #24 -> 23 SWDIO
GPIO #25 -> 24 SWCLK
sudo openocd
としてopenocdを起動。
この時点でError: Could not initialize the debug portみたいなのが出ていたら配線を見直す。
うまくいっていれば
Info : stm32f303k8t6.cpu: hardware has 6 breakpoints, 4 watchpoints
のようなメッセージが出る。
別の端末からtelnetで4444ポートに接続。
わたしの場合RPi2からPiA+(hostname pia)のOpenOCDへ接続するので以下のような感じ。もしどちらの端末もPiA+にログインしているのであればlocalhostにて。
※telnetなどプリインストールされていないのでインストールしておく。
telnet pia.local 4444
初めて使う場合STM32F303はフラッシュがロックされていることもあるかもしれないのでそのときはアンロック。
halt
stm32f1x unlock 0
とりあえず繋いだら最初にhaltで止める。
openocd.cfgに書いておいてもいいかもしれない。
reset haltとかresetとかhaltとか、なんかうまくいかないときはいろいろ試す。
どうにもうまくいかないときの最終手段としてデバイス側でリセットをかける。これでうまくいくことも多い。(いいのかそれで)
flashにfirmwareを書き込む。で、実行。
flash write_image erase firmware.elf
reset run
無事にRaspberry Pi 1からOpenOCDを利用してSTM32にファームウェアを書き込むことが出来ました。やったね!