硬汉嵌入式论坛

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

[emWin] 请教使用WM_SetCreateFlags(WM_CF_MEMDEV)的问题

[复制链接]

13

主题

37

回帖

76

积分

初级会员

积分
76
发表于 2017-11-17 22:36:19 | 显示全部楼层 |阅读模式
芯片是stm32f103vct6
使用WM_SetCreateFlags(WM_CF_MEMDEV),界面切换就变得缓慢并且按钮控件都不灵光了。
不使用WM_SetCreateFlags(WM_CF_MEMDEV),界面时钟显示需要刷新时就有闪烁显示。
这个芯片内存也不会很大,有什么更好的方法?请大神们指点。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-18 01:46:25 | 显示全部楼层
你当前GUIConf.h文件中emWin动态内存开的多大。另外简单的创建两个对话框切换测试下,F1切换下简单的控制界面还是没问题的。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-18 13:15:52 | 显示全部楼层

回 eric2013 的帖子

eric2013:你当前GUIConf.h文件中emWin动态内存开的多大。另外简单的创建两个对话框切换测试下,F1切换下简单的控制界面还是没问题的。 (2017-11-18 01:46)

#define GUI_NUM_LAYERS            3   // 显示的最大层数

#define GUI_OS                    (0)  // 使用操作系统
#define GUI_MAXTASK                  (5)  // 最大可调用EMWIN任务数
#define GUI_SUPPORT_TOUCH         (1)  // 支持触摸

#define GUI_DEFAULT_FONT          &GUI_Font6x8    //默认字体
#define GUI_SUPPORT_MOUSE             (1)        //支持鼠标
#define GUI_WINSUPPORT                (1)        //窗口管理
#define GUI_SUPPORT_MEMDEV            (1)        //存储设备
#define GUI_SUPPORT_DEVICES           (1)        //使用设备指针

#define USE_EXRAM  0//使用外部RAM
//设置EMWIN内存大小
#define GUI_NUMBYTES  (40*1024)//30
#define GUI_BLOCKSIZE 0X80  //块大小


//GUI_X_Config
//初始化的时候调用,用来设置emwin所使用的内存
void GUI_X_Config(void) {
      //使用内部RAM

        U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字节的内存
        GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块
        GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少
        GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体

}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-18 15:57:55 | 显示全部楼层

回 bossking 的帖子

bossking:#define GUI_NUM_LAYERS            3   // 显示的最大层数

#define GUI_OS                   &nb .. (2017-11-18 13:15)
30KB足够了。主要就看应用程序和底层优化问题了。像我们的V4板子,F103+RA8875的,操作一些控制类的界面还是没问题的。你现在的是什么屏,另外简单的创建两个对话框切换测试下,看看是否有问题。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-19 12:32:21 | 显示全部楼层

回 eric2013 的帖子

eric2013:30KB足够了。主要就看应用程序和底层优化问题了。像我们的V4板子,F103+RA8875的,操作一些控制类的界面还是没问题的。你现在的是什么屏,另外简单的创建两个对话框切换测试下,看看是否有问题。
 (2017-11-18 15:57) 
驱动芯片是SSD1963 屏是AT070TN92 电阻触摸 ,按你这么说那应该是液晶底层驱动问题了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-19 12:33:14 | 显示全部楼层

回 bossking 的帖子

bossking:驱动芯片是SSD1963 屏是AT070TN92 电阻触摸 ,按你这么说那应该是液晶底层驱动问题了 (2017-11-19 12:32) 
是的,估计你的底层驱动不够优化,得优化下了。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-19 13:41:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:是的,估计你的底层驱动不够优化,得优化下了。 (2017-11-19 12:33)
按照你的例程,我记得看过你优化的例程 ,不知道在哪里,再找找。你有没有ssd1963的驱动程序
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-19 15:03:20 | 显示全部楼层
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
   
    LCD_PIXELINDEX pixel;
    LCD_SetCursor(x,y);
    *(__IO uint16_t *)(UCGUI_LCD_CMD)  = lcddev.wramcmd;  //写入颜色值
    for (;xsize > 0; xsize--, x++, p++)
    {
        pixel = *p;
        *(__IO uint16_t *)(UCGUI_LCD_DATA) =pixel;
    }
}

