マイコンカーラリー用高速データロガー(シリアル送信データをSDカードに記録することで1mS毎のデータログを可能にするタイプ)
のプログラムを書いて実験しているとDiskErrorがランダムに出て記録が出来ないトラブルにぶちあたってしまいました。
DiskErrorはFatFSライブラリの下位レイヤーで発生するエラーなのでFatFSそのものに問題があるわけでもなさそうです。
CPUはstm32F765VGTで使っていたHAL_Driverのバージョンは
STM32CubeF7 Firmware Package V1.6.0 / 30-December-2016
STM32FCubeMX のバージョンはVer4.19.0でした。
HAL_Driverの中身まで調べるのは面倒なのでWebで同様の症状を探してみるとねむいさんが「stMicroのCommunityでF7_1.6.0はDiskErrorが出るよ。」と書いているのを見つけました。
Problem with FatFs and STM32Cube_FW_F7_V1.6.0 (Possible STM32Cube Bug)
これが原因に違いないと喜んで、ねむいさん推薦のFW_F7_V1.5.0に替えてもやはりランダムなDiskErrorが出て問題は解決しません。
それでHALライブラリのドキュメントに、
- 最初に読め: FatFsモジュール アプリケーション ノート
と書いてある資料を最後まで読んでみると(おいおい、最初に読めよ )何となく原因がわかりました。
このアプリケーションはデバッグがやりやすいようにFreeRTOSを使って作っていたのですがFatFSはFreeRTOS対応版と通常版で別のドライバーを使うようになっていてFreeRTOS版の時はスタックサイズとヒープ領域の指定に気を付けないとエラーが起きるということでした。
FreeRTOSでエラーが起きないスタックサイズとヒープサイズを調べるのは結構面倒ですし特にFreeRTOSを使う必要があったわけではないので通常版でテストしてみるとあっさりエラー無しで動作するようになりました 。
ただ、SDMMCCLK clock divided factor は設定画面の注釈には
SDMMC_CK = SDMMCCLK / [CLKDIV + 2]. The output clock frequency can vary between 187 KHz and 24 MHz. It is advised to keep the default ClockDiv value (0) to have a maximum SDMMC_CK frequency of 24 MHz.
(0にするようお勧めします)
と書いてあるにもかかわらず 1 (48/(2+1)=16MHz)に設定する必要がありました。