STM32F4シリーズを使ってみる12 - FatFsとSDカード再考その1 -

このぶろぐを始めてから今に至るまで「FatFsがうごきません><」という漠然としすぎて
すごく返答しづらい内容の質問をコンスタントに頂くのですがその9割が単なる配線ミス
でしたと言うオチだったのですが、残る1割にSTM32に潜んでいた未知のエラッタや
評価ボードの設計不備、および私の不備というクリチカルな問題が潜んでいたのが
分かっています。

STM32F4が世に出て早数年、いろんな情報やノウハウも出そろってきましたので
ここで基本に還ってF4中心にSTM32とSDカードを接続せしめる手法について今一度
考察していきたいと思います。まず予習としてChaN氏のFatFsMMCの解説のページ
は必ず目を通しておいてください。



●STM32F4との接続・ハードウエア編
STM32F4とSDカードを実用的に繋げるためにはSTM32F4の周辺機能であるSPI若しくは
SDIOを用いて接続可能です。SPIはデータ線が1bitのシリアルですがSDIOは4bit(8bitまで
可能だが8bitバスが利用できるカードは限られている)まで可能でSDIOの方が高速に
データをやり取り可能です。
その代りSDIOの場合はその機能を最大限に引き出すため使用するI/Oポートは固定化
されていてSDIOを使うときは重複する他の周辺機能は使用不可能になります。
一方でSPIは柔軟に割り当てが可能なためピン数がすくない品種で速度をそれほど
要しない場面でSDカードを使う際に重宝します。

おさらいですがSPIを使用するときはSD/MMCのSPI互換モード、SDIOを使用する
時はSD/MMCのネイティブモードとして接続します。当ぶろぐではSDIOを使用する
SD/MMCネイティブモードに特に焦点を当てていきます。


私のおきぱのSTM32F4向けのサンプルではSTM32F4Discovery,STM32F429IDiscovery
ではSPIを、その他のボードに関してはSDIOをそれぞれ使用するようにしております。

↑STM32F4Discoveryとの接続(SPI)

↑紅牛/ECH_BOARD改造基板との接続(SDIO 4bitmode)

SDIO,SPIのいずれの場合においてもSDカード/MMCの電源投入後の初期化時はオープン
コレクタで動作することが前提のため、CLKを除く全てのデータ線は必ず外付け抵抗でプルアップ
してください。プルアップ抵抗値についてはNxPさんのアプリケーションノートAN10911
極めて詳しい解説があります。私はそれらを吟味した上で10kohmよりちょっと上の
22kohmを常用しております。メーカ製評価ボードでは入手の容易なSDHCカードを想定
しているのか下限値の10kohmで吊っているのが非常に多かったです。また、今日びの
マイコンは内蔵プルアップを有する物が多いですがそれに絶対に頼ってはいけません。
面倒臭がらず必ず外付け抵抗を用いてプルアップしてください。

以前MCIを動作させるのに難儀していた中華LPC1788基板ですがEA互換のはずなのに
EA向けのFatFsのサンプルがそのままでは動かないもんで回路図をよく見たら…

SDIOの信号線にプルアップが無かったorzちゃんとつけましょう!
このブログ記事を書く際に久しぶりに動かしてようやく気づいたorz

CLKは基本宙ぶらりんです。リセット直後のI/Oの挙動が不安な場合は100kohm程度で
Loレベルに弱く固定すれば良いです。私が見た限りではEAのボードは「宙ぶらりん
(ダンピング抵抗有)」、ST系のボードも「宙ぶらりん」、中華系のは適当で他のI/Oと
一緒にまとめてCLKもプルアップしてたりそもそも基板の設計不良でCLK以外の必須
の信号線すらプルアップしてなかったりしますがCLKに関しては基本「宙ぶらりん」で
良いと思います。と言いたいところですが!!
STM32のSDIO_CLKは非常に高速なクロックが走り、パタンの引き回しによっては
信号の反射によって猛烈なリンギングを発生させるため信号の信頼性が著しく低下して
しまいます。よってSDIO_CLKの出力端のごくごく近くに純抵抗成分を配置して伝送経路の
インピーダンスのマッチングを図り信号の反射を抑える必要があります。
最適な抵抗値は回路構成や回路パタンの引き回しに大きく左右されるため0~47ohmを
目安にオシロとにらめっこしながら切った貼ったをして決めましょう。繰り返しますが
直列終端は信号源のすぐ近くに配置しないと後で述べるフェライトビードの配置と同じく
全く効果がないどころか最悪パワーアップさせてしまいますので基板設計の段階から考慮
しておくべきです。

20160110追:
直列抵抗入れてもダメならフェライトビーズも足してください。



プルアップの他に注意すべき点は3つあります。
1.ブレッドボードの使用は避ける
 ブレッドボードの使用は「SDカードが繋がらない」の諸悪の根源です。結線ミスが
 原因のトラブルでブレッドボードで実験していたという証言が非常に多かったです。
 ブレッドボードは確かに便利ですが、SDカードに限らず接触不良や接点抵抗の増大
 によるさまざまなトラブルのもとに繋がります。面倒でも半田付けを行う癖をつけ
 ましょう。とは言え何でもかんでも半田付けもだめです。丸端を圧着せず半田付け
 とかもってのほかです#

 
 同じ理由でSDカードソケットに接触圧が弱く金メッキの薄い中華製の安物を使うと
 接触不良につながります。注意しましょう。接触不良の問題は状態が変わりやすく
 不具合を特定しずらいので厄介です。

 ぇ?お前ブレッドボードより酷いやっけつな使い方してるじゃんですって!?
 わ…ゎたしは理解した上でやってるからいいんですよぅ!


