STM32 Primer2をBARE-METALで使ってみる(終) -フォトフレームを作る-

大きなバグ出しも終わってやっとこ使用に耐えるものが完成です。上位層の作り込みは
Chan氏のFatFsやターミナルプログラムの凡例のおかげで開発期間の大幅な短縮が
できました。そしてCircleOSに頼らないBARE-METALな試みも今回でいったん終了です。

昨今の電子工作は回路検証はもちろんケーシングも非常に重要なファクターになって
いますが、もとからケースに入っているSTM32Primer2はとてもありがたいですなぁ。
…ってことで、


以下今回製作したフォトフレームの使用例を…
※20091226:電源監視機能を強化しました。

※20091126:USB-MSC(マスストレージクラス)機能を追加しました

un
↑4+1入力キーの"真ん中"を押して電源投入。これはハード的に処理されています。

un
↑電源投入->タイトル表示後はSTM32Primer2に挿入されているSDカードを読み込み、ファ
 イラを起動します。ファイルシステムはFatFsを使用しFAT12,FAT16,FAT32のフォーマット・
 およびロングファイルネームが使用可能です(画面上の表示は8.3形式ですが)。

un
↑ファイラ画面の基本操作は↑↓がファイルポインタの移動、→がEnter,←がCancel
 に相当します。

un
↑画像はbmp形式が表示可能で128x160pixelまでの物が使用できます。それより小さいサ
 イズは、真ん中合わせで表示されます。画像はひねもすのたり氏画の私(ねむいさん)。
 …びいぶろ君が欲情すると困るからピンボケ!

un
↑…すみません…お口直しに癒し系小動物を。otter-beerは結構有名らしいです。

un
↑動画はimg形式。img形式のファイルは同梱のChan氏謹製の付属ツールでaviから生成
 できます。再生中→キーで一時停止、その後↑↓キーでコマ送り、戻しができます。
 上の画像のは虹裏で活動している名無しの絵師さんの動画をお借りしました。

20091126追加
un
↑USBマスストレージモードに入るためにはUSBケーブルをSTM32Primer2の
 "STM32"側のコネクタに挿し、ファイラのルートディレクトリでLeftキーを押します。
 LCDの画面が暗転し、PCにディスクドライブがマウントされたら成功です。

20091126追加
un
↑MSCモードからファイラに戻るためにはLeftキーをもう一度押します。ディスクドライブが
  アンマウントされ、ファイラの画面に戻ります。、


un
un
↑UART2からの通信にも対応。上記結線(TTLレベル)でホストPCと接続。

un
↑ホストPCのターミナル(230400bps,8,N,1)上からESCキーを押すことで、ファイラは
終了し、FatFsのUART上のモニタプログラムが走ります。

un
↑現状では時刻設定はUART上のモニタプログラムからのみ可能です。

un
↑電源OFFは"真ん中"のキ―長押しで行います。この画面が出てからキーを放すと
 FETスイッチが切れ"電源OFF"となります。

と、こんな感じです。ミニフォトフレームに機能を絞っているので以下に挙げる機
能は基板上には存在しますが使用していません。後は各人がソース変えてお好みで
付け足してくださいね(ひでぇ)。
*Not Used Devices
-Touch Sensor
-3D MEMS Sensor
-I2S Peripheral
-IrDA

また将来搭載予定の機能は以下に。
*Future Features
-USB-MSC 実装済
-LCD-Backlight Adjustment
-Adjustment Configuration which does not rely on host PC.
-Improve Backup Register Function.
-Improve Power Management 実装済
最優先はUSB-MSC。SDカードの抜き差しは面倒ですもんね。
USB-MSC実装しました。
IJG JPEG Library を実装しました!

んでもって修正すべき項目は以下に。
*Known Issues
-Cannot execute program if there's no Li-Ion Battery jumper. Fixed.
-Cannot execute backup function. Fixed.
現状Li-Ion電池のジャンパしてないとNo Batteryと判断されてしまいすぐに強制shutdown
されてしまいます。電源電圧の上手い監視方法見つけたらこちらはすぐに修正します。
修正済


ということでまだまだ手を加えるべき点はありますが、興味を持たれた人は試して
みてくださいね。ご利用は自己責任で〜

un

STM32 Primer2をBARE-METALで使ってみる5 -FatFsの実装-

もともとBARE-METALで取り組むのを決めたいきさつは、Chan氏のLPC2388向けのOLED
表示プログラムを"STM32で再現できたら素敵じゃないか"って構想から始まって少しずつ
実現して来たわけですが,STM32Primer2でも再現してみたい!という思惑からはじまっ
てます…。

