Приветствую тебя дорогой читатель!
Мы продолжаем изучать программирование под ARM микроконтроллеры. Сегодня начнем изучать emWin (STemWin) – графическую библиотеку и напишем 3 небольших примера: «Hello world!», отобразим текстовое сообщение “mcu.by” и выводим джедайскую картинку из Star Wars. Для данных примеров нам понадобится board stm32f429i-disco. И так приступим.
1. EmWin – продукт компании Segger, нам нужны ST библиотека emWin (скачать) и проект для VS (скачать).
2. Скачиваем demoGUI.
3. Большой набор примеров https://www.segger.com/emwin-samples.html для emWin.
4. Нужна Visual Studio, для симулирования проекта на компьютере, так как загрузка прошивки на board занимает очень много времени. И мы используем VS чтобы избавить нас от ненужных ожиданий для проверки работоспособности проекта.
После разархивации demoGUI, заходим в папку и запускаем проект Keil и находим функцию static void _Main(void), и меняем ее на следующий код (если проблемы тогда у Вас нету pack для работы с emWin Keil MDK, скачиваем emWin_add и разархивируем в ARM “папка с Keil”\Pack\Keil\MDK-Middleware\6.1.1)..
static void _Main(void) { GUI_Init(); GUI_DispString("Hello world!"); while(1); }
После разархивации stemwin, заходим в папку ..\stemwin\STemWin_Library_V1.1.2\Libraries\STemWinLibrary522\Software и запускаем GUIBuilder
1. Добавляем Window, устанавливаем позиции xPos и yPos равным 0.
2.Добавляем Text, и изменяем на mcu.by (правой кнопкой мыши, set text), затем меняем размер шрифта, тоже правой кнопкой мыши set font, меняем на GUI_FONT_32_1, сохраняем.
3. Генерируется WindowDLG.c файл, открываем копируем весь код и добавляем в наш проект перед static void _Main(void).
4. Немного изменяем функцию static void _Main(void) и у нас должно получиться следующее.
// USER START (Optionally insert additional includes) // USER END #include "DIALOG.h" /********************************************************************* * * Defines * ********************************************************************** */ #define ID_WINDOW_0 (GUI_ID_USER + 0x00) #define ID_TEXT_0 (GUI_ID_USER + 0x01) // USER START (Optionally insert additional defines) // USER END /********************************************************************* * * Static data * ********************************************************************** */ // USER START (Optionally insert additional static data) // USER END /********************************************************************* * * _aDialogCreate */ static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = { { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 320, 240, 0, 0x0, 0 }, { TEXT_CreateIndirect, "Text", ID_TEXT_0, 99, 92, 109, 43, 0, 0x64, 0 }, // USER START (Optionally insert additional widgets) // USER END }; /********************************************************************* * * Static code * ********************************************************************** */ // USER START (Optionally insert additional static code) // USER END /********************************************************************* * * _cbDialog */ static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; // USER START (Optionally insert additional variables) // USER END switch (pMsg->MsgId) { case WM_INIT_DIALOG: // // Initialization of 'Text' // hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0); TEXT_SetText(hItem, "mcu.by"); TEXT_SetFont(hItem, GUI_FONT_32_1); // USER START (Optionally insert additional code for further widget initialization) // USER END break; // USER START (Optionally insert additional message handling) // USER END default: WM_DefaultProc(pMsg); break; } } /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * CreateWindow */ WM_HWIN CreateWindow(void); WM_HWIN CreateWindow(void) { WM_HWIN hWin; hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0); return hWin; } // USER START (Optionally insert additional public code) // USER END /*************************** End of file ****************************/ /********************************************************************* * * _Main */ static void _Main(void) { #if GUI_WINSUPPORT WM_SelectWindow(CreateWindow()); GUI_Exec(); #endif }
А теперь картинка:
1. Изменяем пропорции картинки, чтобы они были примерно 320х240
2. Меняем глубину цвета, я поставил 256 bit.
3. Запускаем GUIBuilder, добавляем Windows и Image, правой кнопкой мыши assign тип файла, генерируем проект и вставляем весь код перед static void _Main(void).
Руководства по emWin:
UM03001_emWin5.pdf
AN03002_Custom_Widget_Type.pdf
4 thoughts on “Старт ARM. emWin часть 1.”
А не расскажите о создании собственных виджетов для stemwin?
свои виджеты не делал, но может будет полезно почитать Getting started with STemWin Library (AN4323), и то что описано на официальном сайте segger
всё понятно, кроме одного. что и как открываем в вижуал студио?
на официальном сайте можете скачать архив с проектом для visual studio
Comments are closed.