跳轉到主要內容

修改所產生的行為

請務必瞭解產生程式碼的結構,以及開發人員如何運用該結構以自訂設定和行為。

要保護由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:定義OSAL(僅於TouchGFX/tagret產生,前提是在TouchGFX Generator中選取Custom (客製)RTOS)。
  • TouchGFXDMA.cpp:定義客製DMA2D的行為(只有在TouchGFX Generator中選取Custom (客製)硬體加速時才會產生)。
  • TouchGFXDataReader.cpp:定義資料讀取器介面行為(只有在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.
*
* 座標是以x及y的格式傳送給呼叫者。
*
* 此函數是由TouchGFX架構呼叫。
* By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
*
*/
return false;
}

覆寫HAL設定

由於HAL的類別階層,使用者可覆寫由STM32CubeMX在TouchGFXHAL.cpp內部產生的HAL設定或行為。

在以下範例中,開發人員可修改initialize()方法以額外設定TouchGFX,或是修改TouchGFXGeneratedHAL之中的現有設定集。

TouchGFXHAL.cpp
void TouchGFXHAL::initialize()
{
// Calling parent implementation of initialize().
//
// 若要覆寫產生的實作,請忽略對父函數的呼叫
// 並在此實作所需功能。
// 請注意:必須呼叫HAL::initialize()以初始化架構。

TouchGFXGeneratedHAL::initialize();

//覆寫設定
hal.lockDMAToFrontPorch(true);
hal.setFingerSize(4);
hal...
}