野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20034|回复: 20

EMWIN使用SDRAM的空间问题

[复制链接]
发表于 2016-6-10 11:27:11 | 显示全部楼层 |阅读模式
SDRAM的首地址SDRAM_BANK_ADDR----0xD0000000
分配给EMWIN的空间大小GUI_NUMBYTES-----  (1024 * 110)

按我理解,我使用地址是((at(SDRAM_BANK_ADDR+GUI_NUMBYTES+100)))之后的地址储存数据应该就是安全的,但实际是运行过GUI_Delay之后,这部分的地址内容就会被改变.求解我是那里错了
回复

使用道具 举报

发表于 2016-6-10 11:56:16 | 显示全部楼层
你的显存是怎么分配的,有无冲突?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 12:45:35 | 显示全部楼层
GUI_NUMBYTES这里没有包括显存啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 14:02:37 | 显示全部楼层
cancore 发表于 2016-6-10 11:56
你的显存是怎么分配的,有无冲突?

#define  BUFFER_OFFSET          ((uint32_t)800*480*2)
这个是不是显存空间,整个EMWIN所占用的空间是BUFFER_OFFSET+GUI_NUMBYTES吗?
回复 支持 反对

使用道具 举报

发表于 2016-6-10 14:16:08 | 显示全部楼层
刀_口 发表于 2016-6-10 14:02
#define  BUFFER_OFFSET          ((uint32_t)800*480*2)
这个是不是显存空间,整个EMWIN所占用的空间是B ...

显存也有基地址的啊,如果基地址也是0xd0000000就重合了,必须把前面0xd0000000+2*BUFFER_OFFSET 用做显存区域,0xd0000000+2*BUFFER_OFFSET后面用做其他用途
回复 支持 反对

使用道具 举报

发表于 2016-6-10 14:26:46 | 显示全部楼层
cancore 发表于 2016-6-10 14:16
显存也有基地址的啊,如果基地址也是0xd0000000就重合了,必须把前面0xd0000000+2*BUFFER_OFFSET 用做显 ...

另外,LTDC是支持双层显示的,如果两层都打开(RGB565)就占用 2*((uint32_t)800*480*2),如果是ARGB8888就应该是 2*((uint32_t)800*480*4),这个区域都是用作显存的,剩下的空间就留给应用程序使用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 14:30:48 | 显示全部楼层
cancore 发表于 2016-6-10 14:16
显存也有基地址的啊,如果基地址也是0xd0000000就重合了,必须把前面0xd0000000+2*BUFFER_OFFSET 用做显 ...

这几句代码都是截取野火的,实际上我在项目上使用也没发现重叠,只是在想使用外部SRAM做大数组缓存时发现的问题

另外没发现有显存基址的相关宏
回复 支持 反对

使用道具 举报

发表于 2016-6-10 14:33:34 | 显示全部楼层
刀_口 发表于 2016-6-10 14:30
这几句代码都是截取野火的,实际上我在项目上使用也没发现重叠,只是在想使用外部SRAM做大数组缓存时发现的 ...

在bsp_lcd.h里边应该有如下宏定义
#define LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)
#define BUFFER_OFFSET          ((uint32_t)800*480*3)    //sdram为16位的,液晶RGB888
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 14:40:45 | 显示全部楼层
cancore 发表于 2016-6-10 14:33
在bsp_lcd.h里边应该有如下宏定义
#define LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)
#define BU ...

04. emWin_lcd_V5.28_basic
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 14:42:54 | 显示全部楼层
cancore 发表于 2016-6-10 14:33
在bsp_lcd.h里边应该有如下宏定义
#define LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)
#define BU ...

04. emWin_lcd_V5.28_basic
bsp_lcd.h
#define  LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)
#define  BUFFER_OFFSET          ((uint32_t)800*480*2)    //sdram为16位的

GUIConf.c
#define GUI_NUMBYTES  (1024 * 110)    // x KByte


GUI_NUMBYTES  没有明确写上基址是从哪里开始
回复 支持 反对

