WCH-Link を用いたプログラム書き込みができないときに、ブートローダーを使うことで書き込めるようになる、というお話です。
通常、CH32V203 に WCH-Link(メーカー公式の書き込み器)を接続しておけば、特に何の操作も必要とせずにプログラムの書き換えが可能です。筆者は ch32v003fun を使って開発しているので、単に make
と打てばプログラムを再ビルドして WCH-Link を自動検出してプログラムを書き込んでくれます。
しかし、スタンバイモードに入るようなプログラムを一回書き込んでしまうと、それ以降、書き込みできなくなります。make
と打って書き込みの段階まで行くと、Detected: CH32V10x
と表示され、正しくマイコンが判定されていないことが分かります。当然、書き込みは成功しません(多くの場合、ずっとそこで待ち状態に入ってしまいます)。
そのような場合でも、CH32V203 に内蔵されたブートローダーを起動させることでプログラムが書き込めるようになります。
CH32V203 には BOOT0、BOOT1 というピンがあり、起動モードを選べます。電源投入時やシステム再起動のときにこの 2 ピンの状態が読み取られ、起動モードが決まる仕組みです。
BOOT0 | BOOT1 | 起動モード |
---|---|---|
0 | X | プログラムフラッシュメモリ(ユーザプログラム)から起動 |
1 | 0 | システムフラッシュメモリ(ブートローダー)から起動 |
1 | 1 | SRAM から起動 |
CH32V203C8T6 が搭載された評価ボード CH32V203C8T6-EVT-R0 は BOOT0/1 ピンがピンヘッダとして取り出されています(下図)。ジャンパワイヤで 3.3V や GND に接続することで BOOT ピンを設定できます。
初期状態では BOOT0/1 ピンと GND が短絡されています。ユーザプログラムが起動する設定ですね。この設定では、MCU がスタンバイモードに入ってしまうと WCH-Link の接続を受け付けません。
ブートローダーを使用するために BOOT0=1 かつ BOOT1=0 に設定します。下図のように BOOT0 を 3.3V に接続します。
この状態で電源を投入するかスイッチ S1 を押すことでブートローダーが起動します。S1 は CH32V203 の NRST ピンに接続されていて、S1 を押すとリセットがかかります。
ブートローダーが起動した状態では、WCH-Link によってプログラムを書き込めるようになります。プログラムが書き込めたら、BOOT0 を GND に接続しなおし S1 を押します。すると、今書き込んだプログラムが起動します。