硬汉嵌入式论坛

 找回密码
 立即注册
查看: 91|回复: 6
收起左侧

[emWin] 求助:emwin为什么不能正常显示窗体?

[复制链接]

2

主题

25

回帖

31

积分

新手上路

积分
31
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 zouhp 于 2025-6-5 10:48 编辑

我移植了TheradX和emwin,可以正常显示文字、彩色图片,多任务切换也都正常,想着照着下面的例子显示窗体,出来的却是黑屏,是emwin需要做什么额外的配置吗?

#include "MainTask.h"

/*
*********************************************************************************************************
*                                             宏定义
*********************************************************************************************************
*/
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x01)
#define ID_SLIDER_0 (GUI_ID_USER + 0x02)
/*
*********************************************************************************************************
*                               GUI_WIDGET_CREATE_INFO类型数组
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0x64, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 130, 28, 147, 35, 0, 0x0, 0 },
  { SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 133, 118, 137, 25, 0, 0x0, 0 },
};
/*
*********************************************************************************************************
*        函 数 名: _cbDialog
*        功能说明: 对话框回调函数               
*        形    参: pMsg  回调参数
*        返 回 值: 无
*********************************************************************************************************
*/
static void _cbDialog(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        int     NCode;
        int     Id;


        switch (pMsg->MsgId)
        {
                case WM_INIT_DIALOG:
                        //
                        // 初始化 'Framewin'
                        //
                        hItem = pMsg->hWin;
                        FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);
                        FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                        FRAMEWIN_SetText(hItem, "armfly");
               
                        //
                        // 初始化 'Button'
                        //
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
                        BUTTON_SetText(hItem, "armfly");
                        break;
               
                case WM_NOTIFY_PARENT:
                        Id    = WM_GetId(pMsg->hWinSrc);
                        NCode = pMsg->Data.v;
                        switch(Id)
                        {
                                case ID_BUTTON_0:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                               
                                                case WM_NOTIFICATION_RELEASED:
                                                        break;
                                        }
                                        break;
                               
                                case ID_SLIDER_0:
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                               
                                                case WM_NOTIFICATION_RELEASED:
                                                        break;
                                               
                                                case WM_NOTIFICATION_VALUE_CHANGED:
                                                        break;
                                        }
                                        break;
                        }
                        break;
                       
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}

/*
*********************************************************************************************************
*        函 数 名: CreateFramewin
*        功能说明: 创建对话框               
*        形    参: 无
*        返 回 值: 返回对话框句柄
*********************************************************************************************************
*/
WM_HWIN CreateFramewin(void)
{
        WM_HWIN hWin;

        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
        return hWin;
}


/*
*********************************************************************************************************
*        函 数 名: MainTask
*        功能说明: GUI主函数
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
       
        /* 初始化 */
        GUI_Init();
       
        /*
         关于多缓冲和窗口内存设备的设置说明
           1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
                  WM_MULTIBUF_Enable(1);
           2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
           3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
                  STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
                  感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
           4. 所有emWin例子默认是开启三缓冲。
        */
        WM_MULTIBUF_Enable(1);
       
       
       
        /* 显示游标 */
        GUI_CURSOR_Show();
       
        /* 创建对话框 */
        CreateFramewin();
               
        while(1)
        {
                GUI_Delay(500);
        }
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116196
QQ
发表于 4 天前 | 显示全部楼层
这个函数注释掉,重新编译试试

WM_MULTIBUF_Enable
回复

使用道具 举报

2

主题

25

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 3 天前 | 显示全部楼层
eric2013 发表于 2025-6-5 11:21
这个函数注释掉,重新编译试试

WM_MULTIBUF_Enable

试过了,不管用。
液晶屏控制器是ILI9488,主控芯片STM32F412,SPI接口。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116196
QQ
发表于 前天 08:05 | 显示全部楼层
zouhp 发表于 2025-6-6 15:51
试过了,不管用。
液晶屏控制器是ILI9488,主控芯片STM32F412,SPI接口。

那你的emWin程序底层16bpp的接口函数实现可能有问题
回复

使用道具 举报

2

主题

25

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 前天 11:09 | 显示全部楼层
eric2013 发表于 2025-6-7 08:05
那你的emWin程序底层16bpp的接口函数实现可能有问题

可是16bpp的位图都可以正常显示啊。


/*********************************************************************
*
*       Draw Bitmap 16 BPP, not optimized
*
* Purpose:
*   Drawing of 16bpp high color bitmaps.
*   Only required for 16bpp color depth of target. Should be removed otherwise.
*/
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const * p, int xsize) {
#if emWin_Optimize

    int i;
    unsigned char *ptr;

    // 指定LCD内存空间
    LCD_CLR_CS();
    LCD_CLR_A0();
    SPI_WriteByte(SPI1, 0x2A);
    LCD_SET_A0();
    SPI_WriteByte(SPI1, (x>>8));
    SPI_WriteByte(SPI1, (0x00FF&x));
    SPI_WriteByte(SPI1, ((x+xsize-1)>>8));
    SPI_WriteByte(SPI1, (0x00FF&(x+xsize-1)));
    LCD_CLR_A0();
    SPI_WriteByte(SPI1, 0x2B);
    LCD_SET_A0();
    SPI_WriteByte(SPI1, (y>>8));
    SPI_WriteByte(SPI1, (0x00FF&y));
    SPI_WriteByte(SPI1, (y>>8));
    SPI_WriteByte(SPI1, (0x00FF&y));
    LCD_CLR_A0();
    SPI_WriteByte(SPI1, 0x2C);
    LCD_SET_A0();
    //
    ptr = Spi1DMABuf;
    // 每个点的颜色可以不同,来自*p
    for (i=0; i<xsize; i++)
    {
        *ptr++ = (*p>>8) & 0xF8;
        *ptr++ = (*p>>3) & 0xFC;
        *ptr++ =  *p<<3;
        p++;
    }
    //
    SPI1_DMA_Send(Spi1DMABuf, xsize*3);
    LCD_SET_CS();
}





/*********************************************************************
*
*       _DrawBitmap
*/
static void _DrawBitmap(GUI_DEVICE * pDevice, int x0, int y0,
                       int xSize, int ySize,
                       int BitsPerPixel,
                       int BytesPerLine,
                       const U8 * pData, int Diff,
                       const LCD_PIXELINDEX * pTrans) {
  int i;

  switch (BitsPerPixel) {
  case 1:
    .......
    break;
  case 2:
   .......
    break;
  case 4:
   .......
    break;
  case 8:
   .......
    break;
  //
  // Only required for 16bpp color depth of target. Should be removed otherwise.
  //
  case 16:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine16BPP(pDevice, x0, i + y0, (const U16 *)pData, xSize); // 每次填充1行,填充ySize次
      pData += BytesPerLine;
    }
    LCD_SET_CS();
    break;
  .......
  }
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116196
QQ
发表于 昨天 10:21 | 显示全部楼层
zouhp 发表于 2025-6-7 11:09
可是16bpp的位图都可以正常显示啊。

试试这个接口函数不使用dma方式正常不
回复

使用道具 举报

2

主题

25

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 昨天 12:38 | 显示全部楼层
eric2013 发表于 2025-6-8 10:21
试试这个接口函数不使用dma方式正常不

接口函数一开始就没有用DMA,刷新的时候特别慢,但也能正确显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 17:38 , Processed in 0.327214 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表