这个程序由原来
/*for (;xsize > 0; xsize--, x++, p++)
        {
            _SetPixelIndex(pDevice, x, y, *p);
        }*/调成这种的后
LCD_SetCursor(x,y);
    *(__IO uint16_t *)(UCGUI_LCD_CMD)  = lcddev.wramcmd;  //写入颜色值
    for (;xsize > 0; xsize--, x++, p++)
    {
        pixel = *p;
        *(__IO uint16_t *)(UCGUI_LCD_DATA) =pixel;
调成这种后,感觉速度是快很多,但是还是有比较明显的刷新感,还帮我看看能怎么调一下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-20 01:08:06 | 显示全部楼层

回 bossking 的帖子

bossking:static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
    
    LCD_PIXELINDEX pixel;
    LCD_SetCursor(x,y);
    *(__IO uint16_t .. (2017-11-19 15:03) 
确认下是屏幕的刷新感还是闪烁感,1963有没有像RA8875那样可以设置PLL,支持的话,可以降低PLL看看。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-20 09:15:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:确认下是屏幕的刷新感还是闪烁感,1963有没有像RA8875那样可以设置PLL,支持的话,可以降低PLL看看。 (2017-11-20 01:08) 
是刷新感,明显一行一行下来的。底层没改前一行一行有点慢,现在改了之后就快很多。但是还是能看清。
有设置PLL,那我晚上试下。这个产品都是晚上在搞。白天问问题,晚上验证。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-20 19:58:14 | 显示全部楼层
调节PLL没有效果,不管是调高还是调低,感觉上不明显的
//PLL
        LCD_WR_REG(0xE2);        //Set PLL with OSC = 8MHz (MCO),    Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1),
        LCD_WR_DATA(0x2C);        //参数1 8M*45 = 360M  VCO = 360MHz
        LCD_WR_DATA(0x02);        //参数2 Divider M = 2, PLL = 360/(M+1) = 120MHz
        LCD_WR_DATA(0x04);        //参数3 Validate M and N values   
        delay_us(100);
        LCD_WR_REG(0xE0);        // Start PLL command
        LCD_WR_DATA(0x01);        // enable PLL
        delay_ms(10);
        LCD_WR_REG(0xE0);        // Start PLL command again
        LCD_WR_DATA(0x03);        // now, use PLL output as system clock   
        delay_ms(12);  
        LCD_WR_REG(0x01);        //软复位
        delay_ms(10);
    //Set LSHIFT freq, i.e. the DCLK with PLL freq 120MHz set previously
    //Typical DCLK for AT070TN92 is 34MHz
    //34MHz = 120MHz*(LCDC_FPR+1)/2^20
    //LCDC_FPR = 300000 (0x0493E0)
        LCD_WR_REG(0xE6);        //设置像素频率,33Mhz
        LCD_WR_DATA(0x04);
        LCD_WR_DATA(0x93);
        LCD_WR_DATA(0xE0);
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-20 22:08:26 | 显示全部楼层
并且控件多的页面明显也慢一点,主界面是有几张小图片,都不大的。参数设置界面有几个控制。这几张界面明显有刷新感
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-21 02:01:28 | 显示全部楼层

回 bossking 的帖子

bossking:并且控件多的页面明显也慢一点,主界面是有几张小图片,都不大的。参数设置界面有几个控制。这几张界面明显有刷新感 (2017-11-20 22:08) 
不行别折腾这个1693了,直接我们淘宝搞个RA8875,弄RA8875吧,省事。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-21 13:42:40 | 显示全部楼层

回 eric2013 的帖子

eric2013:不行别折腾这个1693了,直接我们淘宝搞个RA8875,弄RA8875吧,省事。 (2017-11-21 02:01) 
没办法呀,当时方案选的用这款,现在改板太麻烦了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-22 01:11:34 | 显示全部楼层

回 bossking 的帖子

bossking:没办法呀,当时方案选的用这款,现在改板太麻烦了 (2017-11-21 13:42) 
你当前的图片是怎么显示的,是以位图的形式存在内部Flash不。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-22 17:01:40 | 显示全部楼层
是以位图存大内部flash里,字库在外部FLASH
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-22 17:02:06 | 显示全部楼层
现在只能略过这个事情,继续往下做其它功能。大神们帮我想想,还有什么地方可以改善
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107431
QQ
发表于 2017-11-23 00:35:24 | 显示全部楼层

回 bossking 的帖子

bossking:是以位图存大内部flash里,字库在外部FLASH
 (2017-11-22 17:01) 
我看下你的FSMC原理图和你的FSMC及其相关引脚的配置。这个也是个容易出错的点。
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-23 08:34:26 | 显示全部楼层

回 eric2013 的帖子

eric2013:我看下你的FSMC原理图和你的FSMC及其相关引脚的配置。这个也是个容易出错的点。 (2017-11-23 00:35) 
GPIO_InitTypeDef GPIO_InitStructure;
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;   
    FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
    FSMC_NORSRAMTimingInitTypeDef  writeTiming;
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);    //使能FSMC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);//使能PORTB,D,E以及AFIO复用功能时钟
   delay_ms(50);                     // delay 50 ms
   
     //PORTD复用推挽输出  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_14|GPIO_Pin_15;                 //    //PORTD复用推挽输出  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
      
    //PORTE复用推挽输出  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                 //    //PORTD复用推挽输出  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOE, &GPIO_InitStructure);                                                              

  GPIO_SetBits(GPIOD, GPIO_Pin_7);   //CS=1
  GPIO_SetBits(GPIOD, GPIO_Pin_14| GPIO_Pin_15 |GPIO_Pin_0 | GPIO_Pin_1);   
  GPIO_SetBits(GPIOE, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);   

  GPIO_SetBits(GPIOD, GPIO_Pin_4);      //RD=1
  GPIO_SetBits(GPIOD, GPIO_Pin_5);   //WR=1

  readWriteTiming.FSMC_AddressSetupTime = 0x01;     //1地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
  readWriteTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(ADDHLD)模式A未用到   
  readWriteTiming.FSMC_DataSetupTime = 0x02;//0f 2         // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
  readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  readWriteTiming.FSMC_CLKDivision = 0x00;
  readWriteTiming.FSMC_DataLatency = 0x00;
  readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A
   

  writeTiming.FSMC_AddressSetupTime = 0x00;     //地址建立时间(ADDSET)为1个HCLK  
  writeTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(A        
  writeTiming.FSMC_DataSetupTime = 0x02;         //2//数据保存时间为4个HCLK03   
  writeTiming.FSMC_BusTurnAroundDuration = 0x00;
  writeTiming.FSMC_CLKDivision = 0x00;
  writeTiming.FSMC_DataLatency = 0x00;
  writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A


  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  这里我们使用NE2 ,也就对应BTCR[6],[7]。
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
  FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;    //  存储器写使能
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

     FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  // 使能BANK1
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-23 08:39:12 | 显示全部楼层
LCD原理.zip (17 KB, 下载次数: 108)
原理是99se的,是这个系统中的两张图,包括液晶驱动和MCU
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-23 08:46:15 | 显示全部楼层
这是主界面的重绘部分,里面就几张小图。看看是不是哪里不对。
case WM_PAINT:
            GUI_SetBkColor(GUI_WHITE);//清屏
        //GUI_Clear();
      
         GUI_SetColor(0X00997143);
                  GUI_DrawRoundedFrame(10,84,790,390,8,5);
                    //GUI_SetColor(GUI_BLACK);
                  GUI_SetPenSize(7);
                  //GUI_DrawArc(100,200,50,50,45,135);
                  //GUI_DrawLine(200,100,200,400);
                  //GUI_DrawLine(100,150,800,150);
                  //GUI_DrawLine(135,165,135,330);
                 
                  ////////////////泵一///////////////////////////
        GUI_SetFont(&GUI_Font32_ASCII);
            for(i=0;i<8;i++)
             {      
               if (SysParameterCur.PumpUseFlag==UseState)
               {                  
                if (PumpState==RunState)
                {
                    GUI_DrawBitmap(&bmbluepump,200+70*i,200);
                }
                else if (PumpState==StopState)
                {
                    GUI_DrawBitmap(&bmgraypump,200+70*i,200);
                }
                else if (PumpState==ErroState)
                {
                    GUI_DrawBitmap(&bmredpump,200+70*i,200);
                }
                 GUI_DrawLine(245+i*70,150,760,150);
                 GUI_DrawLine(100,340,190+i*70,340);
                 GUI_DrawLine(190+i*70,290,190+i*70,340);
                 GUI_DrawLine(190+i*70,290,245+i*70,290);
                 GUI_DrawLine(245+i*70,150,245+i*70,290);
                 GUI_GotoXY(200+i*70,305);
                 GUI_DispDec(i+1,1);
                 GUI_DispStringAt("#",216+i*70,305);
               }
               else if (SysParameterCur.PumpUseFlag==NoUseState)
               {
                   __NOP();
               }
              
            }
            
               
        
        ////////////////////////////////////////////////
                  GUI_DrawBitmap(&bmarrow,150,350);
                  GUI_DrawBitmap(&bmarrow,650,130);
             //////////////////////////////////////////
                  GUI_DrawBitmap(&bmxinlinglogo,40,400);
////////////////////////////////////////////////////////////            
                  GUI_DrawBitmap(&bmwaterfull,50,200);
            
                  //GUI_DrawBitmap(&bmwater10,50,352);
             //water1是顶部      
             //water2是一条-3以内
             //GUI_DrawBitmap(&bmwater2,50,352-3);
             ///////////////////////////////////////////////
            GUI_SetFont(GUI_FONT_24_ASCII);
    GUI_SetColor(GUI_BLACK);
    //GUI_SetTextMode(GUI_TM_TRANS);
    GUI_SetTextAlign(GUI_TA_VCENTER);
    GUI_GotoXY(560,70);
    GUI_DispDec(RTC_DateStruct.RTC_Years+2000,4);
    GUI_DispString("-");
    GUI_DispDec(RTC_DateStruct.RTC_Months,2);
    GUI_DispString("-");
    GUI_DispDec(RTC_DateStruct.RTC_Days,2);
    GUI_DispString("  ");

    GUI_DispDec(RTC_TimeStruct.RTC_Hours,2);
    GUI_DispString(":");
    GUI_DispDec(RTC_TimeStruct.RTC_Minutes,2);
    GUI_DispString(":");
    GUI_DispDec(RTC_TimeStruct.RTC_Seconds,2);
           
           
    GUI_SetFont(&XBF_Font16);
    GUI_GotoXY(50,120);   
    GUI_DispString("巡检中");
    //GUI_SetFont(&XBF_Font16);
    GUI_GotoXY(50,150);   
    GUI_DispDec(RTC_TimeStruct.RTC_Seconds,2);
    //GUI_DispString("7小时12分26秒");
        break;
回复

使用道具 举报

13

主题

37

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2017-11-23 08:50:21 | 显示全部楼层
硬汉,还有这个问题我请教一下 WM_SetCreateFlags(WM_CF_MEMDEV)不是创建了吗,我可不可以把这个释放掉
因为只有主界面才会用实时刷新,后面设置等界面不需要,我可不可以,开启主界面时WM_SetCreateFlags(WM_CF_MEMDEV),关闭主界面时释放呢?可以这样吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 10:38 , Processed in 0.301872 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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