SDカードのファイル読み書きに興味があったので最新のCortex-M7マイコンstm32F765VGT6の試用を兼ねてこんな基板を作ってテストしてみました。
基板の実装後STM32CubeMXで新規プロジェクトを作成してSDMMC対応のピンをアクティブにし、クロック等を設定してFreeRTOSとfatfsを追加してTrueSTUDIO対応のプロジェクトを生成し、JDEでプロジェクトを読み込みGCCでコンパイルしたところSDIO回りのプログラムに全く触ることなくあっさり動いてしまいました。
STM32CubeMXのライブラリにはelm-chanが書かれたと思われるとても判り易い日本語マニュアルが入っています。
openocd関連で困ったときにいつもお世話になるブログのねむいさんも技術サポートされているようで、日本発のフリーソフトがグローバルで愛用されているのは嬉しい気分でした。
ただひとつ引っかかったのはSDMMCの設定でSDMMC clock devide factorがデフォルトの0(48MHz/2=24MHz)では書き込みが出来ず、1に設定(48MHz/3=16Mhz)することで動作したことです。
ねむいさんのブログにこの件について触れてあったので最新のstm32F765ならクリアできるかと思っていましたが無理だったようです。
ねむいさんのところには最高クロックで動作するライブラリも置いてあるようですが今回は高速シリアルで送ったデータをSDカードに書き込むだけの用途なので、とりあえずOKとします。
上図の基板を作った背景はマイコンカーラリーでデバッグのために走行データを記録するためです。
マイコンカーラリーではレギュレーションによりマイコンにはR8C/38A(最高クロック20MHz)を使わなければなりません。
R8C/38AでSDカードに書き込むためのライブラリが提供されていますが最高速度3m/s以上で走るためには最低でも1ms単位の正確な制御ループが必要でありSDカードへの書き込み処理で10ms近い処理時間が必要なR8C/38Aのライブラリを使うと走行が不安定になる原因になりますし、1ms単位の記録は不可能です。
R8C/38Aは1Mbps前後の最高通信速度が使えるようなのでシリアル通信で約100kByteのデータを送出することが出来、データ一組を4桁の16進数+’,’として10以内のデータなら1ms単位で記録できることになります。