Интеграция CubeMX и TouchGFX

Вступление

В этой статье обсуждается, как интегрировать код и / или проекты, сгенерированные CubeMX (код C), в проект TouchGFX (код C ++).

С TouchGFX и комплектами для разработки STM32 очень легко начать работу и создавать прототипы. Если вы производите свое собственное (нестандартное) оборудование, рекомендуется использовать CubeMX для создания базового проекта для настройки микроконтроллера и его периферийных устройств.

Вы можете объединить два проекта (TouchGFX и CubeMX) двумя способами.

Вы либо хотите использовать: 

  1. Проекты IAR или KEIL, созданные TouchGFX и интегрирующие файлы CubeMX
  2. Проект STM32Workbench или Atollic, созданный CubeMX и вставляющий TouchGFX

Обзор интеграции

Когда вы генерируете код и проекты из STM32 CubeMX, вам предоставляется выбор, какой проект компилятора генерировать. 

  1. GCC (Stm32 Workbench, Atollic)
  2. IAR
  3. Keil

Общим для сгенерированного кода является то, что это весь C-код. Итак, как нам заставить TouchGFX (C ++) и CubeMX сгенерированный код (C) работать вместе?

Как правило, мы должны объединить созданный CubeMX main.c (вызов функций MX_ *) с TouchGFX main.cpp (настраивает touchgfx, задачу RTOS и запускает планировщик ОС).

Пример интеграции 

Вот пример интеграции файла main.cpp TouchGFX с файлом main.c, созданным CubeMX. Код, связанный с TouchGFX, выделен жирным шрифтом:

  
void GUI_Task(void const * argument)
{
touchgfx::HAL::getInstance()->taskEntry();
}

int main(void)
{

  /* Enable I-Cache-------------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache-------------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_DFSDM1_Init();
  MX_DMA2D_Init();
  MX_DSIHOST_DSI_Init();
  MX_FMC_Init();
  MX_I2C3_Init();
  MX_I2C4_Init();
  MX_QUADSPI_Init();
  MX_LTDC_Init();
  MX_RTC_Init();
  MX_SAI2_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_SPI6_Init();
  MX_UART4_Init();
  MX_USART1_Init();
  MX_USART2_UART_Init();
  MX_SDMMC1_MMC_Init();
  MX_DAC_Init();
...

  BSP_DisplayInit(); // Custom method for setting up DSI commands

/* Create the touchgfx GUI Task*/
  osThreadDef(guiTask, GUI_Task, osPriorityHigh, 0, 512);
  guiTaskHandle = osThreadCreate(osThread(guiTask), NULL);

/* Initialize touchgfx */
  touchgfx_init();

  /* Start scheduler */
  osKernelStart();

  while (1) {

  }
}

В итоге

  1. При использовании IDE на основе Eclipse преобразуйте проект из проекта C в проект C ++.
  2. Создать дескриптор (ы) задачи и задачу ОС с точкой входа HAL :: taskEntry ()
  3. Вызовите touchgfx_init (), который устанавливает буфер кадров, DMA, bitdepth и т. Д. Этот метод для существующих портов TouchGFX расположен внутри BoardConfiguration.cpp

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru