ToutchGFXの動作に関する覚書

TouchGFXの動作に関する覚書です

TouchGFXのバックで動くメインループ

FreeRTOSのDefaultTaskにある。
コードジェネレータが勝手に作ってくれたかどうかは記憶にない。
ドキュメントには一定のサイクルで動作するようにとの記述があったような気がするがTaskDelay()とか入れなくて良いのだろうか。

/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    MX_TouchGFX_Process();
  }
  /* USER CODE END 5 */
}

Touchパネル状態読出し関数の呼び出し

コードジェネレータが自動生成したtarget\TouchGFXConfiguration.cppに記述する

/* USER CODE BEGIN STM32TouchController */

#include <STM32TouchController.hpp>
extern "C" {
  int BU21025_Read(uint16_t *x, uint16_t *y);
}

void STM32TouchController::init()
{
    /**
     * Initialize touch controller and driver
     *
     */
}

bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
    /**
     * By default sampleTouch returns false,
     * return true if a touch has been detected, otherwise false.
     *
     * Coordinates are passed to the caller by reference by x and y.
     *
     * This function is called by the TouchGFX framework.
     * By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
     *
     */
  BU21025_Read(&x, &y);
  if(10 < x){
    return true;
  }
    return false;
}

/* USER CODE END STM32TouchController */

 

画面のボタン等を操作したときに呼び出す関数の設定について

new virtual functionを追加すると

TouchGFX/generated/gui_generated/src/screen_screen/screenViewBase.cpp

に宣言が出来るがこれを直接編集出来ないので、派生クラスを自分で書いてオーバーライドした関数で呼び出そうとするとその関数には飛ばない。
出来るだけC++には関わりたくないがTouchGFXを使えるようにするために試行錯誤した結果、下記のサイトで解決した。

STM32CubeIDEでTouchGFXを使おう2

要するにSTM32CubeIDEを使ってTouchGFX下のディレクトリにあるソースに関数を追加しなさいということらしい。
サイトで紹介された手順通りにやればちゃんと動いたのでC++の闇についてはこれ以上考えないことにした。

TouchGFXとLTDC on (stm32h7x & stm32cubeIDE)に関するメモ

TouchGFX Designer +stm32cubeIDEを使ってstm32h743+NHD-3.5-320240MF搭載ボードのプログラムを開発する際の覚書です

TouchGFXの使い方

ある程度日本語に翻訳されたTouchGFXの使い方です。
LTDCだけでなくSPI他のLCDインターフェースを使ったボードに関する内容等、広範囲を対象としているため必要な知識を見つけるのに苦労しますが2021/07時点でもっとも役に立つサイトではないかと思われます。

LTDCの設定とフレームバッファのアドレス

stm32h743でLTDCのフレームバッファとして使えるのはD1領域(0x24000000からの512KB)です

LTDCの設定でFrame Buffer Start Address を RAM_D1領域0x24000000に設定します。

下の設定はなくても構いませんがD1領域に別の変数を置く場合はダミーとして宣言しておけばTouchGFXが使うフレームバッファと干渉を避けることが出来ます。

#define ALIGN_32BYTES_D1(buf)  buf __attribute__ ((section(".RAM_D1"))) __attribute__ ((aligned (32)))

ALIGN_32BYTES_D1(uint16_t framebuffer[320*240]);

なのでフレームバッファを宣言(↑)してからフレームバッファを指定(↓)します

/* USER CODE BEGIN 2 */
// TouchGFX 3.framebuffer in internal RAM
HAL_LTDC_SetAddress(&hltdc, framebuffer, LTDC_LAYER_1);

フレームバッファにプログラムからアクセスするためには絶対アドレスでなく変数宣言した方が都合が良いのですが.iocでは下のように絶対アドレスで指定しなければならないので普通はこの設定アドレスを無視してプログラムの最初でフレームバッファアドレスを再設定すればOKです

TuchGFXの設定

TouchGFXでは初期化関数が.iocの設定を読み出して使うようになっていてここを0x00000000のままにしておくと生成されたmain.cの最初でプログラムがハングアップするため、ここをRAM-D1アドレスの0x24000000にしておかなければなりません。

 

stm32CubeIDEでmanage embedded software packagesが開けない件

stm32CubeIDEはGUDでハードウェアの設定をして初期化関数が生成できるstm32cubeMXとコンパイラを統合した開発環境です

stm32cubeIDEでライブラリ管理画面が開けない

本来はstm32cubeIDEだけでプログラム開発が出来るはずなのですが、私の環境(Windows10)ではHelp → manage embedded software packages が開けない状況になっているので、ライブラリの管理をする時は面倒ですがstm32cubeMXを起動してそちらで新しいライブラリやパッケージのインストールをしています。

この件についてWebを検索しても似た症例が見つからないので特殊な例なのだと思います。
HALライブラリのバージョンアップが頻繁でライブラリのサイズが大きくなるので(現在43.1GB)SSDのCドライブでなくハードディスクドライブを指定しているせいのような気がします。

その他にstm32cubeIDEから.iocを開くとstm32h7xのクロック設定がおかしくななって動作しなくなり、stm32cubeMXで設定しなおして復旧したという経験もあるのでまだstm32cubeMXは手放せません。

Helpメニューのリンクが切れているだけ?

その後で気が付きました、.iocから開いた画面の上部の↓Software packsからライブラリ管理画面が開けました。
単にHELPメニューのリンクが切れているだけのようです、stm32cubeMXではHELPメニューから開くのに慣れていたのでこちらには気が付きませんでした。