uchan が 2024年07月28日17時15分06秒 に編集
初版
タイトルの変更
CH32V203 のブートローダーを使ってプログラムを書き込む
タグの変更
CH32V
CH32V203
WCH-Link
ch32v003fun
メイン画像の変更
記事種類の変更
セットアップや使用方法
本文の変更
WCH-Link を用いたプログラム書き込みができないときに、ブートローダーを使うことで書き込めるようになる、というお話です。 通常、CH32V203 に [WCH-Link](https://www.wch-ic.com/products/WCH-Link.html)(メーカー公式の書き込み器)を接続しておけば、特に何の操作も必要とせずにプログラムの書き換えが可能です。筆者は [ch32v003fun](https://github.com/cnlohr/ch32v003fun) を使って開発しているので、単に `make` と打てばプログラムを再ビルドして WCH-Link を自動検出してプログラムを書き込んでくれます。 しかし、スタンバイモードに入るようなプログラムを一回書き込んでしまうと、それ以降、書き込みできなくなります。`make` と打って書き込みの段階まで行くと、`Detected: CH32V10x` と表示され、正しくマイコンが判定されていないことが分かります。当然、書き込みは成功しません(多くの場合、ずっとそこで待ち状態に入ってしまいます)。 そのような場合でも、CH32V203 に内蔵されたブートローダーを起動させることでプログラムが書き込めるようになります。 ## CH32V203 の BOOT0/1 ピン CH32V203 には BOOT0、BOOT1 というピンがあり、起動モードを選べます。電源投入時やシステム再起動のときにこの 2 ピンの状態が読み取られ、起動モードが決まる仕組みです。 | BOOT0 | BOOT1 | 起動モード | |-------|-------|------------| | 0 | X | プログラムフラッシュメモリ(ユーザプログラム)から起動 | | 1 | 0 | システムフラッシュメモリ(ブートローダー)から起動 | | 1 | 1 | SRAM から起動 | CH32V203C8T6 が搭載された評価ボード CH32V203C8T6-EVT-R0 は BOOT0/1 ピンがピンヘッダとして取り出されています(下図)。ジャンパワイヤで 3.3V や GND に接続することで BOOT ピンを設定できます。 ![CH32V203EVT-R0ボードはBOOTピンがピンヘッダとして取り出してある](https://camo.elchika.com/28d0db03f8027bf54d562680b4a414f46c4a3e3f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f36313462626639662d326663362d343933612d383464362d363236366131333931333264/) 初期状態では BOOT0/1 ピンと GND が短絡されています。ユーザプログラムが起動する設定ですね。この設定では、MCU がスタンバイモードに入ってしまうと WCH-Link の接続を受け付けません。 ## ブートローダーの起動 ブートローダーを使用するために BOOT0=1 かつ BOOT1=0 に設定します。下図のように BOOT0 を 3.3V に接続します。 ![CH32V203EVT-R0ボードのBOOT0ピンと3.3Vピンを接続した](https://camo.elchika.com/4b5d306e1cab82a008b6df0d3fbca0b1e98771b0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f34343535663735642d383861622d346339392d623764352d616639396632346464656139/) この状態で電源を投入するかスイッチ S1 を押すことでブートローダーが起動します。S1 は CH32V203 の NRST ピンに接続されていて、S1 を押すとリセットがかかります。 ブートローダーが起動した状態では、WCH-Link によってプログラムを書き込めるようになります。プログラムが書き込めたら、BOOT0 を GND に接続しなおし S1 を押します。すると、今書き込んだプログラムが起動します。