2.結線はなるべく短く
 これもSDカードに限らず基本中の基本ですね。SDIOの場合はMAX52MHz、通常使い
 でも25MHzもの高速クロックが走ります。クロストークが起こらないような配線を
 考慮しなければなりません。
 
 
 とはいえ利便性も考えないといけません。私の場合はSTM32F4Discoveryで使う
 場合はトレードオフでカードコネクタに対してこんな配置にしております。
 配線長が10cmを超えてしまうとTCK=21MHzだと"あうち"です。なるべく太く短く
 目指しましょう。ちなみにパワーメッシュ基板を使うと配線もしやすくGNDも安定して
 いろいろ楽ができるのでオススメです。

3.電源
 電源は出来合いのボードを使う際の意外な落とし穴になります。SDカードの仕様と
 STM32F4で使用できる全てのSDカードのモードを考慮すると最大200mA必要とします。
 STM32F4Discoveryの3.3V(はショットキDi経由してるので3Vくらいに落ちる)から
 引っ張ってきても"何とか"動きますが高速で信号のやり取りをしていると特に書き
 込み動作の際に不安定になってきます。
 こんな場合は、フェライトビードを無暗に挟むよりもSDカード電源供給専用LDOを
 用意してあげると効果的です。このとき使うLDOはSDカードの高速アクセス時の大電流
 の吸い込み吐き出しに対応するためにセラミックコンデンサ対応の負荷の過渡応答
 性に優れたものを選んでください。
 STM32でSPI限定で使用する場合、仕様上最大で100mAあればよいので秋月さんの
 ラインナップでいうとXC6202P332PR-GTAR5SB33で十分です。勿論LDOの電圧
 供給源(ほとんどの場合はUSBの+5V)は評価ボートと同じ系統にしてください。

 
 ねむさいんは当然のごとく攻守ともに優れたLT1963Aです♥
 ↑秋月さんも私が指摘してた'A'付きにようやく気づいたようでMLCC対応と明記してます。

全然考を察していない内容になっちゃいましたが次回は既存のライブラリを駆使
してMMC/SDIOドライバを組んで実際に動かすソフト編をご紹介します。

STM32F4シリーズを使ってみる11 - STM32F429I-Discovery発動編 -

ぇー…前回のSTM32の記事の最後で新しいコードスニペットと称するどことなく卑猥な名称
のふれこみで発表されたSTM32CubeMXとそのF4シリーズのサポートを行うCubeF4という
新たなファームウエアライブラリに触れましたが…
私も移植を目指して頑張ってたのですが…

私の従来のいつものに当てはめようと思うと改造個所が多岐に及び、さらにコードサイズ
とオーバーヘッドも増加してしまったので移植は見送りにして新規に作るプロジェクトから
CubeF4を使用する方針に逃げ変えました。

STM32CubeF4には抽象化がさら進められ、インスタンスという概念が追加されています。
これがかなりの曲者で従来のF4シリーズで言うDSP_StdPeriph_Driverライブラリに相当
する"STM32F4xx_HAL_Driver"はすべてこれの使用を前提としていてさらにサイズが
大きい構造体と併用しなければならないのが分かりました。これSRAMやFLASHのリソース
が膨大にあるF4シリーズだからよいものをF1/F0にも当てはめるのはかなりヤバいと思います。
私も過度の抽象化は良いとは思っていません。移植性を重視しすぎてせっかくのマイコン
の性能を引き出せないのであれば本末転倒です。

あんまし考えたくないのですが無理くそ全CPUの格差を埋めるべく抽象化を目指し、
そして失敗して結局ライブラリのバージョンが多岐に分かれてしまったLPCOpenと同じ
道を歩んでいる感じがします。
おそらくCube系のライブラリに遷移していくあたって大混乱が起こると思いますね。
無理にCubeへの遷移を煽る中途半端に発言力が持ってる人が湧くのは容易に予測
されます。学生さんなんかは自分のボスの"せんせい"にまたCubeライブラリの使い方を
wikiにまとめさせられると思います。そういうこと言ってくる人らには"こんなことしてる
こと自体が時間の無駄。したけりゃ自分でやれ!"とはっきりNOを突き付けるべきです
とはいえ私のぶろぐを見られている方は私よりも技術力がはるかに上の方ばっかな
のでそもそもこんなとこ見てない私が注意しなくても各自しっかり対処出来することが
できるでしょうからぐだぐだ言いましたがやっぱし私の杞憂かなと思います。




さて、前置きが長くなってしまいましたが以前から触れてきたSTM32F429I-Discoveryの
TFT-LCDをSPIではなくRGBインターフェースで動かすことに成功しました。
前回は低速なSPIインターフェースでお茶を濁していました。しかしSTM32F429シリーズ
にTFT-LCDに特化したグラフィックコントローラ(LTDC)とグラフィックに特化したDMAである
(Chrom-ART Accelerator)が搭載されているのでこれらの機能を使っていつものの再現
を目指しようやく完成したわけです。

●STM32F429Iにあるグラフィック機能
私が説明するよりもこちらのPDFを見たら一目瞭然です。
LTDCに関してはフレームバッファとして確保したメモリアドレスにRGBのデータを書き込む
だけで色の表示が可能です。また、STM32F429系ではSDRAMがサポートされているので
容量を喰う画像データでも余裕で取り扱うことができます。