使用道具 举报

发表于 2016-6-10 14:46:57 | 显示全部楼层
刀_口 发表于 2016-6-10 14:40
04. emWin_lcd_V5.28_basic

定义一下USB_EXTMEMHEAP这个宏就可以用外部SDRAM了

外部数据

外部数据

显存

显存
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 14:54:06 | 显示全部楼层
cancore 发表于 2016-6-10 14:46
定义一下USB_EXTMEMHEAP这个宏就可以用外部SDRAM了

我是照搬例程的,USB_EXTMEMHEAP也是没定义,意思是我一直都在用内部SRAM?
回复 支持 反对

使用道具 举报

发表于 2016-6-10 14:58:04 来自手机 | 显示全部楼层
从程序来看是内部SRAM
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 15:16:06 | 显示全部楼层
cancore 发表于 2016-6-10 14:58
从程序来看是内部SRAM

好像的确是这样,感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 17:03:55 | 显示全部楼层
cancore 发表于 2016-6-10 14:58
从程序来看是内部SRAM

还有一个问题,
LCD占用空间
#define  LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)                //SDRAM起始地址
#define  BUFFER_OFFSET          ((uint32_t)800*480*2*2)                //0x177000

EMIWN占用空间
#define USB_EXTMEMHEAP 1
  #define GUI_NUMBYTES   (110 * 1024 )    // x KByte
  #define GUI_EXTBUFADD  (0xD0000000 + 0x200000)

U32 HeapMem[GUI_NUMBYTES/4] __attribute__((at(GUI_EXTBUFADD)));

按理说这样两个地址就不用重叠,但实际运行时,运行到GUI_ALLOC_AssignMemory(HeapMem, GUI_NUMBYTES);就会硬件中断
回复 支持 反对

使用道具 举报

发表于 2016-6-10 20:05:49 | 显示全部楼层
刀_口 发表于 2016-6-10 17:03
还有一个问题,
LCD占用空间
#define  LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)                //SDRAM起始地 ...

我这边在这里定义宏定义,用外部SDRAM没有问题啊,你的工程是怎么样的?
EMWIN.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-10 20:22:11 | 显示全部楼层
cancore 发表于 2016-6-10 20:05
我这边在这里定义宏定义,用外部SDRAM没有问题啊,你的工程是怎么样的?

显示没问题,但点击控件就会硬件中断,但加大EMWIN的缓存大小 反而连显示都不正常了
回复 支持 反对

使用道具 举报

发表于 2016-6-11 09:13:46 | 显示全部楼层
刀_口 发表于 2016-6-10 20:22
显示没问题,但点击控件就会硬件中断,但加大EMWIN的缓存大小 反而连显示都不正常了

我让高手来回答你了,用的就是7寸的液晶
回复 支持 反对

使用道具 举报

发表于 2016-6-11 09:21:16 | 显示全部楼层
在GUIConf.c文件,基地址是 GUI_EXTBUFADD

//
// Define the available number of bytes available for the GUI
//
#ifdef USB_EXTMEMHEAP
  #define GUI_NUMBYTES   (1024*1024*2)    // x KByte
  #define GUI_EXTBUFADD  (0xD0800000-GUI_NUMBYTES)
#else
  #define GUI_NUMBYTES  (1024 * 110)    // x KByte
#endif
/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
#ifdef USB_EXTMEMHEAP
  U32 HeapMem[GUI_NUMBYTES/4] __attribute__((at(GUI_EXTBUFADD)));
#else
  static U32 extMem[GUI_NUMBYTES / 4];
#endif
回复 支持 反对

使用道具 举报

发表于 2016-6-11 09:23:58 | 显示全部楼层
这是5、7寸屏兼容的例程
04. emWin_lcd_V5.28_basic.zip (1.96 MB, 下载次数: 143)
回复 支持 反对

使用道具 举报

发表于 2020-10-15 10:25:44 | 显示全部楼层
学习了,谢谢分享!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 15:47 , Processed in 0.040010 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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