Графическая библиотека LVGL на отладочной плате stm32f407vet6 с aliexpress с использованием FSMC 16bit под HAL. В комплекте проект от CubeMX.
Дисплей на базе контроллера ILI9341 320ч240, pin2pin совместим с разьемом отладочной платы, одно время китайцы продавали их прямо комплектами. Дисплей оборудован резистивным тачскрином на базе XPT2064, интерфейс SPI.
Детальное описание отладочной платы доступно тут https://os.mbed.com/users/hudakz/code/STM32F407VET6_Hello/shortlog/
- SDIO
- USB mass storage класс
- SPI2(тачскрин)
- SPI3(разьем RF модуля)
- светодиоды LED1 & LED2
- кнопки BUTTON0 & BUTTON1
- FSMC(дисплей)
- DMA(mem2mem FSMC транспорт)
- RNG(аппаратный генератор случайных чисел)
- аппаратные прерывания
Проект представляет собой базовую инициализацию перифирии и возможность запустить тестовые подпрограммы интерфейса LVGL опсание библиотеки GUI тут https://lvgl.io/ примеры подпрограмм интерфейса находятся в каталоге lv_examples, для запуска примеров необходимо добавить (раскомментировать) функцию вызова в секции USER CODE 2 файла main.c например //lv_demo_benchmark(); lv_demo_widgets(); /* USER CODE END 2 */
(инциализировать нужно только один элемент)
В главном цикле закомментированы тесты дисплея без использования LVGL, для их активации необходимо обязательно закомментировать обработчик интерфейса lv_task_handler();
- нет транспорта USB - SDIO, его просто нет возможно добавлю позже. При подключении есть инциализация USB MS класса но нет доступа к SD карте
- для прерываний кнопок отсутствуют калбэк функции и обработчики.
- прерывание при зажатии тачскрина не снимается, что вызывает невозможность обновить экран при длительном нажатии. Временно и только для демо в обработчик прерывания добавлен дополнительный вызов функции обновления GUI lv_task_handler.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case TS_IRQ_Pin:
if(xpt2046_getXY(&x, &y))
{
}
lv_task_handler();
break;
default:
__NOP();
}
}
Библиотека требует что бы обработчик вызывался в цикле, соответственно для нормальной работы с внешними прерываниями необходимо либо вынести обработчик интерфейса из основного цикла и вызывать его через прерывание в более высоким приоритетом, либо использовать RTOS и семафоры, либо же принудительно снимать прерывание при зажатии тачскрина используя HAL и активировать при отпускании. Тогда обработчик GUI можно будет убрать из функции HAL_GPIO_EXTI_Callback, так как использование двух экземпляров процесса не совсем предполагается разработчками :)
Для сборки проекта требуется MS Visual Studio Code. Для корректной сборки необходимо указать в makefile пути для файлов исходного кода LVGL. Мной добавлены базовые пути для функций использованных в примере интерфейса. В случае написания собственных виджетов возможно придется добавлять пути к файлам аналогично добавленным в раздел
C_SOURCES =
...
lv_examples/assets/lv_font_montserrat_16_compr_az.c
lv_examples/assets/lv_font_montserrat_12_compr_az.c
lv_examples/assets/img_cogwheel_alpha16.c
lv_examples/assets/img_cogwheel_argb.c
...
Для записи можно использовать jlink или st-link отладчики. В папке ideScripts содержатся скрипты инициализации и обслуживания конфигурационных файлов проекта.
Для реконфигурации необходимо находясь в инетрфейсе VSCode щелкнуть правой кнопкой мыши на файле update.py и выбрать пункт "Выполнить файл в консоли".
Запустится мастер, будет предложено указать пути к требуемым файлам и после указания будут скорректированы файлы конфигурации проекта в папке ./vscode.
После успешного выполнения мастера станет доступно меню задач в разделе "Терминал" VSCode.