グラフィックLCDライブラリ/STM32F4用

 小型カラーグラフィックLCDモジュールを、STM32F4で制御するためのソフトウエアサブルーチンライブラリです。キャラクタディスプレイのように、printf()関数で簡単に文字表示も出来ます。タッチスクリーンもサポート、簡単なGUIを使えます。

仕様

ハードウェア

CPUボード

 STマイクロエレクトロニクスのSTM32F4シリーズのマイクロコントローラを使用する評価ボードや開発ボードの全てに対応しています。正確には、STM32CubeIDEのCubeMXでサポートしているボードとなります。多くはST-LINKを内包しているので追加装備なしに、開発PCに直結できます。このライブラリを開発する時に使用したのはSTM32F4DiscoveryとNUCLEO-F446REです。

LCDモジュール

以下のモジュールをサポートしています。

対応グラフィックLCDモジュール一覧

 残念ながら、小型グラフィックLCDモジュールには定盤品というものがないので、一つに絞り込んで対応するという事ができませんでした。その時点で使える品種を選択するしかないのが現状です。これらは、入手できたものに順次対応した結果です。コントローラが同じであれば、動作する可能性が高いです。初期設定値の変更など、若干の調整で対応させることは容易です。とは言え、対応するには大量のデータシートを読み込む必要があり、大変な作業です。

接続インタフェース

CPUボードとLCDモジュールの接続は、以下のものに対応しています。

  • パラレル16/8bit 8080式
  • シリアルSPI半二重4線(8bit/フレーム)
  • シリアルSPI半二重3線(9bit/フレーム)
  • シリアルSPI全二重スタートバイト式(8bit/フレーム)<未実装>
  • 4線抵抗型タッチスクリーン(アナログ)
  • シリアルSPI全二重(タッチスクリーンコントローラ用)

ソフトウェア

開発環境

 STマイクロエレクトロニクスから無償で提供されているSTM32CubeIDEが前提です。CubeMXというソースコード自動生成ツールや、コンパイラ、CPUボードへの書き込み、デバッガなど開発に必要な全てを含み、何の苦労もなくソフトウェア開発を始められます。Windows,Linux,MacOSで動作します。ディスク領域は3GBぐらい必要です。STMicroelectronicsのサイトから入手して下さい。

機能

座標: X方向左=0、X方向右=画面サイズ、Y方向上=0、 Y方向下=画面サイズ
表示図形: 塗りつぶし矩形、任意角度・幅の直線、固定6サイズの文字列、円弧、画像
文字種: ASCII 7bitコード0x20-0x7f
文字フォント: 6×8, 8×12, 12×16, 16×24, 18×24, 24×36ドット
文字数: 40桁×40行(6×8フォント240×320ドット画面の場合)
カーソル機能: なし
スクロール機能: なし(ラップアラウンド表示されます)
バックライト制御: なし
色数:16bit
タッチスクリーン機能:あり
GUI機能:簡易版(オーバラップウィンドウ、基本図形、ボタン、入力フィールド、スクリーンキーボード、プルダウン)
具体的には「グラフィックLCDライブラリ/API仕様」を参照して下さい。

ダウンロード

ソースファイル

本ライブラリのソースファイルと、実行するのに必要なサンプルプログラム等のファイルが入ったSTM32CubeIDE用のプロジェクトファイルです。プロジェクトホームディレクトリに展開して下さい。ソースの権利に関しては「グラフィックLCDライブラリ/API仕様」を参照して下さい。

“GraphicLCD_STM32F4.zip” 9.6MB 2022.4.25

回路図ファイル

各LCDモジュールとの接続回路図のです。あくまでも参考としてご利用下さい。PDFと元の文書ファイルが入っています。.schはAutodeskのEAGLE(PCB設計・電気回路図ソフトウェア)、.numbersはmacOSの表計算ソフトのファイルです。

“GraphicLCD_sample.zip” 4.6MB 2022.4.25

サンプルの動かし方

NUCLEO-F4446REとMSP2807を用意できる場合の例

 ソースコードはNUCLEO-F4446REとMSP2807の組み合わせの状態です。ここでは、その前提での説明となります。なお、STM32CubeIDEのインストールや実行確認は済んでいるものとします。

配線

 CPUボードとLCDモジュール間を配線。ブレッドボード・ジャンパーワイヤ(メスーメス)を使うと、ハンダづけせずに済むのでお勧めです。お手軽な方法ですが、電源関係を間違えると、高確率でオシャカになるので細心の注意を。また、表示確認がしたいだけであれば、タッチパネル関係の4本(PC1,PC2,PC3,PB10)は結線しなくとも良いです。

