ArduinoでCH32V203の隠しflash


CH32V203は、公式のflashは64kであるが、低速のflashが160kあり、 Arduinoからこれを利用する方法は2026/5/17のブログに書いたが、その手法は少し手間がかかった。 それを少し簡単にする方法を見出したので、紹介したい。

まず、160kのflashの情報をLink.ldに記述するのだが、ch32funでの記述を参考にして、EXTという名称にすることにした。 そして、EXTにはrodataを格納することにする。 そのように変更するためのシェルスクリプトは以下の通りである。

cd ~/.arduino15/packages/WCH/hardware/ch32v/1.0.4/system/CH32V20x/SRC/Ld/
sed -i -e 's/\r/\n/g' Link.ld
sed -i -e 's@FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K@FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K\n\tEXT (rx) : ORIGIN = 0x08010000, LENGTH = 160K@' -e '/[.]rodata/d' -e 's@\.fini @.storage :\n{\n. = ALIGN(4);\n*(.rodata)\n*(.rodata*)\n. = ALIGN(4);\n} >EXT AT>EXT\n\n\t.fini @' Link.ld

以前に紹介した方法では、スケッチをコンパイルした後で、 通常のflashとEXTに書き込むバイナリを取り出す必要があったのだが、 platform.txtをいじると、これを自動で出来るようにすることができる。 バイナリを保存するように指定したときに、flashとEXTについて、バイナリを取り出して64kになるようにして、スケッチのあるフォルダにコピーするように、するのである。 その設定のためのシェルスクリプトは以下の通りである。

cd ~/.arduino15/packages/WCH/hardware/ch32v/1.0.4/
sed -i -e 's@recipe.objcopy.bin.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.elf2bin.flags} {compiler.elf2bin.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.bin"@recipe.objcopy.bin.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.elf2bin.flags} {compiler.elf2bin.extra_flags} -R .storage --gap-fill=0xff --pad-to=0x10000 "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.bin"\nrecipe.objcopy.bin.pattern.post_action.1.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.elf2bin.flags} {compiler.elf2bin.extra_flags} -j .storage --gap-fill=0xff --pad-to=0x08020000 "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}_ext.bin"\nrecipe.objcopy.bin.pattern.post_action.2.pattern=cp -f "{build.path}/{build.project_name}_ext.bin" "{build.source.path}/" @' platform.txt

以上のように設定をすれば、Arduino IDE上から、バイナリを保存して、これらを書き込むだけで、拡張flashを活用できるようになる。 私はUSBを使ってwchispで書き込むことが多いので、これらのバイナリを結合してから書き込んでおり、そのために64kになるようにした。 本当は自動でflashとEXTのバイナリを結合したかったのだが、 そのコマンドをArduinoに組込むのは、うまく行かなかった。 しかし、ArduinoでCH32V203を使うときの、幅が広がるように思う。