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

Comments

毎度、勉強させていただいてます。
早速手元の環境で追試してみたところ、CodeSourcery の Sourcery G++ Lite 2009q3-68 4.4.1 だと OK でしたが、CD_STM32-Primer_BN28 に含まれている Sourcery G++ Lite 2008q3-66 4.3.2 だとリンク時にエラーがでます。

src/stm32f10x_it.o: In function `SysTick_Handler':
C:¥ARM¥STM32F103VET6_Primer2_FatFs_20091121/src/stm32f10x_it.c:158: relocation truncated to fit: R_ARM_THM_CALL against symbol `ff_test_term_timerproc' defined in .ramfunc section in src/ff_test_term.o
collect2: ld returned 1 exit status

long call 関係の制限でしょうかね。

こんばんは、ねむいです。

masatoさんのご指摘の通り、BN28とRaisonance提供の最新のBN_55
(=arm-none-eabi-gcc (Sourcery G++ Lite 2008q3-66) 4.3.2)でもビルドエラー
が出るのを確認しました

調べると、ff_test_term_timerproc();がRAM領域での実行になっているのに
対し、それを呼び出してるSysTickHandler();はFlash領域に有りました。
bl命令はthumb2だと±16MBの範囲までなのでSTM32のメモリ構成だと範囲を
オーバーしてしまってリンカエラーが出てしまいますね。

一方CodeSourcery(arm-none-eabi-gcc (Sourcery G++ Lite 2009q3-68) 4.4.1)
でビルドすると上記の分岐範囲外の処理に当ったときに、分岐先を拡張する
ためのveneer(=小さなコードセクション)をリンカが生成することによりエラー
を回避しているのが分かりました。私はCodeSourceryだけでビルドしてたので
この問題に気付きませんでした。

実際の対処としてはすべての関数をFlash領域で実行することで回避できます。
ff_test_term_timerproc();をRAM領域ではなくFlash領域で実行するように
修正して差し替えておきましたので試してみてください。

判っていないワタシのために解説ありがとうございます。
なるほど、gcc 4.4.1 のリンカはお節介なくらいに親切なんですね。

少し改良をして、USBマスストレージの機能を結合させました。
これでSDカードをいちいち外さなくてもPrimer2単体だけで読み書き
できるようになります。

ねむい様
韓国のチャンと申します。
毎度、講座ありがとうございます。
最近ねむい様のブログで多くのを学んでます。

このテーマで問題が発生しましたが、解決が難しくてコメントを書きます。すみません。
STM32F103VET6_Primer2_FatFs_20100110.zipのファイルをダウンロードしてmain.elfファイルをRFlasher7プログラム(RLink使用)を利用してstm32-primer2ボードに搭載しました。
USARTのserial pin連結は上の絵どおりしてPCにELECOM USB PCtoSerialCableで連結しました。
でもターミナルで文字化けが発生しました。

ASCII value
-----------------------------------------------
<0>yスU:ハ*ェ!ソYWe剱s據儡uW徳5ソ!1=%ソスス褄{-'7ソw=5ソ響k=#ソ據ソ屐據褄褄<0>ョ]3-'5ソ
5%ソ%!#57ソ!)」褄褄ォォォォソo-ソuYyソW!ソw-5ソ5ソ%!#-!ソォォォォ褄<0>
-----------------------------------------------
Hex value
00
79
BD
55
3A


ターミナルプログラム(Terminal 1.9b 20080315)
Baudrate 230400
RxClear 11
Receive counter 10
等、全ての設定をねむい様の設定に合わせて実施しました。
すみませんが、何が問題だと思いますか?
ご答え待っています。
どうぞよろしくお願いいたします。

チャン様
はじめまして、ねむいと言います。


STM32 Primer2の外部(JP2)に出ているUSART2を含めた信号の電圧レベルは
2.8VのTTLとなっているため、通信するためにはお使いの
「ELECOM USB PCtoSerialCable」の電圧レベルをレベルコンバータICなどを
用いてTTLレベルへと変換する必要があります。

しかし230400bpsの通信レートを保証するレベルコンバータICの入手は限られ
ているため、元からTTL出力になっている市販のUSB-シリアル変換モジュールを
購入し使用するほうが簡単で確実です。
http://www.sparkfun.com/commerce/product_info.php?products_id=9115

ねむい様

ご返事本当にありがとうございます。
おかげさまで解決いたしました!!
やっばり変換モジュール問題だったですね
http://akizukidenshi.com/catalog/g/gK-01977/
これを買ってして見たらできました。

本当にありがとうございました!!

  • チャン
  • 2010/01/21 12:59 PM

お久しぶりです。

DSO nanoを買って、STM32デビューしました。

オシロとしてだけ使うにはもったいないので、色々とソフトをいじっています。

そんな中、DSO nanoにFatFsを乗せるときにこちらのソースコードを参考にさせて頂きました。

DMAでの転送にも成功しましたが、DSO nanoのSDカードに繋がっているSPIはAPB1バスのチャネル2だったので、チャネル1ほどのスピードは出ませんでした。

ひとまず、EGO028Q02のときにATmega64Lで作ったBMPの画像ビューワーを移植してみました。

DSO nanoのLCDコントローラーがEGO028Q02と互換だったので移植は楽でした。

おかげさまで参考になりました。

ありがとうございます。

ねむいです。こんにちは。


そらさんもSTM32を始められたのですね〜
いちど魅力を知ってしまうともう8bitに戻れなくなる
とおもいます。

DSOnanoはソースが公開されてるのでCQ誌のSTM32の
基板に移植を考えていましたが、現在私のケツに火が
ついてる状態なので遊びは当分お預けですorz

Post a Comment








Go to top of page