STM32F4シリーズを使ってみる3 -FatFsと下部レイヤ(SDIO・MMC)ドライバたちの実装-


来たぞー!
…って来たのはもう2週間以上前ですけど…
144PinのSTM32F4も手に入ったのでSTM32F2の時と同じく中華生基板に組んでみました。
STM32F2とF4はほとんど同じです。特にコードは上位互換があるので回路を完全に
合わせるとF2のコードがそのまま使用できちゃったりします。まあでもさっさとCortex-M4F用
にしてしまった方が良いでしょう。



↑ということでいつものChan氏のプログラムを走らせてみました。

特筆すべきはF2系では何とか動くものの安定していなかった48MHz動作のSDIOが
F4系では非常に安定してることで、SDカードとさらに大容量/高速なデータのやり取りが
できるようになっています。ただし高速なクロックに耐えうるSDカードの選択は必須で、
Class10のカードを必ず選んでください。最近出回ってるUHS-1の奴は逆に駄目なものも
ありましたので幾つか購入して試してみてください。あと当たり前のことですが、配線の
引き回しもものすごく重要なので注意してください。

↑でたらめ書いてました。SDカードの仕様上通常モード(NomalSpeed)は25MHzが
 上限値でSTM32F2/F4ではUSBとの共用を考えると24MHzが現実的に安定して動かせ
 られるクロック上限となります。お詫びして訂正しましま。

んでもって前回さらっとお見せしたSTM32F4 Discoveryの方のいつものですが、ちゃんとした
実装にあたり、周辺にぶら下がってる回路の影響でどのように構成すべきか悩みました。
なぜならば…
SDIO : SDIO_CLKがCS43L22のSDINとかぶってるから使えない
FSMC : 肝心のnRDがCS43L22のResetに、nWRがUSBの過電流検出に被ってて(ry
    その他諸々のペリフェラルが被ってて(ry
SPI3 : CS43L22がI2S3として使ってて(ryついでにI2C1も
SPI2 : MP45DT02がI2S2とし(ry
SPI1 : LIS302DLがSPI1(ry


まぢでひっぺがしたろかと思いましたが先に書いた通りSTM32F407ZGTが手に入った
のでSTM32+SDIO+FATFS+FSMCの構成はこっちに実装してDiscoveryの方は既存のペリフェラル
と何とか共存する道を選んでみました。
てわけで妥協したのが以下のSTM32+MMC+FATFS+SPI-LCDのプラン…。

SDカード : SPI1(LIS302DL(SPI通信)と共用)
TFT液晶 : SPI2(MP45DT02(I2S通信)と排他)
      ※STM32F4DiscoveryではSPITFT液晶のみ対応
その他  : CS43L22は丸々残す!
      UARTはUART2(TX:PA2 RX:PA3)
SDカードとSPITFT液晶はもちろんDMA化してあります。

TFT液晶がシリアルしか使えない上にMOSIがI2Sの入力とかぶってしまうのでMP45DT02
とは排他になっていますが、必要な人はGPIOによるソフトSPI(超遅いですが)で逃げても
よいと思います。私のLCD表示ドライバは潰しが効くようにかなり柔軟にデバイス依存の
部分を作り込んであります。またSTM32F1系ではペリフェラルはひとかたまり単位でしか
リマップできない構成でしたが、F2系以降はピン単位で柔軟なリマップができるように
なったのでみなさんもデータシートとにらめっこして工夫してみてください。

とりあえずSTM32F4 Discovery上でこの構成でハード改造を行わずに音楽再生はかろう
じてできるでしょうか。音再生関係の作り込みはこれからなのでがんばってみます!




てわけでいつものコードでSDカードの読み出し速度比較を行ってみました。
使用したカードはClass10が策定される前に販売されたATP製4GBClass6のmicroSDです。



STM32F4Discovery上で組んだFatFsは先に書いた通りの構成ですが、SPI1は42MHz
まで叩きだせるので読み出し速度もめっちゃ速いです!(注:SDカードは選びます)
音楽再生程度ならもう十分な早さですね♥今回の実装に際してMMCのSTM32用
ドライバも移植性をかなり高めた作りにしてみました(もちろんDMA化も)!

ちなみにDMA化に際する注意事項ですが、前回も言及していますが、CCM領域をDMAの
読み書き先として利用することは一切できません!
STM32F4系でCCM領域を高速な
スタック領域として使用する前提でF2系から移植を考えた場合、既存のプログラムがauto変数
をDMAの読み書き先として定義されていると特定困難な不具合に悩まされる可能性があ
りますのでよく吟味してください。


お次は中華生基板(STM32F407ZGT6)で組んだSDIOの読み出しスピードです。
上にも書いていますが、F2系ではコケまくって全く安定してなかった48MHzのクロック
でも安定してアクセスができるようになり、20MByte/Sec以上のすさまじいスピードで
読み出しが可能になりました♥ちなみにこの基板上ではFSMCもDMA化してます!



バグ出しもほとんど終わり、最低限のドキュメントもそろいましたのでSTM32F4 Discovery
と中華基板対応のいつものコードを公開します。makeファイル内の定義でSTM32F4Discoveryと
中華生基板のビルドを切り替えることができます。その他細かい部分のノウハウは口で説明す
るよりソース見てもらった方が分かると思います。だから誰か早くSTM32F4Discovery
mp3プレーヤー作ってくだち!!

20121220追:
STM32F4Discovery用でMP3再生機能追加しました!




あ、お伝え忘れてました。今回の公開に当たってSTM32F2系STM32F107、そして
最近この検索ワードでアクセスが急増中のSTM32VLDiscovery向けのFatFs+液晶表示
プログラムも大幅に更新しておきました
んでもってOpenOCD用Flash書き込みCFG群もSTM32F4xx用を追加しておきましたよぅ

Go to top of page