マイコンの外部メモリインタフェースに外部デバイスを接続して制御する際に注意点があります。マイコンに接続する外部デバイスの中には、SRAMインタフェース経由で自身のメモリ空間へのアクセスを提供するデバイスがあります。
STM32マイコンの外部メモリインタフェースのFMCは、アドレス空間上の0x6000 0000〜に配置されており、この領域のCortex-Mメモリタイプ=Normalです。メモリタイプがNormalのアドレス範囲は、「バッファー可能」なメモリ属性を持ち、アドレスへのアクセス時にCortex-Mの書き込みバッファーが関与します。
書き込みバッファーが有効の場合、メモリタイプ=Normalのアドレス領域にマップされた外部デバイスのレジスタにアクセスする際に注意が必要です。
書き込みバッファーによってその順序が変化する可能性があります。また、同一アドレスに異なるデータを連続して書き込む場合も、書き込みバッファーによってメモリインタフェースから実際に出力されるデータに欠落が発生する可能性があります。
このような障害を回避するために、STM32マイコンのFMC外部メモリインタフェースのメモリ属性を、Cortex-M MPUで「Strongly Ordered(命令実行順序強制)」に設定する必要があります。Strongly Orderedに設定すると、FMC外部メモリインタフェースのアドレス領域へのアクセス時にCortex-Mの書き込みバッファーが関与しなくなります。
メモリ属性を、Strongly Ordered、Device、Normalのいずれかに設定するには、表1と表2が示すMPU設定が関係します。MPUリージョンのメモリタイプをStrongly Orderedにするには、MPU_RASRレジスタのTEXビット=000、Cビット=0(キャッシュ非対象)、Bビット=0(バッファー非対象)に設定します。
| ビット | 名称 | 説明 |
|---|---|---|
| 28 | XN | eXecution Never(実行許可/禁止) |
| 26:24 | AP | data Access Permission field (RO, RW, or No access) |
| 21:19 | TEX | Type Extention Field |
| 18 | S | Shareable(共有対象/非対象) |
| 17 | C | Cacheable(キャッシュ対象/非対象) |
| 16 | B | Bufferable(バッファー対象/非対象) |
| 15:8 | SRD | Sub Region Disabled. For reach subregion, 1=disabled & 0=enabled. |
| 5:1 | SIZE | specifies SIZE of MPU region |
| TEX | C | B | メモリタイプ | 説明 | 共有可/不可 |
|---|---|---|---|---|---|
| 000 | 0 | 0 | Strongly Ordered | 命令実行順序強制 | 可 |
| 000 | 0 | 1 | Device | 共有可能デバイス | 可 |
| 000 | 1 | 0 | Normal | Write through, no write allocate | Sビットの設定次第 |
| 000 | 1 | 1 | Normal | Write back , no write allocate | Sビットの設定次第 |
| 001 | 0 | 0 | Normal | キャッシュ非対象 | Sビットの設定次第 |
| 001 | 0 | 1 | 予約 | 予約 | 予約 |
| 001 | 1 | 0 | Undefined | Undefined | Undefined |
| 001 | 1 | 1 | Normal | Write-back, write and read allocate | Sビットの設定次第 |
| 010 | 0 | 0 | Device | 共有不可デバイス | 不可 |
| 010 | 0 | 1 | 予約 | 予約 | 予約 |
下記、Strongly Ordered、Deviceの違いです。
| メモリタイプ | バス上で転送が完了するまで待機が発生する場合 |
|---|---|
| Strongly Ordered | 全ての命令実行後 |
| Device | いま実行した命令と次に実行する命令がどちらもメモリアクセスの場合 |
Deviceメモリタイプの場合は、いま実行した命令がメモリアクセスで、次に実行する命令がメモリアクセス出ない場合は、書き込みバッファーを用いてメモリ転送を進めながら並行して次の命令を実行できます。
Copyright © ITmedia, Inc. All Rights Reserved.