硬汉嵌入式论坛

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

[emWin] stemwin通过外部sram启用缓存窗口不正常

[复制链接]

3

主题

19

回帖

3

积分

新手上路

积分
3
发表于 2016-1-7 21:06:19 | 显示全部楼层 |阅读模式
正在学习emwin的窗口机制,按照PC上的历程也实现了窗口移动。
只是没有开缓存设备,会有闪变效果。目前emwin通过外挂的SRAM分配了350K内存,
通过WM_SetCreateFlags(WM_CF_MEMDEV);,显示不正常。
刚开始我以为是SRAM没有配置好,但是我通过以下代码测试,完全正常。
  1. static GUI_MEMDEV_Handle RefLCD;
  2.    
  3.     RefLCD=GUI_MEMDEV_CreateEx(0,0,480,320,GUI_MEMDEV_NOTRANS);
  4.     GUI_MEMDEV_Select(RefLCD);
  5.    
  6.     GUI_SetBkColor(GUI_BLUE);
  7.     GUI_Clear();
  8.    
  9.     GUI_MEMDEV_CopyToLCD(RefLCD);
  10. //    while(1);
复制代码
当执行完GUI_MEMDEV_CopyToLCD(RefLCD);后,LCD整个屏幕就蓝色了。

然后我将emwin的缓存由外部,更换为内部sram,开了50K的缓存。
这下显示效果就正常了,而且确实没有闪变效应。然后我就不知道怎么办了....
以下是代码,请高手帮帮忙,谢谢!
  1. //显示缓存
  2. static char i8DisBuf[100];
  3. //状态栏索引
  4. static WM_HWIN i32StatusBarIndex;
  5. static WM_HWIN i32RtcIndex;
  6. static void Ui_DisString(uint32_t u32MsgAddr);
  7. /*
  8. 功能:向RTC发送消息
  9. */
  10. void Ui_Msg_Send2Rtc(void)
  11. {
  12.     WM_SendMessageNoPara(i32RtcIndex,UIMSG_REFSTR);
  13.     WM_InvalidateWindow(i32RtcIndex);
  14. }
  15. /*
  16. 功能:RTC窗口回调
  17. */
  18. static void Ui_RtcCb(WM_MESSAGE *pMsg)
  19. {
  20.     GUI_RECT Rect;
  21.     static UiStringstr sstrRtcString=
  22.     {
  23.         .u16x=0,
  24.         .u16y=0,
  25.         .string=i8DisBuf,
  26.         .u32CharColor=GUI_BLACK,
  27.         .u32BkColor=GUI_WHITE,
  28.         .EnumFont=FONT_IN_6X8,
  29.     };
  30.     switch(pMsg->MsgId)
  31.     {
  32.         case UIMSG_REFSTR:
  33.         {
  34.             
  35.             RtcDataStr strRtc=Func_RtcGetVal();
  36.             
  37.             sprintf(i8DisBuf,"%d-%02d-%02d %02d:%02d:%02d [%d]",strRtc.u16Year,strRtc.u8Month,strRtc.u8Date,
  38.             strRtc.u8Hour,strRtc.u8Min,strRtc.u8Second,strRtc.u8Week);
  39.             if(strlen(sstrRtcString.string)>23)
  40.             {
  41.                 sstrRtcString.string[22]='\0';
  42.             }
  43.             
  44.         }break;
  45.         case WM_PAINT:
  46.         {
  47. //            UI_TRACE("RTC PAINT WINDOW\r\n");
  48.             WM_GetInsideRect(&Rect);
  49.             GUI_SetBkColor(GUI_BLUE);
  50.             GUI_SetColor(GUI_YELLOW);
  51.             GUI_ClearRectEx(&Rect);
  52.             GUI_DrawRectEx(&Rect);
  53.             Ui_DisString((uint32_t)&sstrRtcString);
  54.         }break;
  55.         default:
  56.         {
  57.             WM_DefaultProc(pMsg);
  58.         }break;        
  59.     }
  60. }
  61. /*
  62. 功能:状态栏回调函数
  63. */
  64. static void Ui_StatusCb(WM_MESSAGE *pMsg)
  65. {
  66.     GUI_RECT Rect;
  67.    
  68.     switch(pMsg->MsgId)
  69.     {
  70.         case WM_PAINT:
  71.         {
  72.             WM_GetInsideRect(&Rect);
  73.             GUI_SetBkColor(GUI_WHITE);
  74.             GUI_SetColor(GUI_YELLOW);
  75.             GUI_ClearRectEx(&Rect);
  76.             GUI_DrawRectEx(&Rect);
  77.             GUI_SetColor(GUI_BLACK);
  78.             GUI_SetFont(&GUI_Font8x16);
  79.             GUI_DispStringHCenterAt("Foreground window 12435", 10, 30);
  80.         }break;
  81.         default:
  82.         {
  83.             WM_DefaultProc(pMsg);
  84.         }break;
  85.     }
  86. }
  87. /*
  88. 功能:配置状态栏
  89. */
  90. static void Ui_StatusBarCfg(void)
  91. {
  92.     i32StatusBarIndex=WM_CreateWindow(0,0,240,150,WM_CF_SHOW,Ui_StatusCb,0);
  93.     i32RtcIndex=WM_CreateWindowAsChild(0,0,150,50,i32StatusBarIndex,WM_CF_SHOW,Ui_RtcCb,0);
  94. }
  95. /*
  96. 功能:配置桌面窗口
  97. */
  98. static void Ui_DesktopCfg(void)
  99. {   
  100.     WM_SetDesktopColor(GUI_RED);
  101.     WM_SetCreateFlags(WM_CF_MEMDEV);
  102. }
  103. /*
  104. 功能:UI显示模块初始化
  105. 备注:需要在任务中初始化!
  106. */
  107. void Ui_Init(void)
  108. {
  109.     //开启CRC效验
  110.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
  111.     //初始化GUI
  112.     GUI_Init();   
  113.     //配置窗口
  114.     Ui_DesktopCfg();
  115.     Ui_StatusBarCfg();
  116.    
  117.     while(1)
  118.     {
  119.               for (int i = 0; i < 20; i++) {
  120.     WM_MoveWindow(i32StatusBarIndex, 2, 2);
  121.             WM_MoveWindow(i32RtcIndex, 2, 2);
  122.     GUI_Delay(10);
  123.   }
  124.               for (int i = 0; i < 20; i++) {
  125.     WM_MoveWindow(i32StatusBarIndex, -2, -2);
  126.             WM_MoveWindow(i32RtcIndex, -2, -2);
  127.     GUI_Delay(10);
  128.   }
  129.     }
  130. }
