マイコン工作実験日記

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

ニコモジで表示してみる

2017-12-20 12:14:34 | LCD
emWinを使うことの利点のひとつが、日本語を比較的簡単に表示できることです。本記事では、その手順について説明していきます。






まずはフォントの準備です。emWinではFont Converterというツールが用意されており、Windowsにインストールするされているフォントをビットマップフォントに変換して使用することができるようになっています。MS明朝のような書体も利用可能なわけですが、ライセンスの問題もありますので、ここではフリーのフォントを使うことにしましょう。今回、ピックアップしたのはニコモジ・プラスRounded M+のふたつのフォントです。これらのサイトから使用したいフォントのデータをダウンロードしておきます。



ダウンロードしたフォントファイルをエクスプローラから開いてみると、上図のように文字サンプルが表示されるとともにインストールボタンが表示されますので、このインストールをクリック。すると、フォントがシステムにインストールされます。

続いて、Font Convererを起動。生成するフォントのタイプを聞かれるので、深さ4ビットのアンチエイリアスを選んでみます。



次に開くフォントを聞かれますので、先ほどインストールしたばかりのニコモジ・プラスを選んで、出力するビットマップのサイズを指定しておきます。





フォントを開いて、全てのグリフ情報を読み込むと上図のように表示されます。特に編集の必要もないので、Fileメニューから"Save as"を選択して保存作業を開始します。



ファイル形式として .sif を選択して保存。変換しながらの保存作業となるので、完了までにしばらく時間がかかります。同様にしてRounded M+も変換します。結果として、ニコモジでおよそ3.2Mバイト、Rounded M+でおよそ1Mバイト弱の .sif ファイルができました。.sif (System Independent Font)は SEGGER独自のファイル形式のようです。


フォントデータができたので、これをSPIフラッシュに dfu-util を使って書き込みます。(DFUの準備についてはこちらの記事を参照してください)。ニコモジはフラッシュ領域の先頭である0x90000000から書き込み、Rounded M+は4MB離れた0x90400000から書き込むことにします。DFUの構成上ではフラッシュの領域は論理的にひとつの空間として扱っているのですが、アドレス指定という手段で領域の途中からアクセスできるというのは、こういう時には便利ですね。もちろん、アドレス境界はフラッシュへの書き込み/消去単位であるページなりセクターサイズに合わせておきます。



これで、ふたつのフォントデータがSPIフラッシュ上に書き込めましたので、あとはSPIフラッシュをメモリ空間にマップしてやれば、そのままフォントデータが参照可能となります。

emWinにはUTF8でエンコードされた文字列を表示する機能が備わっているので、SPIフラッシュ上のフォントを開いて、そのフォントを使って表示してやれば、冒頭の写真の表示を出すことができます。詳細説明は省略しますが、こんな感じになります。



これまでは日本語フォントを使って表示をするためには、
  1. FreeTypeを使って自分でビットマップへのコンバータを作成
  2. そのコンバータを使ってTTFを変換して、ビットマップ形式のフォントファイルを作成
  3. 出来上がったファイルをSDカードなり、Flashメモリに書き込み
  4. FatFsを使ってフォントファイルを開く。
  5. FatFsを使って、必要なグリフのビットマップを取り出し、描画
というように、ツールの準備から描画ルーチンまで全て自分で用意していました。それがemWinとQuad SPIを使えば、上述のように提供されるツールとAPIを使うことで短時間で描画できてしまいます。これでFont ConverterがMac OSで動いてくれたら文句ないんですが。。

Atollic

2017-12-14 13:09:05 | Weblog
STのホームページで、STがAtollicを買収というニュースリリースを見つけました。自社製品のIDE環境整備を強化すると共に、他社の開発環境に打撃を与えることを目的としているんでしょうか?NXPもCodeRedを買収したりしてましたね。

そいういえば, 以前Freescale向けにKDS(Kinetis Design Studio)の開発に携わっていたSOMNINUMは、事業継続が困難になりSEGGERに資産売却したようです。

もともと STM32CubeはEclipseのプラグインとしても用意されていましたから、今後はTrueSTUDIOとの統合化が進んだりするんでしょうか?わたくしとしては、今のところTrueSTUDIOがMac対応していないので、今後のMac環境サポートがどうなるかがちょっと心配ではあります。

12/14追記
STのブログ記事によると、これまでのTrueSTUDIO Proが無料で提供されるようです。ワォ!! Mac OSもサポートしてくれ〜。

emWin(STemWin)を動かす -- 補足

2017-12-06 22:43:09 | Weblog
前記事で書き忘れたことがあったので、追加でメモしておきます。

STM32Cubeに含まれているemWin(STemWin)を動かす上で、忘れてはならない設定がひとつありました。それは、 ペリフェラルのCRCをイネーブルしておくことです。CRCをイネーブルしておかないと、STemWinの初期化段階で動作が止まってしまいます。調べてみると、 CRCのクロックがイネーブルされていないと、永久ループするコードになっているようです。このチェックを入れることで、STemWinのライブラリが STM32でしか動作しないように制限をかけているようです。

LCDConf.c ではGUIDRV_FlexColor_SetFunc()を使って使用するLCDコントローラの種類を指定しています。GUIDRV_FLEXCOLOR_F66709の指定では、ILI9341だけでなく ILI9488や HX8353, ST7637などのコントローラもカバーしています。最初は、複数種類のLCDコントローラを識別して動作しているのかと想像したのですが、実際の動きを確認してみると全然そんなことはしていませんでした。これらのコントローラはメーカが違ってもコマンド体系がほぼ同じなので、同じグループとしてまとめて扱っているようです。



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を動かして表示することができるがわかりました。まだタッチパネルの対応とかはやっていないませんが、そのうちに調べて対応するつもりです。