STM32F429 & EmWin Çalışmalarım

Başlatan Mucit23, 01 Ekim 2014, 23:02:32

Mucit23

Arkadaşlar Merhaba,

STM32F429I-Discovery ile EmWin üzerinde çalışamalar yapıyorum. Amacım GUI fonksiyonlarını öğrenmek. İleride GUI builder ile çeşitli arayüzler tasarlamayı hedefliyorum.

EmWin'in bilmeyenler için ufak bir açıklama yapmak gerekirse eğer SEGGER firmasının mikrodenetleyiciler için hazırlamış olduğu bir grafik arayüzüdür. Normalde ücretlidir. Ama ST gibi firmalar Kendi MCU ları için kapalı lib olarak ücretsiz olarak dağıtmaktadır. Bende yeni yeni öğreniyorum.

Bu başlık altında EmWin ile ilgili birkaç soru sormak istiyorum.

Normalde Emwin STM32F429 Disco ile LCD'yi dikey kullanacak şekilde ayarlanmış. Ben LCD'yi Yatay kullanmak istiyorum. Bunun için GUI ayarlarını nasıl yapmam gerekir? Daha önce uğraşan oldumu?

memo333

void LCD_X_Config(void) {
  GUI_DEVICE * pDevice;
  CONFIG_FLEXCOLOR Config = {0};
  GUI_PORT_API PortAPI = {0};
  //
  // Set display driver and color conversion
  //
  pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
  //
  // Display driver configuration, required for Lin-driver
  //
  LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
  LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
  //
  // Orientation
  //
  [b]Config.Orientation = GUI_MIRROR_X;//GUI_SWAP_XY; //| GUI_MIRROR_Y;[/b]
  GUIDRV_FlexColor_Config(pDevice, &Config);
  //
  // Set controller and operation mode
  //
  PortAPI.pfWrite16_A0  = LcdWriteReg;
  PortAPI.pfWrite16_A1  = LcdWriteData;
  PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
  PortAPI.pfReadM16_A1  = LcdReadDataMultiple;
  GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);
}


kusura bakma fazla vaktim yok akşama detaylı yazarım..
Gömülü Linux Notları --> http://linuxedu.xyz/

Mucit23

#2
Hocam kullanımını biraz açıklayabilirmisiniz. LCD_X_Config içerisini verdiğiniz kodlarla değiştirmem yeterlimi? Örneğin GUI Builder ile Doğrudan yatay tasarımlar yapabilirmiyim?

Edit: Bu arada GUI Builder kullanarak ilk kez STM32F429 Disco üzerinde tasarım yaptım. Gerçekten on numara birşey :)

memo333

önce iki satır kodu değiştir oluyorsa oluyodur :)

GUI builderda tasarımı yanılmıyorsam yatay olarak yapman gerekir..

sen bir callback mekanizması bişrde window manager işin içine girince gör :)
Gömülü Linux Notları --> http://linuxedu.xyz/

Mucit23

#4
Hocam Teşekkürler. LCD'yi Yatay çalıştırmadan önce ufak bir problemim var onu çözmem gerekiyor.

GUI ile ekranda buton görüntüleyemiyorum.

Örneğin GUI Builder ile aşağıdaki gibi bir tasarım yaptım.


Bu tasarımla birlikte GUI_Builder'in bana verdiği çıktı aşağıdaki gibi.

