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を除く全てのデータ線は必ず
外付け抵抗でプルアップしてください。
プルアップ抵抗値についてはNexperia(元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では上記二つの機能を体験可能です。同ボードに
搭載されたTFTLCDの解像度は工作物ではメジャーな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の中の人にこのぶろぐ焼き討ちされちゃいますのでこの辺に
しておいてあげます…









…さて戯言はこの辺にしといて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の牙城を崩すことができるのか?
それは時間が経てばおのずとわかると思います。

20230903追:
LPC810は無かったことになり、202309現在ではSTM32G0,STM32C0が攻勢を
強めております。特にSTM32C0は8マイコンを駆逐する勢いです!
20230903追:




おまけ

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 64bit Win7,8,10,11 by ARM-GCC)
ビルドの仕方はこちら
Building Method on Native Windows Environment is Here.


-Cortex-M7
  STM32H7xx(STM32H747I-Discovery supported!)
      (CubeH7:V1.11.0/HAL:V1.11.1)
      (+ HelixMP3/AAC,libjpeg,libpng and giflib decode example)
    *TFT Control Example with ChaN's FatFs(SDMMC-Interface)
     It supports SDXC and eMMC!

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

-Cortex-M33
  STM32H5xx(STM32H563ZI-NUCLEO supported!)
      (CubeH5:V1.1.0/HAL:V1.1.0)
      (+ libjpeg,libpng and giflib decode example)
    *SPI-TFT Control Example with ChaN's FatFs(SDMMC-Interface)
     It supports SDXC and eMMC!

  STM32L5xx(STM32L552ZE-Q-NUCLEO supported!)
      (CubeL5:V1.5.0/HAL:V1.5.0)
      20240101更新停止
      (+ libjpeg,libpng and giflib decode example)
    *SPI-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.24.1/HAL:V1.7.6)
    *KickStart & I2C-LCD/OLED and many Devices example

  STM32F334(STM32F334R8T6/NUCLEO-F334R8 Compatible Circuit)
      (CubeF3:V1.11.0/HAL:V1.5.3)
    *KickStart & I2C-LCD/OLED many Devices examples!

  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更新停止
    *Dual/SingleCore-KickStart

  LM4F120H5QR(Stellaris Launchpad Compatible)
     20150912更新停止
    *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)
     20150912更新停止
    *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+
  STM32G03xxx(STM32G0316-DISCO Compatible Circuit)
    *KickStart & I2C-LCD/OLED and many Devices examples!

  STM32C031xx/STM32C011xx
  (STM32C031C6-NUCLEO/STM32C011XX-DK Compatible Circuit)
    *KickStart & I2C-LCD/OLED and many Devices examples!

  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.7.0/HAL:V1.5.0)
    *KickStart & I2C-LCD/OLED and many Devices examples!

  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)
     20181222更新停止
    *(Deprecated) TFT/OLED Module Control Sample with ChaN's FatFs(MCI-Interface))



●AVR
-AVR-Dx
  AVR128DA48 CuriosityNANO
  (and AVR128DB28,AVR64DD28 baremetal supported)

    *UART & Internal Temperature Test

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





●Windows Tools and Misc
-OpenOCD for Windows
  ocd-0.12.0+dev-00559-g04154af5d(built on 20240412)
  Windows 32bit Binary Nemuisan's Special Version
  *Supported OS*
   ->Windows7,8,10,11(x86 or x64)
   ->WinXP last version is here.
  *Supported Debugger Hardware*
   ->JTAGKey,JTAGkey2 and many FT2232 Devices(WinUSB)
   ->JLink(WinUSB)
   ->JLink On LPCLink2(WinUSB)
   ->JLink On LPCXpressoV2/V3(WinUSB)
   ->JLink-OB(WinUSB)
   ->STLink,/V2,/V2-1 and /V3(STMicro's Distributed USB-Driver/WinUSB)
   ->Versaloon(WinUSB)
   ->TI-ICDI(TI's Distributed USB-Driver/WinUSB)
   ->CMSIS-DAP(Generic USB-HID/Mbed VCP Driver)
   ->Nulink(Generic USB-HID)
    *OPENOCD WINDOWS BINARY HERE!
  SHA-1 HASH:7d74cea37e9cef7de325f617aa303433972ac92f


  OpenOCD(0.13.0)'s Specific MCU cfg Files for Flash Programming=
    *OpenOCD spesific MCU-Aimed cfg files Nemuisan Special
     ↑Notice:Already contained in my OpenOCD Binary.
      For self build users & linux users only.
  OpenOCD(0.13.0)'s Patch Set(Useful Functions & Fix Patches)
    *OpenOCD Patch Set Nemuisan Special
     ↑For self build users & linux uses only.


-AVRDUDE for Windows
  AVRDUDE v7.3 Windows 32bit Binary(built on 20240302)
   Nemuisan's Special Version
   Supported OS
    ->Windows7,8,10,11(x86 or x64)
    *AVRDUDE WINDOWS BINARY HERE!



-SPIROM Writer Tools
  FLASHROM(SPI-ROM Writer)1.4.0-devel (git:v1.2-1394-gf08acc66)
     Windows 32bit Binary(built on 20240210)
     For FT2232/FT232H Devices(WinUSB)

    *flashrom_v1.4.0-1394-gf08acc66.7z


-JTAG Tools
  UrJTAG v2021.03 #d9a2943f(built on 20240210) Windows 32bit Binary
    *urjtag.tar.gz
  SupportedHardware
  ->JTAGKey,JTAGkey2 and many FT2232 Devices(WinUSB)
  ->JLink(WinUSB)
  ->JLink On LPCLink2(WinUSB)


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

    *JTAGKey2CompatibleCircuit_Rev.5





 かつてこの欄でFirefox拡張「合間合間に」のバックアップを公開していました。
20191124更新:
 waterfox向けの「合間合間に」のふたばの仕様変更対応版をサルベージしましたので
 こちらでも公開します。

 ※「赤福Firefox版」/「合間合間に」は有志の方がGitHubにて管理されています。
 ※unmhtはこちらに残っています。

Go to top of page