サンプル回路図

通電

 NUCLEO-F4446REとIDEをインストールしたPCにUSBケーブルで接続。配線が問題ないとバックライトが点灯(光が隙間から漏れ出る)するはず。光らなければ、すぐ引き抜いて下さい。配線を確認して、致命的なミスでなければリトライです。

リビルド・実行

  • IDEでプロジェクトを開く:File -> Open Projects from File System… -> ダウンロードしたソースコードディレクトリを選択
  • リビルド:Project -> Build Project
  • 実行:Run -> Run As -> 1STM32 Cortex-M…
  • 画面に”Hello world”の表示が出るはずです。

その他のサンプルコード

  • 他のサンプルが4種類あります。Core/Src/main_sample?_*.txtの名前のファイルをmain.cにコピーしてリビルドすると実行できます。
  • main_sample1_text.txt: キャラクタディスプレイとして使う場合の例
  • main_sample2_figure.txt: 基本図形の表示
  • main_sample3_gui_dynamic.txt: GUIの例、アナログ時計と時刻入力メニュー/ボタン
  • main_sample3_gui_static.txt: 前サンプルと同じだが、図形定義を静的に行う例

自分のデバイスで動かしたい

LCDモジュールの選択

 接続するLCDモジュールの種類は、#defineで指定して下さい。具体的には、コンパイルオプションで-Dを使います。IDEではプロジェクトプロパティでC/C++Build -> Settings -> MCU GCC Compiler -> Preprocessorに以下のうづれかの名前を登録して下さい。選択肢がなければ、このライブラリは役に立てないという事です。

  • LCD_MODULE_CP2401T
  • LCD_MODULE_YHY024006A
  • LCD_MODULE_S95417AAA
  • LCD_MODULE_VLCM240YP04
  • LCD_MODULE_QJ240083S0
  • LCD_MODULE_S95160
  • LCD_MODULE_ATM0177
  • LCD_MODULE_ATM0177B3A
  • LCD_MODULE_M014C9163
  • LCD_MODULE_M014C9163SPI
  • LCD_MODULE_Z144SN005
  • LCD_MODULE_ZY_FGD1442701V1
  • LCD_MODULE_Z180SN009
  • LCD_MODULE_Z180SN1720
  • LCD_MODULE_H161T01
  • LCD_MODULE_L1F10085
  • LCD_MODULE_MSP2807
  • LCD_MODULE_ATM0130B3

I/Oポートの指定

 LCDモジュールとの接続線の指定は、CubeMXのI/Oピン設定画面にてGUIで行います。本ライブラリとの紐付けは”User Label”となります。使用するLCDモジュールによって、I/Oインタフェースの種類が決定されますが、場合によっては選択しなければならない事もあります。このあたりはデータシートを見てジャンパやピンのハイ/ローを配線する必要があります。これが、確定できればCPU側のI/Oポートの入出力条件を設定できます。

パラレル16/8bit 8080バスタイプ
Pin   output     GPIO mode          Pull-up             Maximum    User Label
Name  level                         Pull-down        output speed
----  ------  ----------------  -------------------  ------------  ------------------------
P**   High    Output Push Pull  No pull-up and down       High     LCM_CS
P**   High    Output Push Pull  No pull-up and down       High     LCM_RS
P**   High    Output Push Pull  No pull-up and down       High     LCM_WR
P*0    *      Output Push Pull  No pull-up and down        *       LCM_D0 or LCM_D0X,LCM_D0Y
P*1    *      Output Push Pull  No pull-up and down        *       LCM_D1 or LCM_D1X,LCM_D1Y
P*2    *      Output Push Pull  No pull-up and down        *       LCM_D2 or LCM_D2X,LCM_D2Y
 :     :               :                  :                :        :
P*15   *      Output Push Pull  No pull-up and down        *       LCM_D15 or LCM_D15X,LCM_D15Y

LCM_D0~D7を定義すると8bitバス、LCM_D0~D15まで定義されると16bitバスと認識します。また、16bitの場合、2つのポートにまたがって指定できます。ただし、ビット位置は重複できません。LCM_DnX, LCM_DnYのラベルがそのためのものです。

シリアルSPI半二重4線
Pin   output     GPIO mode          Pull-up             Maximum    User Label
Name  level                         Pull-down        output speed
----  ------  ----------------  -------------------  ------------  ------------------------
P**   High    Output Push Pull  No pull-up and down       High     LCM_CS
P**    *      Output Push Pull  No pull-up and down       High     LCM_SCK
P**    *      Output Push Pull  No pull-up and down       High     LCM_SDA
P**    *      Output Push Pull  No pull-up and down       High     LCM_DC