/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.22                          *
*        Compiled Jul  4 2013, 15:16:01                              *
*        (c) 2013 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: [url=http://www.segger.com]www.segger.com[/url]  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
// USER END

#include "DIALOG.h"
#include "main.h"


/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ID_TEXT_0 (GUI_ID_USER + 0x01)
#define ID_BUTTON_0 (GUI_ID_USER + 0x02)


// 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, 240, 320, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Uygulama 1", ID_TEXT_0, 69, 140, 108, 20, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 9, 8, 88, 28, 0, 0x0, 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;
  int     NCode;
  int     Id;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'Window'
    //
    hItem = pMsg->hWin;
    WINDOW_SetBkColor(hItem, 0x000000FF);
    //
    // Initialization of 'Uygulama 1'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
    //
    // Initialization of 'Button'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
    BUTTON_SetFont(hItem, GUI_FONT_16B_ASCII);
    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // 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)
void MainTask(void)
{
	WM_SetCreateFlags(WM_CF_MEMDEV | WM_CF_CONST_OUTLINE);

  GUI_Init();
	
  CreateWindow();
	
  while(1)
	{
		GUI_Delay(100);
        }
		 
}
// USER END

/*************************** End of file ****************************/


En alttaki MainTask fonksyinounu ben kendim ekliyorum. Main fonksiyonunda burayı çağırıyorum. Herneyse kodu derleyip işlemciye yüklediğimde arka plan yükleniyor. "Uygulama 1" Yazısıda görünüyor ama buton görünmüyor. Daha çok butonlu karmaşık bir tasarım yaptım. Onda arka planda doğru düzgün yüklenmedi.

Bu neden kaynaklanır?

mesaj birleştirme:: 03 Ekim 2014, 18:39:44

Başka bir örnek vereyim.

Örneğin GUI Builder ile aşağıdaki gibi bir tasarım yapıyorum.



Kite yüklediğimde ekrana aşağıdaki gibi birşey çıkıyor.



Meseleyeyi anlayamadım. Mesela GUI Builderde sadece 320x240 boyutlarında boş bir framewin koyuyorum oda kitte görünmüyor.

Bu sorunu çözdükten sonra ekranı yatay yapmak için uğraşacağım.

Mucit23

Çözemedim hala.

bir türlü ekrana bi buton koyamadım. Sorun neden olabilir?

Mucit23

Konu güncel.

Dün akşam bayağı bi uğraştım. Segger'in web sitesinden örneklere baktım. Ordaki örnekleri kendi projemde denedim. Elde ettiğim sonuçlara göre sadece arka plan rengini değiştirebiliyorum. Birde sanırım text api leri çalışıyor.

Kapalı kütüphane kullandığım için elimden birşey gelmiyor sorunu anlayamıyorum. Benim aklıma gelen tek şey şudur.

Normalde STM32F429I-Disco ile gelen demo program içerinde OS kullanıldığı için emwin library'si olarak STemWin522_CM4_OS_Keil.lib dosyası kullanılıyor.

Ben OS veya başka bir yapı kullanmıyorum şimdilik. Bu yüzden emwin library'si içerisinde STemWin522_CM4_Keil.lib dosyasını alıp projeme dahil ettim. Derlemede felan sıkıntı yok. Sonuç yukarıdaki resimlerdeki gibi.

Acaba diyorum bu dosyadamı problem var? Yoksa Configürasyon ayarlarındamı problem var. İnternette hiç Proje olarak indirip bakabileceğim örnekte yok. Bu yüzden farklı Lib Dosyalarını deneyemiyorum.

Benim GUIConf.c dosyam aşağıdaki gibi

/*********************************************************************
*          Portions COPYRIGHT 2013 STMicroelectronics                *
*          Portions SEGGER Microcontroller GmbH & Co. KG             *
*        Solutions for real time microcontroller applications        *
**********************************************************************
*                                                                    *
*        (c) 1996 - 2012  SEGGER Microcontroller GmbH & Co. KG       *
*                                                                    *
*        Internet: [url=http://www.segger.com]www.segger.com[/url]    Support:  support@segger.com    *
*                                                                    *
**********************************************************************

** emWin V5.22 - Graphical user interface for embedded applications **
All  Intellectual Property rights  in the Software belongs to  SEGGER.
emWin is protected by  international copyright laws.  Knowledge of the
source code may not be used to write a similar product.  This file may
only be used in accordance with the following terms:

The software  has been  licensed to  STMicroelectronics  International
N.V. whose  registered office  is situated at Plan-les-Ouates, Geneva,
39 Chemin du Champ des Filles,  Switzerland solely for the purposes of
creating libraries for  STMicroelectronics  ARM Cortex™-M-based 32-bit
microcontroller    products,    sublicensed    and    distributed   by
STMicroelectronics  under  the  terms  and  conditions of the End User
License Agreement supplied with  the software. The use of the software
on a stand-alone basis  or for any purpose other  than to operate with
the specified  microcontroller is prohibited and subject to a separate
license agreement.

Full source code is available at: [url=http://www.segger.com]www.segger.com[/url]

We appreciate your understanding and fairness.
----------------------------------------------------------------------
File        : GUIConf.c
Purpose     : Display controller initialization
---------------------------END-OF-HEADER------------------------------
*/

/**
  ******************************************************************************
  * @attention
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */

#include "GUI.h"

/*********************************************************************
*
*       Defines, configurable
*
**********************************************************************
*/

//
// Define the available number of bytes available for the GUI
//

#define GUI_NUMBYTES  (1024 * 128)    // x KByte

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
#if defined ( __CC_ARM   ) 
  U32 HeapMem[1024 * 1024] __attribute__((at(0xD0100000)));
#elif defined ( __ICCARM__ ) 
  #pragma location=0xD0100000
  static __no_init U32 HeapMem[1024 * 1024];
#elif defined   (  __GNUC__  ) 
  U32 HeapMem[1024 * 1024] __attribute__((section(".HeapMemSection")));
#endif

U32 extMem[GUI_NUMBYTES / 4];

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/

/*********************************************************************
*
*       Get_ExtMemHeap
*
* Purpose:
*   Allocate heap from external memory
*/
U32* Get_ExtMemHeap (void)
{
  return HeapMem;
}

/*********************************************************************
*
*       GUI_X_Config
*
* Purpose:
*   Called during the initialization process in order to set up the
*   available memory for the GUI.
*/
void GUI_X_Config(void)
{
  GUI_ALLOC_AssignMemory(extMem, GUI_NUMBYTES);
}

/*************************** End of file ****************************/


Belki sorun buradadır bilmiyorum.
Daha önce STM32F429 ve emWin ile uğraşıp çalıştıran arkadaşlar kendi projesinde kullandığı emWin Lib dosyasını  verirlese hemen deneyebilirim.

serdararikan

Bu lib dosyasini hiç kullanmadım ama width ile height in yerlerini degistirip tekrar deneyebilirsin

Mucit23

Alıntı yapılan: serdararikan - 06 Ekim 2014, 11:44:38
Bu lib dosyasini hiç kullanmadım ama width ile height in yerlerini degistirip tekrar deneyebilirsin

Bu dediğiniz Buton oluşturulurken kullanılan parametrelermi? Tam olarak hangi parametreler?

Aslında Forumdan @yamak hocamız kendi yazısı var. (Yazı için ayrıca teşekkürler)
http://www.mcu-turkey.com/stm32f429i-disco-emwin-uygulamasi/
Kendi Yaptığı uygulamada STemWin522_4x9i_CM4_OS_Keil.lib dosyasını kullanmış. Discovery ile gelen demo projede'de OS kullanıldığı için bu dosya kullanılıyor. Ben ise OS kullanmadığım için ST'nin sitesinden emwin kütüphanesini indirip oradan STemWin522_CM4_Keil.lib dosyasını alıp projeme ekledim. Gördüğüm örnekler arasındaki tek fark budur. Bunun dışında Diğer Kütüphaneler LCD Driveri (GUIDRV_stm32f429i_discovery) ve diğer configürasyon dosyaları demo program ile aynı. Bu yüzden sorunun lib dosyasından kaynaklanacağını düşünüyorum.

Eğer STemWin522_4x9i_CM4_OS_Keil.lib dosyasını projeme ekleyebilirsem problem çözülebilir diye düşünüyorum. Bu dosyayıda ekleyince birçok hata alıyorum normal olarak. Free_Rtos ile ilgili birçok dosyayı eklememi istiyor. Düzeltemedim bir türlü. ,

@yamak hocam kısa bir açıklama yaparsa valla büyük dertten kurtulurum :)