今回その要であるFatFsの実装にとり掛りました。STM32F107VCT6ではSDカードのアクセス
にSPIを使用していましたが、STM32Primer2(STM32F103VET6)ではSDIOインターフェース
が搭載されているのでこちらを使います。またSDIOのドライバはSTマイクロさん本家から
MassStorageClassのデモの形で提供されているのでRowleyのサイトにある移植例を手本
に"ゲタ"合わせを行いました。(ベースはSTM32F107VCT6のFatFs)

LCDの時よりかは手こずらずに移植は完了しました。が、いくつか引っかかる点が…

ヽ笋蟾み版のUART-Txを使うとxprintf関数を実行したときうまく表示できない
 いろいろやってみましたが文字の送信がうまくいかなかったので折角割り込み版をこさ
 えたのにポーリング版に戻したorz(Rxは割り込みでも問題なし)
私の経験と知識の無さはこういう形で表れてくるorz

20100317:FIFOバッファの処理が不完全なだけでしたorz

RTCの初期化がうまくいかない
 STM32Primer2は電力消費を抑えるためにVbat周辺の回路も同じく低消費電力化されて
 います。以前の回路ではうまくいってたバックアップ方法は今回は動きませんでした。
 具体的に言うとバックアップレジスタにマジックナンバを書いておいてその有無でバッ
 クアップされているか判定していたのですが、STM32Primer2の回路だとそこが正しく
 読めない…仕方ないのでマジックナンバが書かれているかの判定部分は削除しておく
 と時刻情報はかろうじて保持されているのでひとまずこれで進めることに…

開発が落ち着いたらバグ出しついでに上記2点の問題おっかけます。特に大きな支障は
ないので今は対策を保留…。

20100317:RTCの初期化に問題があってバックアップレジスタへの書き込みを
      禁じた状態で書こうとしてましたorz



とりあえずFatFsが動いたので読み込み転送速度の比較を行ってみました。使用したSDカー
ドはATP製の4GBSDHCカード。Class6のものです。比較検証用のファイルはL氏のwebラジオ、
"Lの虹裏ピアノラジオ"を録音したmp3ファイル(132MByte)を使用しました。

un
↑まずSTM32F107VCT6の(SPI,18MHz,DMA使用)で…まずまずです。

un
↑次に今回STM32 Primer2に実装したの(SDIO,4bitmode,24MHz,DMA使用)…あれれ、思った
ほど伸びませんでしたね…。
今すぐ下の方見ろ!!!11!

un
↑最後にChan氏のLPC2388用MCIアクセスプログラム(MCI,4bitmode,18MHz,DMA使用)。
ううむ…ぶっちぎりですなぁ…。

STM32のSDIOはもっと伸びるとおもうんですけどどっかでフン詰まりになっているようで
すね・・・まぁ現状でも十分すぎるのでこちらの件は以後の改善課題としておきます。


20110201追:
アシッド氏のブログの"シングルセクタ転送->マルチセクタ転送"の部分を見てねむい
さん気づいた!
私のも川内氏のもFatFsはRowleyのSDIO実装例を源流にしているはずだから、
FatFsのR/Wの部分ってシングルセクタ転送でしか実装してnほらやっぱり!!


〜小一時間後〜

un

やばい超早い♥


20111111追:
時は流れ、STM32F4では48MHzのSDIOクロックでも安定して動かせられる
ようになったので、約21Mbyte/Secの読み出し速度を常にたたき出してます!


次回は今まで検証してきた成果をすべて組み合わせ、BARE-METALなプロジェクトの到達
目標としていたPrimer2用フォトフレームの制作に挑みます。

よりみち

開発上でいくつか大きな変更があったので、ちょっと寄り道させてもらいます。

先日、STマイクロより待望のUSBライブラリの新版がリリースされました。しかし…
残念ながらUSB-HOST/OTGのサンプルはないっぽいorz。しばらく海外のForumを旅して
きますか…。

既存のプログラムの動作の確認は、先にリリースされていたRC版で予習済なので今回
のライブラリをフォルダごとごっそり差し替えるだけで終わっています。もちろん動作も確認済。

そして先に告知していましたがSTM32F103のMiddleDensity系は今回の更新でクローズ、
あとSTM32F107VBTの方はSTM32F107VCT6と統合するので削除とします。これから先は
STM32F107VCT6とSTM32Primer2(STM32F103VET6)を中心に開発を進めていくつもりです。
また、おきばの方も近々リニューアルする予定です。