Chrom-ART Acceleratorに関しては別名DMA2Dと称されていて文字通り2Dグラフィック
特化型DMAです。しかもデータ形式を変換してメモリ間転送したり単一データを指定して
転送する(レクタングルフィルに効果を発揮)ことができます。

STM32F429I-Discoveryでは上記二つの機能を体験可能です。同ボードに搭載されたTFT
LCDの解像度は工作物ではメジャーな240x320となっています。STM32のLTDC単体では
レクタングルを指定して書き込み時にアドレスを自動インクリメントしながら連続で書き
込める機能はない(DMA2Dで解説します)ためアドレス計算は必須です。
具体的にいうとたとえば座標x,yにドットを打ちたい場合は基本的には先ず以下のように
座標を指定します(RGB=565,1ドットあたり2Byteのデータを想定)。


lcd_c_buf_ptr = lcd_f_buf_ptr + 2*(x + (MAX_X*y));

lcd_c_buf_ptr :ドットデータを実際に書き込むメモリのアドレス
lcd_f_buf_ptr :フレームバッファとして確保したメモリ領域のベースアドレス
MAX_X :TFT-LCDのX軸の最大ドット数(F429I-Discoveryでは240と定義)


次にRGBデータcolourを書き込みます。

*(volatile uint16_t*)(lcd_c_buf_ptr) = colour;
lcd_c_buf_ptr +=2;

より具体的な実装はいつものの./lib/display/mcu_depend/src/lcdc_if_basis.cをご覧
下さい。FONTX2等の描画ルーチンは完全にドット単位で行っていますがMCUバスと外部
LCDコントローラとの通信オーバーヘッドがなくなるのでドット単位でも十分に早くなり
ます。また、LTDCは2枚のレイヤーを使用可能でさらにアルファブレンディングの透過
効果も使用可能です。現状では単一のレイヤとしてしか使用していませんがこちらも
学習を重ねてモノにしていきます!


次にもう一つの目玉機能Chrom-ART Accelerator(以下DMA2D)です。私のいつものでは
FillRect系のレクタングル指定塗りつぶしやレクタングル指定の動画データ転送に使用
しています。

基本的には通常のDMAと同じですがグラフィック特化なのでRGBデータを格納するレジ
スタもあります。単一色描画では以下のように設定します。
※RGB565,黒色,全画面(240x320)塗りつぶしの場合

/* configure DMA2D */
DMA2D_DeInit();
DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;
DMA2D_InitStruct.DMA2D_OutputGreen = (0x07E0 & COL_BLACK) >> 5;
DMA2D_InitStruct.DMA2D_OutputBlue = 0x001F & COL_BLACK;
DMA2D_InitStruct.DMA2D_OutputRed = (0xF800 & COL_BLACK) >> 11;
DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = (uint32_t)lcd_f_buf_ptr;
DMA2D_InitStruct.DMA2D_OutputOffset = (MAX_X - 1));
DMA2D_InitStruct.DMA2D_NumberOfLine = MAX_X+1;
DMA2D_InitStruct.DMA2D_PixelPerLine = MAX_Y+1;
DMA2D_Init(&DMA2D_InitStruct);
/* Start Transfer */
DMA2D_StartTransfer();
/* Wait for CTC Flag activation */
while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET){}


