STMマイコンを使用して液晶ディスプレイ(LCD)などを制御する際に、FSMC (Flexible Static Memory Controller)を使用すると制御を簡単にできます。16-bitモードの時には、アドレスが1ビットシフトするので注意が必要です。
下記設定を考えます。
- 使用するマイコンはSTM32F407 (メモリマップは下記)
- FSMCのbank1を使用する
- LCDのRS (制御コマンドとデータ通信の切り替え信号)をA16に割り当てる
- ビット幅は16-bitモード
このとき、制御コマンドのためにRS = 0とするには、0x60000000にアクセスすればOKだとメモリマップからわかります。一方、データ通信のためにRS = 1とするには、0x60020000にアクセスする必要があります。
A16をRSに割り当てたので、ベースアドレス(0x60000000) + 2^16で0x60010000が対象アドレスだと思ってしまいがちですが、データシートをよく見ると下記のような記載がありました。つまり、1ビットシフトされるのです。そのため、実際にアクセスすべきアドレスは0x60020000となります。
In 16-bit mode, data address issued to the memory is HADDR[25:1] >> 1
このパワポに、もう少し詳細を記載しています。