Nucleo-H7A3ZIで作っていたDoom Playerですが、しばらく作業を止めていましたが継続を断念することにしました。2月終わりからロシアのウクライナ侵攻や米国での乱射事件が続いたことで、乱射ゲームにも気乗りしなくなっていたのですが、トドメをさすかのようにNucleoボードが壊れてしまい、QSPIフラッシュが読めなくなってしまったのです。ボード本体に問題が生じたのは明らかで、予備で買ってあったボードに差し替えたところ問題なく使えていたのですが、そのボードも1週間ほどして動かなくなってしまいました。
原因はおそらく電源の供給です。Nucleo-H7A3ボードにはUSB端子が2つあり、片方は電源/ST-Link用で、もうひとつはターゲットのMCUに直結されているホスト/デバイスポートです。ターゲットのUSBポートは、DFUでフラッシュを書き換えるためにしばしばPCと接続していたので、両方のUSBポートをPCや電源とつなげることも頻発。そうすると、ついつい、ST-Link側のUSBポートを外した状態で、誤ってターゲット側のUSBポートだけを繋いでしまうという間違いをやらかしてしまうのです。これを何度か繰り返していたら、QSPIが読めなくなりました。STMH7のコア部分は問題なく動いて、内蔵フラッシュの読み書きには問題無さそうなのですが。。。予備のボードでも同じ過ちをおかしてしまい。同じようにQSPIフラッシュが読めなくなってしまいました。ボードを買い直しても、同じ過ちを犯すに違いないので、Nucleo-H7A3ZIを使い続けるのは止めて、代わりにSTM32H7B3I-DKを使うことにしました。
Nucleo-H7A3ZIでは、QSPIフラッシュだけでなくQSPI RAMを使ってみることを一つの目的にしていました。その目的ななんとか達成できたものの、シリコンエラッタのためにかなり制約を受けることがわかりました。MPUでQSPIのメモリ領域をStrongly orderedに設定すれば、なんとか読み書きはできるものの、メモリのunaligned accessができなくなってしまうので、使い勝手が良くありません。こんなところで苦労するのであれば、問題を回避するために、OCTO SPIのRAMを使った方が良いということがわかりました。しかしながら、OCTO SPIになるとパッケージがBGAのものしか見当たらずちょっとハードルが高いです。基板を起こさねばならないのであれば、MCUを含めて他の部品と一緒に実装してしまった方が良いのですが、このご時世ではいつになったらSTM32H7A3 MCUが買えるのかもわかりません。
そんなわけで、今度はSTM32H7B3I-DKを使ってみることにしました。このボードでは残念ながら、OCTO SPI RAMではなくFMC経由でのDRAMになってしまいますが、メモリはたっぷりあるので、Doom本体にはあまり手を入れなくても簡単に移植できます。