前回の記事(↓)のおまけ。DMAやFMC以外でトラブったところをメモ。
SPIがSTM32F7とは別物
- F7とH7でSPIのハードウェアが別物。
- HALライブラリを使うかぎりはほぼそのまま移植できる。
- レジスタを直接叩いている場合は要注意。
- CR1, CR2, SRなど、同名のレジスタでもビットの機能が大きく異なる。
- H7のHALライブラリでは、SPIでDMA転送を使う場合にはSPI割り込みも有効にしなければならない。
- CubeMXで、SPIのDMA転送を設定すると強制的にSPI割り込みが有効に設定される。
- F7のHALライブラリでは、SPIのDMA転送の場合にSPI割り込みは必要なかった。
SysTick割り込み
※ これはSTM32H7の問題ではなく、CubeMXのバージョンによる問題。
- CubeMX Version 4.x から 6.x にアップデートしたら、SysTick_Handler() から HAL_SYSTICK_IRQHandler()を呼ぶコードが消えた。
- CubeMX Version 5.0 で仕様が変更されたらしい。(STの主張)
- 4.x では SysTick_Handler(自動生成) → HAL_SYSTICK_IRQHandler(ライブラリ) → HAL_SYSTICK_Callback(ユーザ定義) の順に呼び出された。
- 5.0 以降では、HAL_SYSTICK_IRQHandler()は呼ばれないので、ユーザ定義の処理は SysTick_Handler() の USER CODEのエリアに直接記述する。
- もしくは、4.x以前と同等にしたければ、SysTick_Handler() の USER CODEのエリアで HAL_SYSTICK_IRQHandler() を呼び出す。
内蔵Flash
- STM32F767 と STM32H743 は同じく2Mバイトの内蔵Flashを持つが、内訳が異なる。
- STM32F767 は 全12セクタで、セクタ0~3は32kB、セクタ4は128kB、セクタ5~11は256kB。
- STM32H743 は 2バンク×各8セクタで、全てセクタは128kB。
- いずれもアドレスは 0x0800 0000 - 0x081F FFFF の連続した2Mバイト。
- したがって、通常は意識する必要はない。
- ブートローダなど、内蔵Flashを書き換える処理を自作する場合には要注意。
- 内蔵Flashの制御レジスタもF7とH7で異なる。
- F7のHALライブラリでは、HAL_FLASH_Program() の第一引数で書き込みサイズを、Byte(8bit), HalfWord(16bit), Word(32bit), DoubleWord(64bit) から指定できたが、H7の HAL_FLASH_Program() はこの引数に FlashWord(256bit) しか指定できない。
- 例えばWord(32bit)単位での書き込みをおこないたい場合は、HAL_FLASH_Program()の実装を参考に独自に関数を作成するしかない。
RAM
- STM32F767 は合計512kバイト、STM32H743 は合計1MバイトのRAMを持つ。
- ただし、STM32F767のRAMが連続したアドレスなのに対し、STM32H743のRAMはアドレスが連続していない。
- STM32F767には、0x2000 0000から128kBのDTCM、0x2002 0000から368kBのSRAM1、0x2007 C000から16kBのSRAM2があり、連続した512kBのRAM空間になっている。
- STM32H743には、0x2000 0000から128kBのDTCM、0x2400 0000から512kBのAXI-SRAM、0x3000 0000から128kBのSRAM1、0x3002 0000から128kBのSRAM2、0x3004 0000から32kBのSRAM3、0x3800 0000から64kBのSRAM4があり、連続していない。
- そのため、STM32H743のほうが合計RAM容量が大きいにも関わらず、STM32F767ではビルドできていたソースがSTM32H743ではリンカエラーになる場合がある。
- その場合は、適切に変数の配置セクションを指定する必要がある。下記の記事を参照。
ADC
- STM32F767 と STM32H743 はほぼピン互換だが、ADCについてはピン互換ではない。
- STM32F767のADCは12ビットだが、STM32H743のADCは12/14/16ビットから設定できる。
- STM32H743のADCにはオーバーサンプリング機能 (ハードウェアによる平均処理) がある。
- STM32F767のADCには内蔵温度センサのチャンネルがあるが、STM32H743のADCには無い。
- STM32H743のADCには「Conversion Data Management Mode」の設定がある。特にDMA転送を用いる場合にはこの設定に注意。
- CubeMXで STM32F767のプロジェクト(iocファイル)を STM32H743にインポートする場合、ピンアサインを固定(ピン止め)していても、ピン止めを外されてピンアサインを勝手に変えられることがあるので要注意。
クロックツリーとレギュレータ電圧
- STM32F7とSTM32H7は、クロックツリーが大きく異なる。
- STM32H7にはレギュレータ電圧の設定 (Power Regulator Voltage Scale) があり、デフォルトでは最低のScale 3になる。
- レギュレータ電圧が低いほど、各種クロックの上限値が低くなる。
- 当然ながら、レギュレータ電圧を上げると消費電力は大きくなる。