チカラの技術

電子工作やプログラミング

機能解説プログラム編①

秋月300円液晶の駆動方法については先人の方々が十分解説されているので
そちらを見てもらうとして、ここではSTBeeによる制御方法について説明したいと思います。
 
私は液晶を制御するに当たり2段階の目標があります。
 
マイコンのCPUにて図形を描画する。
②記録メディアから動画データを読出し再生する。(目標は60fps)
 
現時点では①までしか達成していませんので、その解説になります。
 

②については現在SDIOやFatFsを使えるようになる為勉強中です。
ただ、ついさっき別の液晶のデータシートを読んで気づいたのですが、
液晶の応答速度という観点から60fpsって意味無いかもと思いました。
(仮に応答速度30msecとすると34fps以上は色の変化が間に合わない?)
でも、SDIOの機能を試す意味でも60fpsにはこだわってみたいと思います。

 
①の達成方法ですが
まずメモリについて考えます。
 
図形を描画する為にメモリ領域を確保したいのですが
RとBから2bit分の色情報を差し引いても
1画面分のメモリ使用量は
400pixel×96pixel×16bit = 76.8kBになります。
STBeeのSRAMは64kBですので足りません。
 
そこでメモリの省スペース化を図ります。
A.画面サイズを1/4に縮小し、出力時に4倍する  :メモリ使用量1/4。(へっぽこ回路師さんの方法)
B.色情報を16bit→8bitにする。            :メモリ使用量1/2
 
今回はAの方法を採用させて頂きました。
 
実装方法としてメモリを2つの領域に分けました。
1.描画対象の1/4画面ワークメモリ
2.LCD出力用のバッファメモリ
 
処理の流れとしては
1画面描画→水平14lineずつバッファメモリへ転送→バッファメモリからLCDへクロックと同期してDMA出力
となります。 
 
データの転送の様子を図にしてみました。
 
イメージ 1
特徴としてはリングバッファを使用している事でしょうか。
転送の流れとしては
①DMAがピンクの位置から緑の位置まで14line分LCDに出力した時点で
  ワークメモリからバッファメモリに書き込むように割り込みが入ります。
②割り込み処理でバッファメモリのピンク位置からワークメモリの内容が4倍にされて書き込まれていきます。
③書き込まれている間バッファメモリの緑位置からピンク位置に向けてDMAがLCDへ出力していきます。
①~③をグルグルと7回繰り返せば1画面分をLCDに表示できます。
(ブランキング期間中は書き込みのみ停止します)
 
1画面分表示したらワークメモリに新しい図形を描画するように割り込みでフラグを立てます。
以後繰り返し・・・・
 
DMAはCPUに負荷を掛けない為、非常に便利です。
CPUはワークメモリ→バッファメモリの割込み処理の合間にワークメモリに図形描画を行います。
 
当然ですがワークメモリ→バッファメモリはDMAが14line転送するよりも早く行わなければならず、
ワークメモリへの図形描画はDMAが1画面分転送するよりも早く行わなければなりません。
 
ちなみに
ワークメモリ→バッファメモリ14lineの書き込みは0.65msec
図形の描画は種類にもよりますが1画面分2~5msecで終わります。
(ワークメモリ→バッファメモリの割込み時間含む)
 
DMAが14line転送するまで約2msecですので十分間に合います。
 
なおワークメモリ→バッファメモリの処理は高速化の為にfor文を極力減らす工夫をしています。
おかげでその処理のコードの行数が17行から2000行以上に増えましたがSTBeeのROMは
512kBも有るのでまったく問題有りません。(処理速度は2倍になりました。)
 
このリングバッファの構造は動画再生時にも応用できそうなのでワクワクしますね。