Aitendoの液晶YHY024006Aについに画像表示できました(^ω^)
以前AVRでMP3プレーヤ作ったときに自作のFATライブラリを実装してあったのでSTM32に移植。
一応FAT16と32に対応してます。


ファイルブラウザ(?)なるものを作りました。日本語LFN対応です。
ファイル名と種類、サイズを表示します。カーソルで選んで画像表示できます。
日本語フォントは東雲12ドット丸文字体を拝借させていただきました。
とんすけぶろぐ-日本語文字表示(小)
背景の画像はSTM32の内蔵フラッシュメモリに入れたものです。
ってよく考えたらわざわざSDカードからじゃなくても内蔵フラッシュから画像表示できてたんだ(汗
STBeeボードのマイコンは512KBもの広大なフラッシュメモリ空間があるの忘れてた。
16ビット色の320x240サイズの画像だと1枚につき150KBだから最高3枚入るねスゴイΣ(@.@

画像はBMPファイルをマイコンから素早く簡単に表示できるように細工しました。
GIMPで320x240 R5G6B5の16bitに変換しヘッダを削除して画像データをトップダウンに並べ替えてます。
とんすけぶろぐ-画像表示(小)
黒猫かわいいよクンカクンカ(*´д`*)
撮影ヘタなのでちょっと白飛びしちゃってます。ホントはもうちょっとイイ感じの色なんですけど。

自作fread関数実装しましたがショボショボで取得できるデータ長は一度に512バイトまででシングルブロックリードしか使ってないのでとても遅いです。
同一クラスタ内はセクタが連続してるのでマルチブロックリードにすればもう少し速くなるかな。

次はタッチパネル触ってみようかと思います。
日本語文字フォントを格納したり画像をLCDに表示したいのでSDカードからの読み取りを始めました。
STBeeボードのマイコン(STM32F103VET6)にはSDIOという機能が内蔵されており、これを使うことによってSDカードをネイティブモード(MMC互換モード?)で読み書きできます。
このSDIO機能はSDカードの他にMMCカードやSD I/Oというカードにも対応していてバス幅は1/4/8ビットに切り替えて使うことができ面倒なCRCの計算やチェックもやってくれます。
至れり尽くせりなSDIO機能を使わない手はないですね。

しかしSDカードをネイティブモードでアクセスする方法ってあまり情報が見当たらないんですよね><;
SPIモードについては豊富なんですが・・・。

ということでSDカードの資料やマイコンのリファレンスを読みあさりっては試行錯誤をしてなんとかカードを初期化してMBRを読むところまでできました。
とんすけぶろぐ

$とんすけぶろぐ-CLASS6 8GB SDHC
MBRと諸情報を取り出してUSARTから端末に表示させてみました。
SDIOのクロック周波数を12MHzにして4ビット幅で通信できました。
通信速度としてはこれで48Mbpsでてることになるのかな??めちゃ早い(^ω^)
これより速度あげるとFIFOがオーバーフローになりました。
次はFAT組み込んでいよいよ画像表示かな。

P.S.
SDIOのクロック周波数が24MHzでも取り込めました。(たぶんこれが最速?)
gccの最適化レベルを-Osから-O3にするとポーリングの際の実行速度が改善されたためかオーバーフローせずに取り込めました。
アセンブラを勉強しないといけないかと思いましたがなんとか済みそう(汗
前回からしばらく更新が滞ってました^^;
LCDに5x8ドットのASCII文字を表示させることができました。
以前AVRでLCDを弄ってたときのモノをそのまま使ってます。
次は日本語フォントやBMP画像の表示が目標です。
そのためにはやはりSDカードが扱えるようにならなくては。
とんすけぶろぐ
USARTから端末でレジスタの値や変数をみたいときにsprintfが使えるととても重宝します。
数値データをいろんな書式に整形して文字列に直してくれます。
ところがコンパイルしてみると、、
/usr/local/arm/arm-none-eabi/lib//libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
このように_sbrkが未解決ということでうまくいきません><;
この手のエラーは何がおかしいのかサッパリなのでググりましたがこれまたサッパリ\(^o^)/
_sbrkはlibc.aライブラリに含まれているということだけ分かりました。おかしいとすればこのライブラリなのかな?

試しにライブラリのネームリストを調べてみた
>arm-none-eabi-nm libc.a | grep " T " | grep sbrk
00000000 T _sbrk_r
00000000 T sbrk
ほんとだ_sbrkがない(^_^;A

P.S.2014.8.28
この記事書いてからかれこれ3年以上経ってますが最近になってlibnosys.aというライブラリに_sbrkの実体があることが分かりました。
ですので以下のようにNewlibの再コンパイルなどせずともリンカフラグに-lnosysを追加すればいいだけのことでした。めでたしめでたし? (^_^;A


ぐぐってみるとNewlibという組み込み向けのライブラリを知りました。

Newlib ウィキペディア
http://ja.wikipedia.org/wiki/Newlib

Newlib公式サイト(ソースのダウンロード先)
http://www.sourceware.org/newlib/

そっくりそのままNewlibに変えてしまえば動くのでは?

P.S.
Code Sourcery G++ Liteでは標準でNewlibライブラリを使ってますがなぜかlibc.aに_sbrkが存在しない。

さっそく公式サイトからソースをダウンロードしてコンパイルしてみました。

newlibディレクトリをつくってそこにソースをダウンロード。
>mkdir newlib
>cd newlib
>cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src co newlib

srcディレクトリが現れるので中に入る。
>cd src

次のようにアーギュメントを指定してコンフィギュア
>./configure --target=arm-none-eabi --prefix=/usr/local/arm --enable-multilib --enable-interworks

そしてmake
>make

P.S.
crt0.oが無い云々のエラーが出た場合:armv6-mというライブラリを構築中に発生するエラーのようです。
これを回避する方法が書かれてあるブログがありました。
http://morizzos-buglife.blogspot.com/2011/08/newlib.html


最後に--prefixで指定した場所にインストールして完了。
>make install


Newlibのlibc.aライブラリのネームリストを表示してみる。
>arm-none-eabi-nm /usr/local/arm/arm-none-eabi/lib/thumb2/libc.a | grep " T " | grep sbrk
00000000 T _sbrk_r
000002cc T _sbrk
00000000 T sbrk
おー今度はちゃんと_sbrkがある!

コンパイルしてみると無事sprintfが使えるようになりました(^ω^)
これで快適なデバッグ環境が整いました。

めでたしめでたし。
1年くらい前にAitendoで購入したYHY024006Aというタッチパネル付きのQVGA2.4インチ液晶です。
結構大きめの液晶なので夢が広がります。

液晶モジュールとの接続ですがデータバス信号はPORTE全てに割り当ててそのまま16ビット幅で配線してます。
コントロール信号はPORTDに割り振ってます。
サンプルコードは8ビットモード用でしたがほんのわずか手直ししただけで動きました。(2フェーズの転送を1回に変更しただけ。)
いつもこの手の液晶表示器は最初の初期化でつまづくパターンが多かったのですが拍子抜けするくらい簡単に表示させることができました(^ω^)

バックライト用のダイオードの保護抵抗には1/6Wの10Ω抵抗を2つ直列にしたものをつないでいます。
電流を測ってみたところ約20mA流れていました。10Ωだとかなり明るく約32mA流れてました。
とんすけぶろぐ-YHY024006A
↑1本づつ周期が短くなっていく正弦波を描画してみました。

sin関数を使ったのでmath.hをインクルードしましたが未定義エラーでコンパイラに怒られました。
リンカのフラグにライブラリ名と場所を直接指定するとコンパイルできました。
gccライブラリも要るみたいです。
MATH_LIB = -lm -L/usr/local/arm/arm-none-eabi/lib/thumb2
GCC_LIB = -lgcc -L/usr/local/arm/lib/gcc/arm-none-eabi/4.4.1/thumb2

無事テストが済んだので次はフォント表示やってみますb