それともう一点、いつもARMマイコンのビルドに使っているCodeSourcery G++がバージ
ョンアップしてGCCが4.4.1に変わっていました。以前3系->4系に変わったときに最適化の
され過ぎでビルドが通っても思ったよう動かない等の問題があったので試しにいくつか
のプログラムをビルドして動かしてみると案の定変な動作するものが出てきました。

具合的に言うとLPC2388のプログラムでswitch文を含むコードを最適化して実行すると
暴走する箇所があり、原因を調べるとリンカスクリプト内のアラインメントの設定でした。
これは元々AT91R40708でRAMスタートするときに行っていた処置で,.text内の記述で
. = ALIGN(4);であるところを
. = ALIGN(8);としていました。
それを他にもツブシがきくようにと別のARMマイコンのリンカスクリプトにも移植してその
時の環境では動作に問題なかったため放置していましたがこれがあだになってしま
っていたようです。そして". = ALIGN(4);"に直して無事正常動作を確認しました。

ビルド環境がバージョンアップしたり変わったりするとよくこういうことになりが
ちですが,こまめに直していかないといけないですね…。

STM32 Primer2をBARE-METALで使ってみる4 -FSMCとLCD-

もうすっかり使いこなせて当然…なはずのカラーグラフィックLCDのつもりでしたが結構
苦戦しました…。STM32Primer2ではLCDの結線はSTM32のFSMCを使用したバス接続
となっていて、CircleOSもこれを利用してLCDの操作を行っています。LCDモジュールの
コントローラICはST7732。以前のTFTモジュールやi2c液晶なんかとおなじメーカの奴です。

ST7735の時と同じ風にやったら楽勝だろうと考えていたらモジュール内部で完結して
いるICのモード設定ピンの関係に気づくまでどうしても表示がうまくいかなくてうnうn唸って
いました。コントローラICが同じもしくは同等品であってもモジュール全体でみると初期化・
制御の仕方とか微妙に違うってことを思い知りました(いまさらか)。

上記のことさえ注意しておけば後は特に気にすることなくすんなりと一枚絵の表示まで
こぎつけました。128x160フルに使って表示できます。

※性的描写があるので小さく表示
un
↑ごめん…またいなちゃんなんだ…もう許してもらおうとも思ってはいない
 …でもやめられない♥

今回はWindowsで普通に作成できる24bitのビットマップをそのままC言語ヘッダファイル
に変換して直接読み込んでいます(内部で16bitに変換してます)。FatFsが次に控えて
いるのでそれを意識しています。

後気づいたことを一つ…
CircleOSのフォーラム見ていると拡張コネクタから出ているi2cやcanがFSMCからの干渉
でうまく動かないなどのことが議論されています。回路図見た感じではFSMCのバスは外
には手軽に出せないし現状LCD専用状態だしで、あんましFSMC使うメリットが見当たら
ないように気がしますが私の検証用のプログラムはCircleOSのを真似てFSMC使っています。


un

STM32Primer2をBARE-METALで使ってみる3 -ADCによる電源監視とUART2-

前回はSystickタイマを利用したスイッチ入力で電源の制御を行いました。しかし
電源を付けっぱなしにしているとどんどん電力が消費され、ついには3.5Vを切って
しまいます。(リチウムイオン電池の詳細な特性については他の専門に解説されて
いる方たちにうっちゃる(うn?)として、)実際3.5V以下になると急速に電圧が低
下していってしまうという特性があるので3.5Vできっちり止めなければなりません。

STM32Primer2はリチウムイオン電池の電圧低下をハードウエアで監視する機構がな
いのでSTM32に内蔵されたADCを利用してソフト的に監視し、3.5V以下になったら強
制的にシャットダウンする必要があります。今回はCircleOSのDMAを利用したADCと
過去の自分のコードを利用して電源監視ルーチンを作りました。

電源監視ルーチンはCircleOSで行っている方法とほぼ一緒で、1Secごとに移動平均
化されたVbatの値が3500(3500mV)になりさらにそれが15秒間連続した時にSHUTDOUN
信号を出してFETスイッチをOFFにするというものです。

そしてこの機構が実際に機能しているかどうかを確認するためにモニタリングする
必要がありますが、この検証には背面の拡張コネクタから出ているUART2を利用し
ました。このUART2のルーチンも自分の過去の(ry)でprintfにリダイレクトさせるよ
うにしています。

以前107系等で組んでいた時はUART-Txだけは割り込みを使用せず、ポーリングで回し
ていました。今回UART-Txも割り込み方式に変えています。それで初めて気づいた
のですがprintf等使用時に高速にバッファに転写すると早すぎて割り込み処理が
間に合わず、文字列が反転した状態で出てきてしまいましたので少し細工を行い安
定して文字列を送信できるようにしました。