复制代码
回复

使用道具 举报

3

主题

19

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-1-7 21:45:46 | 显示全部楼层
既然sram初始化正常,代码逻辑也正常。那么怀疑我的gui底层驱动是不是有问题 ,研究研究...
回复

使用道具 举报

3

主题

19

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2016-1-7 22:56:26 | 显示全部楼层
最终代码定位到底层画点函数。但其实不是画点函数的问题,因为在内部sram时都正常,而在外部sram就不行。
唯一的区别是,使用外部sram也使用到了fsmc总线,猜测是PCB的原因,导致sram和lcd的fsmc需要间隔一定时间
才能稳定。
于是我修改LCD的fsmc总线配置,降低速度。

果然就正常了,那么结贴了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2016-1-8 10:22:01 | 显示全部楼层

回 kc_cec 的帖子

kc_cec:最终代码定位到底层画点函数。但其实不是画点函数的问题,因为在内部sram时都正常,而在外部sram就不行。
唯一的区别是,使用外部sram也使用到了fsmc总线,猜测是PCB的原因,导致sram和lcd的fsmc需要间隔一定时间
才能稳定。
于是我修改LCD的fsmc总线配置,降低速度。

....... (2016-01-07 22:56) 
[s:151]
回复

使用道具 举报

354

主题

2164

回帖

3231

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3231
发表于 2016-1-10 13:22:33 | 显示全部楼层

回 kc_cec 的帖子

kc_cec:最终代码定位到底层画点函数。但其实不是画点函数的问题,因为在内部sram时都正常,而在外部sram就不行。
唯一的区别是,使用外部sram也使用到了fsmc总线,猜测是PCB的原因,导致sram和lcd的fsmc需要间隔一定时间
才能稳定。
于是我修改LCD的fsmc总线配置,降低速度。

....... (2016-01-07 22:56) 
降到多少了?

能介绍一下SRAM的最后参数配置吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 06:05 , Processed in 0.267736 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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