マイコン工作実験日記

Microcontroller を用いての工作、実験記録

emWin(STemWin)を動かす -- その3

2017-12-03 16:25:59 | Weblog
前回の記事から間が空いてしまいましたが、続きを書くことにします。

前回記事も書いたように、emWinをターゲットのハードウェアで表示できるようにする為には、Configディレクトリのファイルさえ変更してやれば対応することが可能です。ほとんどの場合には
  • GUIConf.c
  • LCDConf.c
のふたつのファイルを編集するだけで用が足りるでしょう。GUIConf.cにおいては、emWinに割り当てるメモリ量を指定しているだけですので、実際に作業が必要になるのはターゲットのLCDに合わせてLCDConf.cを書き換えるだけになるのですが、その作業もほとんどのLCDの場合とっても簡単です。

emWinでは多くのマイコンで使われているフレームバッファを用いたLCDインターフェースや、8/16ビットのバスインタフェースを介して接続するLCDコントローラ用のドライバがあらかじめライブラリとして提供されています。後者の場合には、広く普及している ILIxxxx, SDxxxx, STxxxx といったコントローラに対応したドライバが用意されています。今回、購入したLCDではコントローラとして ILI9341が使われていますので、これに対応する為の手順を以下に示します。

まず最初に、LCD_X_Config()において、使用するドライバの種類を選択します。

pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);

GUIDRV_FLEXCOLORがドライバの種類の指定になり、ILI9341もこのドライバでサポートされていることがマニュアルに明記されています。GUICC_565は1画素の深さがRGB565であることを指定します。このドライバの場合にはRGB565の16ビットとRGB666の18ビットがサポートされているようです。

次にドライバが実際にLCDのレジスタや画素データにアクセスする際に呼び出す関数を与えてやります。

PortAPI.pfWrite8_A0 = LcdWriteReg;
PortAPI.pfWrite8_A1 = LcdWriteData;
PortAPI.pfWriteM8_A1 = LcdWriteDataMultiple;
PortAPI.pfRead8_A1 = LCDReadData;
PortAPI.pfReadM8_A1 = LcdReadDataMultiple;
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709,
GUIDRV_FLEXCOLOR_M16C0B8);


ドライバは8ビットまたは16ビットのバスインタフェースを使用することを想定していますが、SPIでつなぐ場合も8ビットのインタフェースを用いて実装することができます。上記の例では LcdWritexxx, LcdReadxxx の5種類の関数が
実際にLCDへアクセスする関数であり、それらの関数へのポインタをGUIDRV_FlexColor_SetFunc()を使って渡していることになります。これら5種類の関数は使用するハードウェアに合わせて実装する必要があります。
pfWrite8_A0 がコマンドレジスタへの書き込みであり、pfWrite8_A1がパラメータやデータの書き込みに使う関数になります。具体的にはLCDコントローラのC/S信号の状態の違いに対応します。Mがついている関数は複数のデータのアクセスに用いられる関数であり、具体的にはLCDに表示される画素データの書き込みや、表示されている画素データの読み取りに使われます。

このようにドライバが対応しているLCDコントローラであれば、基本的には物理的なアクセスに使用する関数さえ用意してやるだけで、emWinが動くようになります。しかしながら、それぞれのパネルの初期化までemWinが面倒見てくれる訳ではありません。初期化手順はパネルのメーカが提供する情報に基づいて行う必要があります。LCDConf.cにおいては、LCD_X_DisplayDrover()の中で、LCD_X_INITCONTROLERコマンドにより、初期化を行うようになっていますので、この部分から初期化コードを呼び出してやればOKです。

このように、実際にやってみるとあっけないくらい簡単にemWinを動かして表示することができるがわかりました。まだタッチパネルの対応とかはやっていないませんが、そのうちに調べて対応するつもりです。