memo333

/* Activate the use of memory device feature */
  WM_SetCreateFlags(WM_CF_MEMDEV);//


GUI_Initten önce bi yazıp denermisin..
Gömülü Linux Notları --> http://linuxedu.xyz/

Mucit23


memo333

#11
olmaz eklemişsin..

CRCyi açtın mı?
Gömülü Linux Notları --> http://linuxedu.xyz/

Mucit23

#12
Hocam CRC açık, Sadece sizin verdiğiniz flag ile denedim değişen birşey olmadı. 3 gündür akşamları buna uğraşıyorum. Çözemedim hala. Sizce benim tahmin ettiğim gibi bir problem olabilirmi? Yani Lib Dosyasından kaynaklı bir sorun olabilirmi?

Tahminimce siz emWin ile uğraşmışsınız. Eğer öyleyse hangi lib dosyasını kullandınız?


mesaj birleştirme:: 06 Ekim 2014, 22:30:43

Bu arada hocam eğer test imkanınız var ise tüm proje dosyasınıda gönderebilirim. Sorunu çözmeye odaklanmışım

memo333

#13
verde bende o kit yok..

emwin gıcıktır biraz bayramı zehir etti bana da..

sen yine de bir gönder battı balık yan gider..

birde şu guiconf.h dosyasında

#define GUI_NUM_LAYERS            2

tanımlı mı ya da kaç??
Gömülü Linux Notları --> http://linuxedu.xyz/

Mucit23

Evet hocam tanımlı.

Aslında zaten bu dosyaları doğrudan STM32F429I-Disco ile gelen demo proje içerisinden aldım. GUI_X, GUIConf ve GUI_Drive.. Dosyalarını o proje içerisinden aldım. Bunlar zaten STM32F429I-Disco ile çalışmak üzere ayarlanmış. Gerekki bu dosyalarda sıkıntı olmasın.
Kapalı kütüphaneler ile çalışmak gerçekten sıkıntıymış. İçim hiç rahat etmiyor. Aslında işin bir kırılma noktası var. Onu bi aşarsam herşey yerine oturacak gibi :)

Şuanda proje dosyasını yüklüyorum. Birazdan gönderirim hocam.