in-application programming (IAP)
STM32Cube in-application programming using the USART embedded software (AN4657)
IAPの概要については「AN4657 USARTを使用したSTM32イン・アプリケーション・プログラミング(IAP)」に記載がある.
stm32F4での実装に関しては
アプリケーションノートAN3965 USARTを使用したSTM32F40x/STM32F41xイン・アプリケーション・プログラミング、
ソースコードSTSW-STM32067 STM32F4 in-application programming (IAP) using the USART (AN3965)がある.
X-CUBE-IAP-USART STM32Cube in-application programming using the USART embedded software (AN4657)にサンプルコードが入っているのでこれを使うとTeraTermからYMODEMプロトコルを利用してファームウェアを読み書きできる。
G4用のものに関しては参考にしつつ自分で実装した。L4のサンプルコードが入っていたので参考似ながら作ったが、ライトプロテクション周りにバグがあったので注意が必要。これをミスってCubeProgrammerでオプションバイトを書き直すはめになった。
実際に試したところ、全然うまくいかなかった。デバッグと調査の結果、AN4567に入ってるコードの仕様として256kB以上のバイナリの転送は未対応のようだった。
YMODEMプロトコルを使って1kB(1034byte)ずつ転送するようだけど、この転送量を管理する部分が256回以上の転送に対応していない様子。
YMODEMプロトコルにてデータブロックと呼ばれるという実際にデータを転送するフレームの中身を見ると、データブロック番号なるものが存在するが領域は1byteのみ。データブロック転送ごとに1ずつ加算していくようだけど255の次はオーバーフローして0に戻ってしまう。これが今回の原因だろうみて間違いなさそう。
自分が書き込もうとしていたバイナリのサイズがちょうど256kBだったのでこれにハマっていた。書き込みたいアプリケーションコードにまだ余裕はあるので、一旦転送するバイナリは254kBまでにすることでこのプロトコルを使える環境としておく