Интеграция CubeMX и TouchGFX
Вступление
В этой статье обсуждается, как интегрировать код и / или проекты, сгенерированные CubeMX (код C), в проект TouchGFX (код C ++).
С TouchGFX и комплектами для разработки STM32 очень легко начать работу и создавать прототипы. Если вы производите свое собственное (нестандартное) оборудование, рекомендуется использовать CubeMX для создания базового проекта для настройки микроконтроллера и его периферийных устройств.
Вы можете объединить два проекта (TouchGFX и CubeMX) двумя способами.
Вы либо хотите использовать:
- Проекты IAR или KEIL, созданные TouchGFX и интегрирующие файлы CubeMX
- Проект STM32Workbench или Atollic, созданный CubeMX и вставляющий TouchGFX
Обзор интеграции
Когда вы генерируете код и проекты из STM32 CubeMX, вам предоставляется выбор, какой проект компилятора генерировать.
- GCC (Stm32 Workbench, Atollic)
- IAR
- 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) {
}
}
В итоге
- При использовании IDE на основе Eclipse преобразуйте проект из проекта C в проект C ++.
- Создать дескриптор (ы) задачи и задачу ОС с точкой входа HAL :: taskEntry ()
- Вызовите touchgfx_init (), который устанавливает буфер кадров, DMA, bitdepth и т. Д. Этот метод для существующих портов TouchGFX расположен внутри BoardConfiguration.cpp
Обратная связь
Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях
пишите мне на netdm@mail.ru
Добавить комментарий