硬汉嵌入式论坛

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

[emWin] emwin三缓冲问题

[复制链接]

12

主题

32

回帖

68

积分

初级会员

积分
68
发表于 前天 16:57 | 显示全部楼层 |阅读模式
本帖最后由 dirty_data 于 2026-3-24 17:09 编辑

使用32位sdram时,三缓冲可以正常使用,但改为16位16m大小的sdram并移植过去后,三缓冲不能正常工作了,sdram可以正常使用。以下是一些宏配置。
[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]sdram.h
#define Bank5_SDRAM_ADDR    ((uint32_t)(0XC0000000))  /* SDRAM开始地址 */
#define EXT_SDRAM_ADDR          ((uint32_t)0xC0000000)
#define EXT_SDRAM_SIZE                (16 * 1024 * 1024)/* LCD显存,第1页, 分配4M字节 */
#define SDRAM_LCD_BUF1                 EXT_SDRAM_ADDR/* LCD显存,第2页, 分配4M字节 */
#define SDRAM_LCD_BUF2                (EXT_SDRAM_ADDR + SDRAM_LCD_SIZE)
#define SDRAM_LCD_SIZE                (4 * 1024 * 1024)                /* 每层4M */
#define SDRAM_LCD_LAYER                2                                                /* 2层 *//* 剩下的8M字节,提供给应用程序使用 */
#define SDRAM_APP_BUF                (EXT_SDRAM_ADDR + SDRAM_LCD_SIZE * SDRAM_LCD_LAYER)
#define SDRAM_APP_SIZE                (EXT_SDRAM_SIZE - SDRAM_LCD_SIZE * SDRAM_LCD_LAYER)
malloc.c
static __align(32) uint8_t mem3base[MEM3_MAX_SIZE] __attribute__((at(0XC0600000)));                           /* 外部SDRAM内存池
static MT_TYPE mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0XC0600000 + MEM3_MAX_SIZE)));            /* 外部SRAM内存池MAP */
malloc.h
/* mem3内存参数设定.mem3的内存池处于外部SDRAM里面 */
#define MEM3_BLOCK_SIZE         64                             /* 内存块大小为64字节 */
#define MEM3_MAX_SIZE           8*1024*1024                    /* 最大管理内存 */
#define MEM3_ALLOC_TABLE_SIZE   MEM3_MAX_SIZE/MEM3_BLOCK_SIZE  /* 内存表大小 */
GUIDRV_Lin_Template.c
#define XSIZE_PHYS              1024             /* 最大支持1280 * 800 */
#define YSIZE_PHYS              600
#define NUM_BUFFERS             3               /* 使用多缓冲时的缓冲数量 */
#define NUM_VSCREENS            1               /* 使用虚拟屏幕是的虚拟屏幕数量 */
#define BK_COLOR GUI_DARKBLUE
#undef  GUI_NUM_LAYERS
#define GUI_NUM_LAYERS          1
#define COLOR_CONVERSION_0      GUICC_M565      
#define DISPLAY_DRIVER_0        GUIDRV_LIN_16
#ifndef   NUM_VSCREENS  
#define NUM_VSCREENS 1
#define LCD_LAYER0_FRAME_BUFFER  EXT_SDRAM_ADDR     /* 第一层缓冲区 */
#define LCD_LAYER1_FRAME_BUFFER  ((uint32_t)(0xC0000000+1024*600*2*NUM_VSCREENS * NUM_BUFFERS))     /* 第二层缓冲区 */

回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 前天 17:03 | 显示全部楼层

emwin三缓冲问题

本帖最后由 dirty_data 于 2026-3-24 17:11 编辑

使用32位sdram时,三缓冲可以正常使用,但改为16位16m大小的sdram并移植过去后,三缓冲不能正常工作了,sdram可以正常使用。以下是一些宏配置。
[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]sdram.h
#define Bank5_SDRAM_ADDR    ((uint32_t)(0XC0000000))  /* SDRAM开始地址 */
#define EXT_SDRAM_ADDR          ((uint32_t)0xC0000000)
#define EXT_SDRAM_SIZE                (16 * 1024 * 1024)/* LCD显存,第1页, 分配4M字节 */
#define SDRAM_LCD_BUF1                 EXT_SDRAM_ADDR/* LCD显存,第2页, 分配4M字节 */
#define SDRAM_LCD_BUF2                (EXT_SDRAM_ADDR + SDRAM_LCD_SIZE)
#define SDRAM_LCD_SIZE                (4 * 1024 * 1024)                /* 每层4M */
#define SDRAM_LCD_LAYER                2                                                /* 2层 *//* 剩下的8M字节,提供给应用程序使用 */
#define SDRAM_APP_BUF                (EXT_SDRAM_ADDR + SDRAM_LCD_SIZE * SDRAM_LCD_LAYER)
#define SDRAM_APP_SIZE                (EXT_SDRAM_SIZE - SDRAM_LCD_SIZE * SDRAM_LCD_LAYER)
malloc.c
static __align(32) uint8_t mem3base[MEM3_MAX_SIZE] __attribute__((at(0XC0600000)));                           /* 外部SDRAM内存池
static MT_TYPE mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0XC0600000 + MEM3_MAX_SIZE)));            /* 外部SRAM内存池MAP */
malloc.h
/* mem3内存参数设定.mem3的内存池处于外部SDRAM里面 */
#define MEM3_BLOCK_SIZE         64                             /* 内存块大小为64字节 */
#define MEM3_MAX_SIZE           8*1024*1024                    /* 最大管理内存 */
#define MEM3_ALLOC_TABLE_SIZE   MEM3_MAX_SIZE/MEM3_BLOCK_SIZE  /* 内存表大小 */
GUIDRV_Lin_Template.c
#define XSIZE_PHYS              1024             /* 最大支持1280 * 800 */
#define YSIZE_PHYS              600
#define NUM_BUFFERS             3               /* 使用多缓冲时的缓冲数量 */
#define NUM_VSCREENS            1               /* 使用虚拟屏幕是的虚拟屏幕数量 */
#define BK_COLOR GUI_DARKBLUE
#undef  GUI_NUM_LAYERS
#define GUI_NUM_LAYERS          1
#define COLOR_CONVERSION_0      GUICC_M565      
#define DISPLAY_DRIVER_0        GUIDRV_LIN_16
#ifndef   NUM_VSCREENS  
#define NUM_VSCREENS 1
#define LCD_LAYER0_FRAME_BUFFER  EXT_SDRAM_ADDR     /* 第一层缓冲区 */
#define LCD_LAYER1_FRAME_BUFFER  ((uint32_t)(0xC0000000+1024*600*2*NUM_VSCREENS * NUM_BUFFERS))     /* 第二层缓冲区 */
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121730
QQ
发表于 昨天 09:30 | 显示全部楼层
最主要的是那个LTDC行中断处理,方便的话,贴代码看下
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-26 04:53 , Processed in 0.325277 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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