Приветствую тебя дорогой читатель!
Мы продолжаем изучать программирование под 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.