Старт ARM. emWin часть 1.

emWin

emWin

Приветствую тебя дорогой читатель!

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

  1. А не расскажите о создании собственных виджетов для stemwin?

    1. свои виджеты не делал, но может будет полезно почитать Getting started with STemWin Library (AN4323), и то что описано на официальном сайте segger

  2. всё понятно, кроме одного. что и как открываем в вижуал студио?

    1. на официальном сайте можете скачать архив с проектом для visual studio

Comments are closed.