un
↑大活躍の極小USB-Serial変換(画像右上)。

以上の条件下(72MHz駆動,LCDバックライトは未制御のため全点灯)でUART2から文字
列を排出した状態で電源電圧低下を感知して自動で切れるまでモニタリングを行い
ました

un
上図の結果のとおり、満充電4.1Vから徐々に電圧が落ちて行って3.5Vに差し掛かっ
たところでFETスイッチが切れています。また3.6V付近から電圧の落ち込みが急速に
早くなっているのが分かりますね。自働強制シャットダウンまで約4時間まるまる
かかりましたがCPUは最高速度,LCDのバックライトも未制御の最大輝度ですのかな
り電流喰っている状態です。この二つを制御できたらさらに持つでしょうね。

次回はFSMCを使ったLCDの制御に入ります。
FSMCは全く使用したことがないので少々手こずりそうです。

STM32Primer2をBARE-METALで使ってみる2 -Systickタイマと電源制御-

前回は一番基本的なLEDの点滅を行いました。点滅だけなので、STM32 Primer2のバッ
テリーの制御(電源OFF)ができません。これから先いちいちUSBケーブルを抜き差し
するのは不便なので今回は電源制御を行います。


電源の制御にあたって、STM32(というかCortex-M3)に搭載されているSystickタイマ
を利用し、定期的にSWポートをスキャンしてある条件を満たしていれば電源をOFFに
することにします。これはCircleOSと同じ仕様ですね。

具体的には1mSecごとにCenterキー(PA8)を走査して5000mSecの間連続してHiレベルに
あったときにSHUTDOWN(PC13)をHiレベルにしてFETスイッチをOFFにします。4入力キ
ーの定義も行っていますが、今回は使うのはまだCENTERキーだけです。

un
↑4+1キー入力と電源制御(SHUTDOWN)周辺

またRLINKのフラッシュの方法も少し工夫しました。RFlasher7でちんたらやってた
ら非常に煩わしいので、OpenOCDを使ってた時よろしくmake programでコマンドラ
インのフラッシュライタを呼び出し、バッチ処理しています。これでOpenOCD使って
た頃とまったく変わらない操作性になりました。やっぱこっちのスタイルの方がい
いですね〜♥もちろんRLINKのデバイスドライバはWinUSBの方で!

un
↑OpenOCDのフラッシュプログラムの処理をRLINKに置き換える


土台が整ったので、ここから先は駆け足になると思います。同じ事やってても何も
身につかないのは自覚してるので浅く広く早くでやっていくつもりです。
一応ねむいさんの基本スタンスは…
●無償で公開されてるライブラリ・プログラムは極力有り難く利用させてもらう。
●↑のことした場合は"ネットで見つけた"とか書かずに公開元のルールのもと引
 用先をブログやソース内で明示させてもらう。
●使わせてもらう前にざっとでいいからコードを眺めて流れを把握する。
●ここは自分でやらないとだめだ!って部分は自分で調べてフルスクラッチで書く。
●真似てやって壊れても潰れても燃えても泣かない(これ重要)。一度壊したけど。
●他の方がされていることに過度に干渉しない(これ重要)
この辺虹裏内での立ち回りと全く同じなわけですが、気をつけます。

STM32Primer2をBARE-METALで使ってみる1

BARE-METALとか横文字でかっこつけてみたけれどつまりCircleOS(とそのAPI)使わないで
やってみるというわけです。STM32F103VET6(を使ったSTM32Primer2のハードウエア)
に合わせたフレームワーク作りをやって行きます。

今までSTM32F103VBT6(CQ-STARM),STM32F107VCT6とやって来てリンカスクリプトや
スタートアップの組み方は熟知してますので定義だけ変えてあげれば終わりです。
STM32F107VCT6をベースにしてPrimer2上の2つのLEDを交互に点滅するプログラムを
こしらえるのが今回の最初の目標です。(FWライブラリは勿論V3.1.2の最新で)

STマイクロさんが用意してくれているCソースのシステムクロック用の設定は、デフォルトが
103,101系は8MHz,107系は25MHzの外部クロックを想定しています。STM32Primer2は
12MHzのクリスタルを使用するため、system_stm32f10x.cにあるクロックPLLを設定する
関数内で一部定義を書き換える必要があります。提供されたライブラリにはなる
べく触りたくなかったので、コピーしたファイルをリネームしてmain.cと同じ場所に置きました。
un
↑赤で囲った部分がPLLの定義を書き換えたところ

さらに、使用している外部クロックを決める定義(HSE_Value)はmakefile内で行っています。