ソフトウェアでSPI信号を生成する場合、この定義だけです。ハードウェアでSPI信号を生成したい場合、加えてSPIペリフェラルを有効化し、コンパイラの-D定義にLCD_DRAW_SPI_CB=hspi*を登録して下さい。hspi*は、生成されたmain.c内に定義されたSPIのコントロールブロック(グルーバルエリア)の名前です。

シリアルSPI半二重3線
Pin   output     GPIO mode          Pull-up             Maximum    User Label
Name  level                         Pull-down        output speed
----  ------  ----------------  -------------------  ------------  ------------------------
P**   High    Output Push Pull  No pull-up and down       High     LCM_CS
P**    *      Output Push Pull  No pull-up and down       High     LCM_SCK
P**    *      Output Push Pull  No pull-up and down       High     LCM_SDA
シリアルSPI全二重スタートバイト式
Pin   output     GPIO mode          Pull-up             Maximum    User Label
Name  level                         Pull-down        output speed
----  ------  ----------------  -------------------  ------------  ------------------------
P**   High    Output Push Pull  No pull-up and down       High     LCM_CS
P**    *      Output Push Pull  No pull-up and down       High     LCM_SCK
P**    *      Input             Pull-up                   High     LCM_SDI
P**    *      Output Push Pull  No pull-up and down       High     LCM_SDO
4線抵抗型タッチスクリーン
Pin Name  output level     GPIO mode        Pull-up/down       Maximum output speed  User Label
--------  ------------  ----------------  -------------------  --------------------  ----------
P**             *       Output Push Pull  No pull-up and down           *            LCM_YU
P**             *       Output Push Pull  No pull-up and down           *            LCM_XR
P**            N/A      Analog mode       No pull-up and down          N/A           LCM_YD
P**            N/A      Analog mode       No pull-up and down          N/A           LCM_XL

LCM_YD, LCM_XLピンは、ADCを使用するので、ピン番号には制約が出ます。ADC1~3のどれかを選択しピンを決定するか、逆にピンからADC番号を、決めて下さい。ADCの設定は、12ビット精度として有効化して下さい。さらに、コンパイラの-D定義にLCD_TOUCH_ADC_CB=hadc*を登録して下さい。hadc*は、生成されたmain.c内に定義されたADCのコントロールブロック(グルーバルエリア)の名前です。

タッチスクリーン用SPI
Pin Name  output level     GPIO mode        Pull-up/down       Maximum output speed  User Label
--------  ------------  ----------------  -------------------  --------------------  ----------
P**            High     Output Push Pull  No pull-up and down          High          LCM_TP_SCK
P**             *       Input             No pull-up and down          N/A           LCM_TP_SDI
P**            Low      Output Push Pull  No pull-up and down          High          LCM_TP_SDO
P**            High     Output Push Pull  No pull-up and down          High          LCM_TP_CS

ソフトウェアでSPI信号を生成する場合、この定義だけです。ハードウェアでSPI信号を生成したい場合、加えてSPIペリフェラルを有効化し、コンパイラの-D定義にLCD_TOUCH_SPI_CB=hspi*を登録して下さい。hspi*は、生成されたmain.c内に定義されたSPIのコントロールブロック(グルーバルエリア)の名前です。

ユーザアプリでの使い方

新規プロジェクトの場合

 おおむね、次の手順です。

  • 新規プロジェクトでボードの選択
  • CubeMXでのI/Oポートの指定
  • define名の追加(LCDモジュールを選択)
  • インクルードパスの追加
  • ライブラリソースファイルのコピー
  • 試しに「printf(“Hello world\n”)」をアプリに追加して、ビルド&実行

ダウンロードしたLCDライブラリの組み入れは、ソースファイルをDrivers/LCDフォルダごとコピーするだけです。IDEはソースファイルが増えたことを自動的に認識してコンパイル対象になります。ソースツリーに追加されているはずですので確認できます。これでアプリケーションプログラムからAPIを呼び出せるようになります。

 APIの詳細は「グラフィックLCDライブラリ/API仕様」を参照して下さい。

既存プロジェクトへの追加

 既存のプロジェクトへ本ライブラリを追加する手順は、基本的に新規の場合と同じです。

  • CubeMXでのI/Oポートの指定
  • define名の追加(LCDモジュールを選択)
  • インクルードパスの追加
  • ライブラリソースファイルのコピー
  • 試しに「printf(“Hello world\n”)」をアプリに追加して、ビルド&実行

Copyright©2022 Toyohiko TOGASHI


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です