lcd_f_buf_ptr :フレームバッファとして確保したメモリ領域のベースアドレス
MAX_X :TFT-LCDのX軸の最大ドット数(F429I-Discoveryでは240と定義
MAX_Y :TFT-LCDのY軸の最大ドット数(F429I-Discoveryでは320と定義


フォアグラウンドのレイヤーへ画像データを転送したい場合は以下のように。

/* configure DMA2D */
DMA2D_DeInit();
DMA2D_InitStruct.DMA2D_Mode = DMA2D_M2M;
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;
DMA2D_InitStruct.DMA2D_OutputGreen = 0; /* M2M系転送の場合は使わない */
DMA2D_InitStruct.DMA2D_OutputBlue = 0; /* M2M系転送の場合は使わない */
DMA2D_InitStruct.DMA2D_OutputRed = 0; /* M2M系転送の場合は使わない */
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = (uint32_t)lcd_f_buf_ptr;
DMA2D_InitStruct.DMA2D_OutputOffset = 1;
DMA2D_InitStruct.DMA2D_NumberOfLine = MAX_X+1;
DMA2D_InitStruct.DMA2D_PixelPerLine = MAX_Y+1;
DMA2D_Init(&DMA2D_InitStruct);

/* Configure default values for foreground */
DMA2D_FG_StructInit(&DMA2D_FG_InitStruct);
DMA2D_FG_InitStruct.DMA2D_FGMA = (uint32_t)p;
DMA2D_FGConfig(&DMA2D_FG_InitStruct);

/* Start Transfer */
DMA2D_StartTransfer();
/* Wait for CTC Flag activation */
while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET){}


lcd_f_buf_ptr :フレームバッファとして確保したメモリ領域のベースアドレス
MAX_X :TFT-LCDのX軸の最大ドット数(F429I-Discoveryでは240と定義
MAX_Y :TFT-LCDのY軸の最大ドット数(F429I-Discoveryでは320と定義
p :転送したい画像データのポインタ

と、従来のDMAと同じ感覚で使用が可能です。もっと汎用なDMA2Dの使用法は同じく
lcdc_if_basis.cをご参照ください。DMA2DはLTDCと組み合わせると強力なレイヤー機能が
使えるようになるでしょうね。私のサンプルでは全く使いこなせてませんがー!


という訳でそれを踏まえたいつものをビルドして書き込み、動作させたものが上の画像です。
静止画では違いが分からないと思いますが以前の8-bitSPIのみで動かしてたものとは
描画速度がダンチですよ♥


惜しむらくはSTM32F429I-Discoveryに使用されているTFT-LCDが発色にちょっと劣る点
です。2014年現在では超高視野角液晶はすでにホビイストでも容易に入手可能なので
それに慣れた私にとってはあと一歩がほしいところと感じました(多分最新の奴搭載し
たら値段跳ね上がるでしょうけど)。




いつものFatFs+TFTLCD表示サンプルの細かい整備など

LTDC+DMA2Dに対応したついでに長らく放置していた全部載せSTM32F427IIT6基板
プログラムも見直して安定化を図りました。いまさら気付いたのですが、新しいSTM32F4に
存在するFMC(フレキシブル・メモリコントローラ)ではFSMCの設定とは微妙に違っておりました…。

なんとFSMCでは存在しなかった変数が構造体に追加されていてこれを設定してなかった
せいで動作が不安定になっておりましたorzいまさら気付きましたがまだFMC世代の新しい
STM32F4を使用されている方が少ないのか指摘されず助かりましたうふふふふふふふf

また、この全部載せ基板はI2Cのコーデックも乗っていて音質は非常に悪いですがmp3や
waveファイルの再生も可能です。私のいつものプログラムではSDIO経由でSDカードのmp3
ファイルなどを読みだして再生します…がしかしビットレートが高いmp3の再生ではSDIOの
データ読みだしにDMAの転送を行うとI2Sの方のサーキュラモードDMA転送と干渉しまくり
あっという間にオーバーフローになってエラーをはいて止まります。

という訳でこれを避けるためにSTM32F4でもFIFOのポーリングでの読み書きに本格的に
対応させることにしました。STマイクロ配布のSTM32F4のデモではポーリングの読み
書きはRead/WriteBlockしか対応しておらず非常に低速度なのですがマルチブロック転送
でもポーリングで読み書きできるように改良しております。ポーリングでもDMAとほぼ
同等の転送速度が得られたので速度に関しては問題なしです。


…という訳でDMAあえてを使用せずポーリングによる読み出しだけで無事ビットレートの
高いmp3ファイルの再生も可能となりましためでたしめでたし!
(helixのフォルダにあるassembly.hのマクロが前回の機能追加で間違っててそもそもmp3
 ファイルが全く再生できなくなっていたのは見逃していただきたい)


●もいっこおまけ
私のいつものでは一部のmp3ファイルを再生したときにアーティスト/曲名情報表示の際に
ゴミデータが表示されてしまっておりましたが、こちらも文字列ストア用のバッファ(私の
プログラムではCCM領域にあたる)を一旦ゼロクリアしてから表示を行うようにしてバグを
潰しております。

以前は変なゴミデータが表示されていましたが…、

修正後はこんな感じにすっきりです★

STM32F4シリーズを使ってみる9 - STM32F429I-Discovery準備編 -

STM32F429I-Discovery(製品名:STM32F429I-DISCO)、ようやく一般市場でも入手
しやすくなってきましたね。twitterのタイムライン見てると既に手に入れられた方、使用
されている方々の写真もびしばし上がってます。

私の方はというと…少数の方は更新に気づいていたとは思いますが、東海自然歩道へと
向かう前日の11/29にすでに既存のSTM32F4向けFatFs実装例に対応ボードの一つとし
て基本部分を組み入れたソースコードを公開しております。
尤も429I-DiscoveryからはぢめてF4シリーズに触る奇特な人もいるかもしれませんから
これがどういう物で何ができるか今一度軽く解説をさせていただきます。
※注意※
 ここここを見て私のプロジェクトをビルド・デバッグ出来る環境拵えてることが
 前提です!"意味が分からない"という方はご縁がなかったということで…



私のFatFs実装例(通称いつもの)は、ChaNさんのFatFsを中心に各マイコンの極めて
基本的な機能を網羅しています。STM32F4においては下に述べる機能を抑えています。
STM32F429I-Discoveryでも勿論使用しております。

 1.GPIO操作
  ->LED点滅・SW入力
 2.UART
  ->割り込みを使用したバッファリングされた送受信・stdioのリダイレクト
 3.液晶モジュール
  ->MCUバスインターフェース(i8080,SPI,I2C)で駆動できる表示素子の操作
   STM32F429I-DiscoveryはRGBインターフェースを使わずともSPI単体でも画像
   データを送ることができます(遅いですが)。
 4.FatFsのローレベル部の実装
  ->SPIやSDIO等とMMC/SDカードとのインターフェース。STM32F429I-Discoveryでは
   SPI4を使用しSPI互換モードでSD/MMCを動作させております。
   
 5.外部RAMの制御
  ->STM32F407系はFSMCでSRAMを、STM32F429I-DiscoveryではFMCでSDRAMを制御
   します。


んでもっていつものをSTM32F429I-Discoveryで動かしているところ

DMAの転送に使用される内蔵RAMが圧倒的に増加したので多少転送効率もよくなり、
その分ヒープ領域もたくさん取れるようになったのもうれしいです♥
画像はRAM馬鹿食いのgiflibを動かしてるところ

ファイラーの操作はタッチパネルより。STM32F429I-Discvoeryではコントローラに
内蔵のフィルタがあるSTMPE811が使用されているのでキャリブレーションも簡略化
しました。同基板ではVBATがVCC直結で外部にピンが出ておらずバックアップRAMが
機能しないので苦肉の策です…

タッチパネルからのファイラーの操作は上下でファイルポインタ移動、右で選択、
左でキャンセルと手抜k直感的です!


前回述べていた基礎のとっかかりに関しては対応完了です。このプロジェクトではまだ
STM32F429I-Discoveryの機能のすべてを使いこなしてはいません。以下の項目は目下
実装中のSTM32F429にしか使えない機能です。

 1.LCDCを使用したRGBインターフェースによる高速な表示
  ->前回はやっけつで急ごしらえしましたが過去の資産をなんとか生かせるように
   作り変えてます…こちらはもうすぐ完了…。
 2.FatFsのファイル読み書き先をSDカードからUSBメモリに
  ->これ結構作業量ががが
   こちらに関しては先人の作例も数多くあるので参考にさせてもらってます。
   せっかくUSB-OTGがあるのにSDカードばっか使っててもったいないですから自身
   の学習がてらに実装がんばります!



そういうわけでSTM32F429I-Discoveryのフル機能を駆使した作例のほうはもう少しお待ち
ください。過去のSTM32F407系の作例と完全に切り離してSTM32F429I-Discovery専用の
プロジェクトとして公開する予定です。


おまけ

1年以上前に購入した699元全部載せSTM32F407基板もSTM32F427IIT6に換装してパワー
アップさせました。実はずーーーーっとF427系のチップが出るの待っていたのです!
こっちはこっちでF407系の資産生かしてなおかつ強化する方向で遊んでいきます。

PARTYHARD!(見えづらいですが左上)

もいっこおまけ

STM32F42xxx&STM32F43xxx系をJTAGから見た場合バウンダリスキャンのTAPIDが
40x系と違うものになってるのでOpenOCDで書き込もうとするとコけます。
この修正はgerritに投げてますのでOpenCOD0.9.0あたりで反映されるはずです。

OpenOCD小ネタ4 -LPC810に書き込みできないの-

>8PinDIPのARMマイコンLPC810、ようやく一般市場に出回る!

あのさぁ…私がLPC812を最初に手に入れてからもう約1年たったんですよぅ約1年!
それを今更…


こんなのこうしてやる!
STM32F0Discoveryが放つprobeに捕えられDiscloseされる哀れなLPC810の姿。

ぐへへ32bitマイコンのくせにこんなにいやらしく足(間隔:2.54mm)広げやがって♥


はぁ…はぁ…でもあんまし攻めると某ウイルスバスターのweb広告に出てくる
コワモテ893
に似たNxPの中の人にこのぶろぐ焼き討ちされちゃいますのでこの辺に
しておいてあげます…

20131205追:
上尾の亞妃威(あげおのあっぴぃ)様がLPC810について猛ってらっしゃる…
↑そいえばChaNさんのレポートの序盤のCMSISペリフェラルライブラリの下りの文章が
 "お前らはこの程度で充分だろ"から"タダなんだからこの程度の品質でいいだろ!"
 というややマイルドな表現にさりげなく差し替わってますね…。

↑CMSISが厭だ、嫌いって人たち話を注意深く聞くとARM提供のCMSIS
 ヘッダライブラリに対してではなく各チップベンダ提供のCMSIS準拠
 ペリフェラルライブラリの出来の悪さにひどい目にあわされた方が異口
 同音におっしゃっているのを実感します。私もそれについては非常に同意します。
 KinetisLシリーズとかのシリアルライブラリはなんとK40シリーズからの
 適当なこぴぺでまともに動いてない代物でした。

↑そんなわけでCMSISべったり派なねむいさんもペリフェラルのレジスタ
 定義だけ拝借してSD/MMC等の下回りのドライバなどは手書きが多いです。

↑CMSISのイディオムは"シムシス"だそうです。わたしは"しゐえむしす"を
 貫き通しています。McDonaldsはマドです。









…さて戯言はこの辺にしといてOpenOCDにおいては既にねむいさんがLPC800シリーズ向けの
ぱっちを提供し、STLink/V2,Versaloon(※要パッチ),CMSIS-DAP(※要パッチ)の各デバッガ
ハードウエアからSWDで書き込みが可能です。一応購入したからせっかくだから上記
写真のようにちょっと通電してSTLink/V2で書き込んでやろうかなと思ったのですが…


> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-v2.cfg -f target/lpc810_hla_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.8.0-dev-00269-g30fb9dd-dirty (2013-11-19-20:50)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
none separate
Info : This adapter doesn't support configurable speed
Info : STLINK v2 JTAG v17 API v2 SWIM v0 VID 0x0483 PID 0x3748
Info : Target voltage: 2.891327
Info : lpc810.cpu: hardware has 4 breakpoints, 2 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x1fff0008 msp: 0x10000ffc
auto erase enabled
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
Warn : not enough working area available(requested 512)
Error: no working area specified, can't write LPC2000 internal flash
Error: error writing to flash at address 0x00000000 at offset 0x00000000
Runtime Error: C:/Devz/ARM/OCD/tcl/target/lpc810_hla_flash.cfg:112:
in procedure 'mt_flash'
in procedure 'flash' called at file "C:/Devz/ARM/OCD/tcl/target/lpc810_hla_flash.cfg", line 112
make: *** [program] エラー 1

> Process Exit Code: 2
> Time Taken: 00:01

↑あれれ…書けない…だめじゃん(LPC812は問題なし)
 まさか…


lpc2000.c中でIAPコマンド51番を実行する時にバッファサイズを指定するのですがLPC800
シリーズは一律1024Byteに減少させていました(LPC2000.cのデフォルトは4096Byte)。
LPC810のSRAMサイズは1024Byteなのでこれでも足らないみたいです。いろいろ試した
結果、実サイズの4分1の256Byteまで落として成功しました。

> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-v2.cfg -f target/lpc810_hla_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.8.0-dev-00269-g30fb9dd-dirty (2013-11-19-20:50)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
none separate
Info : This adapter doesn't support configurable speed
Info : STLINK v2 JTAG v17 API v2 SWIM v0 VID 0x0483 PID 0x3748
Info : Target voltage: 2.872920
Info : lpc810.cpu: hardware has 4 breakpoints, 2 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x1fff0008 msp: 0x10000ffc
auto erase enabled
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x10000004 msp: 0x100000c8
wrote 3072 bytes from file main.elf in 0.749995s (4.000 KiB/s)
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x1000002e msp: 0x10000ffc
verified 2400 bytes in 0.062500s (37.500 KiB/s)
shutdown command invoked

> Process Exit Code: 0
> Time Taken: 00:02

↑cmd51のバッファサイズを下げると書き込みパフォーマンスが下がってしまうのですが
 LPC810はフラッシュのサイズも4096バイトしかないので問題ないです。


なおLPC810は8PinDIPですがお外に出てない足がある模様です。ないはずのピンにアク
セスするとちゃんと出力が変化しました。上画像のデバッグではLPC812のプロジェクト
をスタックとチェックサムだけLPC810用に書き換えたやっけつVerです。


そんなわけで今回の修正分を盛り込んだOpenOCDバイナリはおきぱに反映しました。
珍しくメールやコメントでバグのご指摘もらう前に自分で気づきましたよ!OpenOCD
のgerritにも今レビュー中のSTM32F4のパッチがマージされたら反映させます。
20140109追:
ぱっち提出しました。
20140112追:
マージされました♥


LPC810は同じ8ピンDIPマイコンのAVRの牙城を崩すことができるのか?それは時間が
経てばおのずとわかると思います。





おまけ

STM32F429I-Discoveryいじりは基本のいつものが実装できるとこまで進みました。
あと数日くらいでファイル公開予定です。実物持ってる人はmakefileの定義を429IDiscoveryに
変えててためしてみてください。ファイルの読み書きはSPI接続のMMCなので別途sdカード
スロット取付等の配線作業が必要です。

SPIの4つの信号線は22〜47kohmでプルアップを忘れずに!
また429I-Dsicoveryはオンボの+3.3Vレギュレーターが550mAまで出せるのでSDカード
一枚程度なら別途3.3Vの電源を用意する必要もないです。


↑しかし液晶載せたおかげでSTM32F4Discoveryよりでかい…
 その液晶がIPSやMVAじゃなく普通の視野角が狭い液晶なのは減点ポインツです#

なにはともあれこれをたたき台にしてSTM32F429I-Discovery専用に改造
しまくっていきましょう!

STM32F4シリーズを使ってみる8 - STM32F429I-Discovery接触編 -


デン!

デデン!
…ッツついに来ましたよ…!最強に強まったSTM32F4が…!
後ろに見えるSTM32F437IIT6も後日に…



STM32F429I-Discoveryは現時点のSTMマイコンの中で最強種のSTM32F429とそれが
サポートする64MbitのSDRAMとRGBインターフェースが利用できるTFT-LCDまで搭載
されたまさにねむいさんのために作られたようなボードです!
※正式名称は「STM32F429I-DISCO」だそうです。


STM32F429/439シリーズはRGBインターフェースのTFT-LCDドライバとSDRAMをサポート
するFMC(FSMCからSが取れた)を持ち、最高クロック180MHzで動作するCortex-M4Fの
コアを持つマイコンです。


ついにSDRAMが…♥もうヒープサイズ気にしなくていいんじゃあんちゃん
ちなみにTFT-LCDドライバのフレームバッファ用にも使われるそうです。


とりあえず電源を入れてみるとSTLink/V2が認識してemWinと呼ばれる小洒落たGUIが
走ります。凄いもんだ…基板上に実装されたTFT-LCDの解像度は240x320です。
タッチするといろいろメニューが選択できます。本来はUSBメモリ等の記憶媒体を
挿しておくようになってるみたいですね。


今は168MHzで動いてるらしいです。



…で、
一通りデモプログラムを確認したのであとはおなじみOpenOCDで内蔵フラッシュメモリ
のバックアップをとり(2MBあるので5分くらいかかりましたよ!) 前もって予習してい
たLEDチカチカプログラムを書き込んで一発動作を確認♥
おきぱのSTM32F4向けサンプルの定義をほんの少し変えるだけで事は済みました…。

お次は目玉のTFT-LCDです。ねむいさんはこっちももちろん予習済です。STM32F42x/43x系
ではUSB用SRAMの容量拡張のほかSPIやI2C等の基本となるペリフェラルも数が大幅に
増えていて更なる柔軟な回路構成が可能となっています。


それではここらへんでいつものを…このTFT-LCDのコントローラICは定番のILI9341なので
RGBインターフェースへの応用も楽勝ですね♥
今回表示したのはねむいさんの頂き物のイラス…イラストじゃなくて3D絵です。
あ○たご、抜錨しま〜す♪ぐふふ♥
↑ねむいさんが何のキャラのコスしてるのか最近分かったです…鈍い…
↑ねむいさんて艦これ(ブラウザゲー)やらないの?とよく本職してる時に尋ねら
 れますが、6年前からずっとゴルロア続けてますし今もっともアツいブラゲ
 嵌ってる(作業的な意味で)のでさすがに他のにまで手を出す余裕がないです…。

なお、びぃぶろ君に確実に怒られると思われるえろすな個所はトリミング済みなので
安心してご鑑賞ください。

20131114追:

タッチパネルコントローラはi2cのSTMPE811です。
こちらも予習済なのですんなりいけました!


というわけで今回はSTM32F429I-Discoveryのファーストタッチをご報告させていた
だきました。基本的な部分は初期のSTM32F4とほとんど一緒なのでF4Discoveryからの
移植はそこまで難しくないと感じました。まずはFatFsとChaNさんのファイラーを完全に
移植させます。12月上旬には私のおきぱに新しいラインアップが追加されると思います。

Project Examples and Misc Files

ねむいさん専用のFatFs中心のサンプルコード・プログラム置場です。
私が使いやすいようにGCC環境に勝手にポーティング&改造してあります。
文書の記述間違い・バグを見つけた場合は勝手に修正しています。
太字のリンクは更新頻度高。試される場合は自己責任でお願いします。
Dear All
Here is my ChaN's FatFs implementation examples.
Those projects are suitable to build in GNU-GCC environment.
If you have any question,see here to contact me.


●ARM
(Confirmed on WinXP(x86) Win7,8,10(x64) by ARM-GCC)
ビルドの仕方はこちら
Building Method on Native Windows Environment is Here.


-Cortex-M7
  STM32F7xx(STM32F769I/746G-Discovery supported!)
      (CubeF7:V1.8.0/HAL:V1.2.3)
      (+ HelixMP3/AAC,libjpeg,libpng and giflib decode example)
    *TFT Control Example with ChaN's FatFs(SDMMC-Interface)
     It supports SDXC and eMMC!

-Cortex-M4F
  STM32F4(STM32F407ZGT6/PowerAVR-RedBull Compatible Circuit
      & STM32F437IIT6/盈钰電子STM32F4xxIxT6开发板互換
      & STM32F407VGT6/STM32F4Discovery
      & STM32F429ZIT6/STM32F429I-Discovery are also supported!)
      (FWLib:V1.8.0)
      (+ HelixMP3/AAC,libjpeg,libpng and giflib decode example)
    *TFT/OLED Control Sample with ChaN's FatFs(SDIO&SPI-Interface)
     It supports SDXC and eMMC!

  STM32F401xx(STM32F401RET6/NUCLEO-F401RE Compatible Circuit)
      (CubeF4:V1.16.0/HAL:V1.8.0)
    *KickStart/GG0906186FWNNC Drive example
  STM32F334(STM32F334R8T6/NUCLEO-F334R8 Compatible Circuit)
      (CubeF3:V1.6.0/HAL:V1.3.0)
    *KickStart

  LPC4088(LPC4088/EA4088 Board Semi-Compatible Circuit)
    *ChaN's FatFs Sample(SDMMC-Interface)
     It supports SDXC and eMMC!

  LPC4357(盈钰電子LPC4357开发板互換)
    *ChaN's FatFs Sample(SDMMC-Interface)
     It supports SDXC and eMMC!

  LPC4330(LPC4330-Xplorer Compatible Circuit)
     20150912更新停止
    *SingleCore-KickStart
    *DualCore-KickStart

  LM4F120H5QR(Stellaris Launchpad Compatible)
     20150912更新停止
    *KickStart

  STM32F3(STM32F303VCT6/STM32F3-Discovery Compatible Circuit)
     20150918更新停止
      (CubeF3:V1.1.1)
    *(Deprecated) KickStart


-Cortex-M4
  K20(MK20DX32VLF5)(Bare-Metal)
    *KickStart


-Cortex-M3
  STM32F103(STM32F103VET6/STM32 Primer2)
      (FWLib:V3.6.1 ,USBLib:V4.0.0 ,
       FatFs STM32F1 SDIO-Interface Imprementation)
    *Bare-Metal GPS & GNSS-Tracker using ChaN's FatFs

  EFM32TG822F32(Bare-Metal for TinyGecko)
    *LED-Blink & UART

  LPC13xx(LPC1347/LPCXPresso Compatible Circuit)
    *KickStart

  STM32F2(STM32F207ZGT6/PowerAVR-RedBull Compatible Circuit)
     20150912更新停止
      (FWLib:V1.1.2)
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(SDIO-Interface)

  STM32F107(STM32F107VCT6/CQ-STARM-JUNKBOARD Compatible Circuit)
     20150912更新停止
      (FWLib:V3.6.1 ,USBLib:V4.0.0)
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(SPI-Interface)

  STM32VL(STM32F100RBT6/STM32VL-Discovery Compatible Circuit)
     20150912更新停止
      (FWLib:V3.6.1)
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(STM32VL SPI-Interface)

  STM32L(STM32L152RBT6/STM32L-Discovery Compatible Circuit)
     20150912更新停止
      (FWLib:V1.1.1)
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(STM32L SPI-Interface)

  MB9BF618T(FRK-FM3-GARBAGEBOARD Compatible Circuit)
     20150924更新停止
    *(Deprecated) LED-Blink & UART
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(MFS SPI-Interface)

  MB9AF112K(Bare-Metal)
     20150912更新停止
    *(Deprecated) LED-Blink & UART

  LPC177x/8x(LPC1788/EA1788 Board Semi-Compatible Circuit)
     20160331更新停止
    *(Deprecated) ChaN's FatFs Sample(MCI-Interface)



-Cortex-M0+
  LPC824(LPC824/LPCXPresso Compatible Circuit)
    *KickStart

  KL25(MKL25Z128VLK4/FRDM-KL25Z Compatible Circuit)
    *KickStart
  KE02(MKE02Z64VQH2/FRDM-KE02Z Compatible Circuit)
    *KickStart

  EFM32ZG222F32(For EFM32ZG-STK3200)
    *LED-Blink & UART

  STM32L05xxx(STM32L053C8/STM32L0538-Discovery Compatible Circuit)
    *KickStart

  LPC812(LPC812/LPCXPresso Compatible Circuit)
    20160331更新停止
    *(Deprecated) KickStart
    KL05(MKL05Z32VFM4/FRDM-KL05Z Compatible Circuit)
    20170629更新停止
    *KickStart



-Cortex-M0
  STM32F03x(STM32F030R8T6/NUCLEO-F030R8 Compatible Circuit)
      (CubeF0:V1.6.0/HAL:V1.4.0)
    *KickStart
    *GG0906186FWNNC Drive example

  NUC120LE3(NUC120LE3AN/NuTiny-SDK-NUC120 Compatible Circuit)
    *KickStart
  M0516LBN(NUC120LE3AN/NuTiny-SDK-M0516 Compatible Circuit)
    *KickStart

  LPC11u35(LPC11U35/501 CMSIS-DAP Compatible Circuit)
    *KickStart
    
  STM32F05x(STM32F051R8T6/STM32F0-Discovery Compatible Circuit)
      (CubeF0:V1.3.0)
     20150922更新停止
    *(Deprecated) KickStart

  LPC11xx(LPC1114/LPCXPresso and MARY and DIP28-package Compatible Circuit)
     20150922更新停止
    *(Deprecated) KickStart



-ARM7TDMI
  LPC23xx(LPC2388/CQ-FRK-NXP-ARM-JUNKBOARD Compatible Circuit)
     20150922更新停止
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(MCI-Interface))



●AVR
-XMEGA
  ATxmega128A1
     20150922更新停止
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(SPI-Interface)






●Misc
 -Schematic of JTAGkey2 Compatible Circuit Rev.5
          (Supports 1.4〜5.5V WideVoltage Range)

    *JTAGKey2CompatibleCircuit_Rev.5

  -FLASHROM(SPI-ROM Writer) v0.9.9-r1954 Windows 32bit Binary
     For FT2232/FT232H Devices(WinUSB)

    *flashrom.tar.gz

  -AVRDUDE v6.3-r1392 Windows 32bit Binary
    *avrdude.tar.gz
  ↑AVRDUDE WINDOWS BINARY DOWNLOAD HERE!
   Supported OS WinXP,Win7(x86&x64),Win8.x(x86&x64)


-JTAG Tools
  UrJTAG-0.10-r2052 Windows 32bit Binary
  SupportedHardware
  ->JTAGKey,JTAGkey2 and many FT2232 Devices(WinUSB)
  ->JLink(WinUSB)
  ->JLink On LPCLink2(WinUSB)
    *urjtag.tar.gz


-OpenOCD
  ocd-0.10.0+dev-00197-g2168c47(built on 20171004)
  Windows 32bit Binary Nemuisan's Special Version
  *Supported OS*
   ->WindowsXP(x86),Windows7,8.x,10(x86 or x64)
  *Supported Debugger Hardware*
   ->JTAGKey,JTAGkey2 and many FT2232 Devices(WinUSB)
   ->JLink(WinUSB)
   ->JLink On LPCLink2(WinUSB)
   ->JLink On LPCXpressoV2/V3(WinUSB)
   ->JLink-OB(WinUSB)
   ->ULink(LibUSB) (untested)
   ->RLink(LibUSB) (untested)
   ->STLink/V2(STMicro's Distributed USB-Driver/WinUSB)
   ->Versaloon(WinUSB)
   ->TI-ICDI(TI's Distributed USB-Driver/WinUSB)
   ->CMSIS-DAP(Generic USB-HID/Mbed VCP Driver)
   ->STLink/V2-1(STM32-Nucleo Drivers/WinUSB)
    *OpenOCD Binary Download Here
  SHA-1 HASH:F2AA5822C3ECEFCFB1DE233F8D785DEE3CD006E7


  OpenOCD(0.10.0)'s Specific MCU cfg Files for Flash Programming
    *OpenOCD spesific MCU-Aimed cfg files Nemuisan Special
     ↑Those special cfgs are already contained in my OpenOCD Binary.
      For self build users & linux users only.
  OpenOCD(0.10.0)'s Patch Set(Useful Functions & Fix Patches)
    *OpenOCD Patch Set Nemuisan Special
     ↑For self build users & linux uses only.




 かつてこの欄でFirefox拡張「合間合間に」のバックアップを公開していました。
 ※「赤福Firefox版」/「合間合間に」は有志の方がGitHubにて管理されています。
 ※unmhtは公式復活されています。

Go to top of page