プログラムの書き込みは先日無理やり適用したWinUSBのドライバで安定して動くよ
うになったRlink(ビルドイン)を使い、RFlasher7で書き込みます。

un
まだ電源制御は乗っけていませんのでtodotani氏のブログ内の記述にある
とおり電源のONは出来てもOFFはできません。電源切る時はリチウムイオン電池の
ジャンパとPCにつなげてるUSBケーブル引っこ抜いて切る必要があります。

次回はこの電源制御を中心としてsystickタイマ・キー入力の実装を行うつもりです。

ペ プ シ あ ず き

un
…うおえっぷ。子供向けのシロップ状の薬思い出してしまった…。

そしてそんなことやってる間にも私の周りの世界はどんどん回っていく。LPC2388のコ
ンテスト受賞者が発表されていますね〜。私がFreeRTOSを知り、使うきっかけとなっ
た今井健太郎氏やUSBデバイスの開発で詰まったときに参考にさせてもらっているマイ
コン工作実験日記氏の作品が入賞されています。

私はチェンジニアリング(=他人の成果物使って切った張った)しかできないから一つの
プロジェクトを決められた時間でフルスクラッチでバシッと組めるってのは尊敬して
しまいます。この業界に転職して早一年と少し、なんとかしがみ付いてきたけどこの先
数年もしないうちにまた違う職種に移ってるんだろうけども何かひとつくらいはでっか
いの残していきたいな〜なんて妄想してます(げんぢつから目をそらしながら)。


久しぶりの日記がここで終わってしまうと歯切れが悪いのでもうちょっと書いてみます。

●STM32 Primer2
以前から少しずつSTM32F107系の記事書いてきましたが、そちらと並行してSTM32Primer2
をCircleOS無しで動かす構想を考えています。目標は…FreeRTOSを乗せて動かす!

…と書いてしまいましたが実際ことに移すとコレ結構厄介です。まずは開発環境が…。
STM32Primer2にはビルドインされたRLINKがあるのですがこれがSWD接続の為にOpen
OCDから直接操作ができません(20091104現在)。
そしてRLINKのデバイスドライバ(Windriver)が未だにバージョンが低いものを要求し
ているため、AVRJTAGICEmk2等で使用されている最新のVerのものを使用することがで
きません!無理やり使うと確実にB.S.O.D.になってしまいますorz(XP環境の話です)

実はねむいさんがSTM32Primerを使用することに消極的だったのはこのドライバの問題
なわけで、よくよく調べてみるとWindowsVISTA以降のOSはマイクロソフト純正の汎用
USBドライバであるWinUSBなる物が提供されていてVISTA以降のOSではRLINKのドライバ
としてこちらが適用されているようです。ねむいさんはこのWinUSBってやつを無理やり
XPにも適用して難を逃れました!!
(セコいな)
FreeRTOSを乗せる過程は一気にはできないので次回以降でぼちぼちとやっていきます。

●aitendoさんのTFTモジュール
たくさん売れたおかげで専用の拡張ボードまで起こしてもらって再販になっています
(20091104現在)。一枚絵の表示くらいならAVRでも十分にできるのでひとつくらいは持
ってても良いかと思います。私もLPC2388,STM32F107で表示させてきましたがそら氏と
同じく青みがかかった画面を何とかしようといろいろあがいてみました。しかし結局
大きな改善はできませんでしたがVMCTR1(VCOM control1)というレジスタの値を変え
るとコントラストは変えることができたので少しいじって濃いめに出すようにしました。

un
↑こんな感じで。少しは見栄えが良くなった!?

STM32F107VCT6のプログラムはUSBライブラリのリリース待ちの関係で公開を保留して
ましたけど一項に出る気配がないのでW.I.P.ですが置いておきます。
FatFsは先日R0.07eがリリースされていましたのでこちらも適用してあります。

LPC2388の方もSTM32とおなじ修正を施しておきました。以前はUART版とVCOM版は
分けていましたが今回からmakefile内で切り替えられるようにして一本化を行いました。
こうしておくと管理楽ですからね〜。ついでにchan氏のmp3プレーヤーで使用している
mp3モジュールを使用したスイッチ入力にも対応しています。詳細は同梱のdocフォルダを。

●OLIMEXのAT91SAM7S256プロトタイプボード
ず〜〜〜っと前からやるやる詐欺してましたがこちらも腐らせるにはもったいなさす
ぎるので手をかけることに決めました。こちらの目標はいくつか買い込んであった
TFTモジュールを使用したUSB接続のミニフォトフレームの製作をしてみようと思います。
un
↑やるやる詐欺

Go to top of page