Nucleo-H743ZIでFatFSを使う(SDカード・DMAモード)

2018/05/23

STM32

STM32H7はじめました。

まずはHPA_Naviの全機能をNucleo-H743ZIに移植すべく、各種ペリフェラルのテストを進めています。
大抵のペリフェラルはそれほど苦労なく動かせましたが、FatFSをSDMMC1のDMAモードで動かすまでに少し時間がかかったので、詰まった点を書き残しておこうと思います。

Nucleo-H743ZIにはSDカードスロットがついていないので、手元にあった秋月のマイクロSDカードスロットDIP化キットを取り付けました。
micro SDカードの接続状況
あまり褒められた方法ではありませんが、プルアップ抵抗は省略し、STM32H7の内部プルアップを有効にしています。
144ピンのNucleoボードにはSDIOに高速信号を流した際に問題になるスタブを切り離すための0オーム抵抗(SB116, 117)があるので念のために取り外しましたが、必要はないかもしれません。

コードの雛型はSTM32CubeMX (Ver. 4.25.1) + STM32CubeH7(Ver. 1.2.0)で生成しました。
SDMMC、FatFS周りの設定はほぼデフォルトです。

基本的にはSTM32CubeMXで生成したプロジェクトを開いて(今回はSW4STM32を使いました)、FatFSのAPIを叩けば終わりなのですが、DMAを使いたい場合さらにコードに追記が必要です。

HALドライバを使った場合、SDMMCのDMAでのデータ転送完了後には、HAL_SD_TxCpltCallback/HAL_SD_RxCpltCallbackが呼ばれます。
しかし、STM32CubeMXで生成されるコードにはこれらの関数の実体が含まれておらず、FatFSのDMA Templateを有効にするとデータ転送でタイムアウトが起こってしまい、うまく動きません。
そこで、HAL_SD_TxCpltCallback/HAL_SD_RxCpltCallbackを適当なところに(今回はmain.cに入れました)実装し、データ転送を制御するフラグWriteStatus/ReadStatusをセットする関数BSP_SD_WriteCpltCallback/BSP_SD_ReadCpltCallback (sd_diskio.c)を呼び出す必要があります。

行う作業は極めて単純で、
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_WriteCpltCallback();
}

void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{
  BSP_SD_ReadCpltCallback();
}
を挿入するだけです。

STM32H743I-EVAL用のファイルstm32h743i_eval_sd.cには、上記の実装が行われているので、これはNucleo-H743ZIや自前のSTM32H7ボードを使う場合に起こり得る問題かと思います。

作成したサンプルプロジェクトはgithubにアップロードしてあります。
サンプルプロジェクトは準備中です。

これでHPA_Naviの機能を移植するために必要なペリフェラルのテストは終わりました。
最終目標はINS/GNSSによる姿勢角の推定ですが、まずはHPA_Naviが有する機能の動作を確認したいと思います。