주요 내용으로 건너뛰기

Modifying Generated Behavior

생성된 코드의 구조와 개발자가 이를 사용해 구성을 맞춤화하는 방법을 이해하는 것이 중요합니다.

STM32CubeMX에서 생성된 파일에 작성된 사용자 코드는 STM32CubeMX에서 생성된 코드(C 코드)를 전반에 전략적으로 배치된 User Code 섹션을 사용해 보호가 됩니다. TouchGFX Generator에서 생성된 코드(C++ 코드)에서 이러한 유연성은 AL 아키텍처에 설명된 대로 상속을 통해 달성됩니다.

TouchGFX Generator는 TouchGFX/target 폴더에 수정 가능한 사용자 클래스를 생성하기 때문에 사용자는 HAL의 동작과 HAL 구성의 재정의 기능을 확장할 수 있습니다. 이러한 파일의 내용은 STM32CubeMX를 사용하여 처음으로 코드를 생성할 때만 딱 한 번 생성됩니다. 수정 가능한 클래스에 추가된 사용자 콘텐츠는 코드를 다시 생성할 때 STM32CubeMX가 덮어쓰지 않도록 보호가 됩니다.

HAL의 동작 확장

일부 드라이버의 경우 하드웨어에 따라 TouchGFX Generator가 완전히 작동하는 HAL을 생성할 수 없습니다. TouchGFX Generator는 TouchGFX 프레임워크에서 상속되고, 특정 기능을 얻기 위해 개발자가 반드시 구현해야 하는 빈 메서드가 있는 수정 가능한 사용자 클래스를 생성합니다. 이러한 클래스에는 다음이 포함됩니다.

  • STM32TouchController.cpp - 터치 컨트롤러의 동작을 정의합니다.
  • TouchGFXGPIO.cpp - 성능 측정을 위해 신호를 GPIO에 노출합니다.
  • OSWrappers.cpp - OSA을 정의합니다(TouchGFX Generator에서 Custom RTOS가 선택된 경우에만 생성).
  • TouchGFXDMA.cpp - 맞춤형 DMA2D의 동작을 정의합니다(TouchGFX Generator에서 Custom 하드웨어 가속이 선택된 경우에만 생성).
  • TouchGFXDataReader.cpp - Data Reader 인터페이스의 동작을 정의합니다(TouchGFX Generator에서 External Data Reader가 활성화 되어 있는 경우에만 생성).

예를 들어, 다음과 같이 sampleTouch()의 빈 정의는 개발자가 구현할 STM32TouchController.cpp에서 찾을 수 있습니다.

STM32TouchController.cpp
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);
*
*/
return false;
}

HAL 구성 재정의

HAL의 클래스 계층으로 인해 사용자는 TouchGFXHAL.cpp 내부의 STM32CubeMX에서 생성된 HAL 구성 또는 동작을 재정의할 수 있습니다.

아래 예제에서 개발자는 initialize() 메서드를 수정해서 TouchGFX를 추가로 구성하거나, TouchGFXGeneratedHAL에서 기존 구성 세트를 수정합니다.

TouchGFXHAL.cpp
void TouchGFXHAL::initialize()
{
// Calling parent implementation of initialize().
//
// To overwrite the generated implementation, omit call to parent function
// and implemented needed functionality here.
// Please note, HAL::initialize() must be called to initialize the framework.

TouchGFXGeneratedHAL::initialize();

//Overriding configurations
hal.lockDMAToFrontPorch(true);
hal.setFingerSize(4);
hal...
}