移植emWin到STM32—RGB接口

本文详细介绍了如何将emWin移植到STM32上,重点在于配置内存管理和显示驱动接口。内存管理涉及GUI_X_Config函数,显示驱动包括LCD_X_Config,涉及多帧缓冲、颜色转换和自定义接口配置。同时讲解了LCD控制器初始化接口_LCD_InitController及触摸接口的配置,适合嵌入式硬件和STM32开发者参考。
摘要由CSDN通过智能技术生成

配置内存管理接口
emWin启动时,GUI_X_Config函数是GUI_Init调用的第一个初始化函数, 这个函数初始化了emWin的运行内存,代码位于GUIConf.c文件中,见 代码清单:RGB接口-1

代码清单:RGB接口-1 GUIConf.c文件内容

#include "GUI.h"

/*********************************************************************
*
*       Defines, configurable
*
**********************************************************************
*/
/* 定义用于GUI的可用字节数 */
#if USE_EXTMEMHEAP
#define GUI_NUMBYTES   (1024 * 1024 * 8)    // x Byte               (1)
#define GUI_EXTBUFADD  (0xD2000000-GUI_NUMBYTES)              (2)
                        //32MBSDRAM的最后8MB作为STemWIN动态内存
#else
#define GUI_NUMBYTES  (1024 * 110)    // x KByte
#endif

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
#if USE_EXTMEMHEAP
static U32 HeapMem[GUI_NUMBYTES / 4] __attribute__((at(GUI_EXTBUFADD)))
                                                ;               (3)
#else
static U32 extMem[GUI_NUMBYTES / 4];
#endif

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       Get_ExtMemHeap
*
* Purpose:
*   Allocate heap from external memory
*/
#if USE_EXTMEMHEAP
U32* Get_ExtMemHeap (void)
{
   
    return HeapMem;
}
#endif

/*********************************************************************
*
*       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)
{
   
#ifdef USE_EXTMEMHEAP
    GUI_ALLOC_AssignMemory(HeapMem, GUI_NUMBYTES);                  (4)
#else
    GUI_ALLOC_AssignMemory(extMem, GUI_NUMBYTES);
#endif
}

上述代码中的第1部分定义了emWin所使用内存堆大小的宏GUI_NUMBYTES,第2部分定义了内存堆起始地址的宏GUI_EXTBUFADD, 第3部分是利用前两个宏定义了一个静态的,大小为GUI_NUMBYTES / 4的数组HeapMem,并将数组的首地址定位到GUI_EXTBUFADD处, 第4部分利用库函数GUI_ALLOC_AssignMemory把该静态数组分配给emWin作为内存块使用。 旧版例程中还用到了GUI_ALLOC_SetAvBlockSize函数配置存储块的平均大小, 但在本教程使用的V5.44a版本中已经不再需要GUI_ALLOC_SetAvBlockSiz函数。

用户可通过GUI_NUMBYTES改变emWin使用的内存块大小,在本示例中为8MB。 也可通过GUIConf.h中的USE_EXTMEMHEAP宏来选择emWin的内存堆是在内部RAM还是外部SDRAM。

请注意,应用程序无法使用全部的内存块空间,因为emWin的内存管理系统本身使用了其中很小的一部分, 每个内存块大约需要额外的12个字节用于系统管理。并且在此分配的内存块并不会用于多帧缓冲。

配置显示驱动接口
emWin的显示驱动接口主要包括创建显示设备和显示设备驱动回调函数,移植时主要针对GUIDRV_wf.c文件进行修改,同时也是emWin移植的重点对象。

配置显示驱动
先来了解显示驱动函数LCD_X_Config的程序流程,它会在GUI_X_Config函数结束后被调用,具体见 代码清单:RGB接口-2 。
代码清单:RGB接口-2 LCD_X_Config接口(GUIDRV_wf.c文件)

void LCD_X_Config(void)
{
   
    int i;
    /* 如果使用了多帧缓冲则初始化多帧缓冲区 */
#if (NUM_BUFFERS > 1)
    for (i = 0; i < GUI_NUM_LAYERS; i++) {
   
        GUI_MULTIBUF_ConfigEx(i, NUM_BUFFERS);
    }
#endif
    /* 设置第一层的显示驱动程序和颜色转换 */
    GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_0, COLOR_CONVERSION_0, 0,
                            0);
    /* 设置第1层的尺寸大小 */
    LCD_SetSizeEx (0, XSIZE_0, YSIZE_0);
    LCD_SetVSizeEx(0, XSIZE_0, YSIZE_0 * NUM_VSCREENS);

    /* 如果使能多图层
    则设置第二层的显示驱动程序和颜色转换及尺寸
    */
#if (GUI_NUM_LAYERS > 1)
    GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_1, COLOR_CONVERSION_1, 0,
                            1);
    LCD_SetSizeEx (1, XSIZE_1, YSIZE_1);
    LCD_SetVSizeEx(1, XSIZE_1, YSIZE_1 * NUM_VSCREENS);
#endif

    for (i = 0; i < GUI_NUM_LAYERS; i++) {
   
        _aPendingBuffer
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值