跳转到主要内容

修改生成行为

理解生成的代码结构以及开发人员如何用它来定制配置和行为非常重要。

通过使用策略性分布在STM32CubeMX生成的代码(C代码)中的用户代码段,为STM32CubeMX生成的文件中的手写用户代码提供保护。 在TouchGFX Generator生成的代码(C++代码)中,正如AL架构中描述的那样,其灵活性通过继承来实现。

TouchGFX Generator在TouchGFX/target文件夹中生成可修改的用户类,允许开发人员扩展HAL的行为并覆盖HAL配置中的功能。 当第一次使用STM32CubeMX生成代码时,此类文件的内容只生成一次。 添加到可修改类的用户内容再次生成代码时不会被STM32CubeMX覆盖。

HAL的扩展行为

对于某些驱动程序,TouchGFX 生成器无法生成能执行完整功能的HAL,因为这些驱动程序针对的是特定硬件。 TouchGFX Generator将生成可修改的用户类,该类继承自TouchGFX框架,并具有开发人员必须实现的空方法,以获得特定功能。 这些类别包括:

  • STM32TouchController.cpp——定义触摸控制器的行为。
  • TouchGFXGPIO.cpp——开放信号至GPIO进行性能测定。
  • OSWrappers.cpp——定义OSAL(如果在TouchGFX Generator中选择了自定义RTOS,则仅在TouchGFX/tagret中生成)。
  • TouchGFXDMA.cpp——对自定义DMA2D的行为进行定义(仅在TouchGFX Generator中选择了自定义硬件加速时生成)。
  • TouchGFXDataReader.cpp——定义数据读取器接口的行为(仅在TouchGFX Generator中启用外部数据读取器时生成)。

例如,在STM32TouchController.cpp中包含sampleTouch()的以下空定义,供开发人员实现。

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框架调用。
* 默认情况下,每个tick都调用 sampleTouch 一次,可通过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().
// // 若要覆写生成的实现,请注释对父函数的调用
// 并在此处实现所需的功能。
// 请注意:必须调用HAL::initialize()以初始化框架。

TouchGFXGeneratedHAL::initialize();

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