硬汉嵌入式论坛

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

[emWin] EMWIN存储设备刷图还是慢的为什么呢?

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2019-7-3 20:57:06 | 显示全部楼层 |阅读模式
用存储设备刷一张背景图还是很慢,也搞不懂是为什么?大神们能帮忙看看吗?


int main(void)
{  
GUI_MEMDEV_Handle hMem;
    Write_Through();               
    MPU_Memory_Protection();      
    Cache_Enable();               

        Stm32_Clock_Init(432,25,2,9);  
        HAL_Init();                                       
    delay_init(216);               
        uart_init(115200);                  
    KEY_Init();                 
    LED_Init();                  
    SDRAM_Init();                 
        TFTLCD_Init();               
    TP_Init();                                    
    TIM3_Init(999,107);           
    TIM4_Init(999,1079);         
    my_mem_init(SRAMIN);           
    my_mem_init(SRAMEX);           
    my_mem_init(SRAMDTCM);         
    __HAL_RCC_CRC_CLK_ENABLE();               
    WM_SetCreateFlags(WM_CF_MEMDEV);
    GUI_Init();
    WM_MULTIBUF_Enable(1);       
               
        GUI_SetBkColor(GUI_BLUE);
        GUI_Clear();       
        hMem = GUI_MEMDEV_Create(0,0,800,480);       
        GUI_MEMDEV_Select(hMem);       
        GUI_DrawBitmapEx(&bmbk2,400,240,400,240,1000,1000);
        GUI_MEMDEV_Select(0);  

    while(1)
    {

                GUI_ClearRect(0,0,800,480);
                GUI_Delay(100);
                //GUI_MEMDEV_CopyToLCDAt(hMem, 0, 0);
                GUI_MEMDEV_WriteAt(hMem, 0, 0);
                GUI_Delay(100);

}

hMem返回值0x00000004,是不是申请成功了,想刷一张800*400的背景图,但是下载到板子里,还是肉眼看到背景图从上而下刷图的效果,很奇怪,麻烦大神们帮忙看看。。。。。。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2019-7-3 20:59:09 | 显示全部楼层
估计是你的板子的硬件性能比较low,务必使用32bit SDRAM。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2019-7-3 21:15:25 | 显示全部楼层
eric2013 发表于 2019-7-3 20:59
估计是你的板子的硬件性能比较low,务必使用32bit SDRAM。

应该不low吧,STM32F767IGT6+W9825G6KH(SDRAM)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2019-7-3 21:18:30 | 显示全部楼层
不忘初_koRIM 发表于 2019-7-3 21:15
应该不low吧,STM32F767IGT6+W9825G6KH(SDRAM)

16bit不行的,性能比32bit差一倍多。
据F429,F7的LCD应用笔记,外接32位和16位SDRAM不仅仅是带宽差一倍,可以配置的主频还低很多
http://www.armbbs.cn/forum.php?m ... 2013&fromuid=58
(出处: 安富莱电子论坛)



回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2019-7-3 21:21:20 | 显示全部楼层
eric2013 发表于 2019-7-3 21:18
16bit不行的,性能比32bit差一倍多。

导致我用存储设备来刷一张背景图都会卡的原因就是这个吗?我还是RGB565的模式呢
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2019-7-4 08:55:05 | 显示全部楼层
本帖最后由 ihavedone 于 2019-7-4 08:56 编辑
不忘初_koRIM 发表于 2019-7-3 21:21
导致我用存储设备来刷一张背景图都会卡的原因就是这个吗?我还是RGB565的模式呢

应该不至于,我用的407+1M SRAM,并且还是从SPI Flash读取数据,刷一屏800x480,会看到闪一下,但不至于太慢,目测0.5s左右。
你是不是FMC刷屏延时和SDRAM延时设置太大了,或者底层刷屏函数有没有做优化?
回复

使用道具 举报

6

主题

25

回帖

43

积分

新手上路

积分
43
发表于 2019-7-4 09:43:20 | 显示全部楼层
ihavedone 发表于 2019-7-4 08:55
应该不至于,我用的407+1M SRAM,并且还是从SPI Flash读取数据,刷一屏800x480,会看到闪一下,但不至于 ...


//SDRAM初始化
void SDRAM_Init(void)
{
    u32 temp=0;
    FMC_SDRAM_TimingTypeDef SDRAM_Timing;
                                                     
    SDRAM_Handler.Instance=FMC_Bank5_6;                                  //SDRAM在BANK5,6  
    SDRAM_Handler.Init.SDBank=FMC_SDRAM_BANK1;                           //SDRAM接在BANK5上
    SDRAM_Handler.Init.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_9;     //列数量
    SDRAM_Handler.Init.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_13;          //行数量
    SDRAM_Handler.Init.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16;       //数据宽度为16位
    SDRAM_Handler.Init.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4;  //一共4个BANK
    SDRAM_Handler.Init.CASLatency=FMC_SDRAM_CAS_LATENCY_3;               //CAS为3
    SDRAM_Handler.Init.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;//失能写保护
    SDRAM_Handler.Init.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2;           //SDRAM时钟为HCLK/2=216M/2=108M=9.3ns
    SDRAM_Handler.Init.ReadBurst=FMC_SDRAM_RBURST_ENABLE;                //使能突发
    SDRAM_Handler.Init.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1;            //读通道延时
   
    SDRAM_Timing.LoadToActiveDelay=2;                                   //加载模式寄存器到激活时间的延迟为2个时钟周期
    SDRAM_Timing.ExitSelfRefreshDelay=8;                                //退出自刷新延迟为8个时钟周期
    SDRAM_Timing.SelfRefreshTime=6;                                     //自刷新时间为6个时钟周期                                 
    SDRAM_Timing.RowCycleDelay=6;                                       //行循环延迟为6个时钟周期
    SDRAM_Timing.WriteRecoveryTime=2;                                   //恢复延迟为2个时钟周期
    SDRAM_Timing.RPDelay=2;                                             //行预充电延迟为2个时钟周期
    SDRAM_Timing.RCDDelay=2;                                            //行到列延迟为2个时钟周期
    HAL_SDRAM_Init(&SDRAM_Handler,&SDRAM_Timing);  
   
    //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
    SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); //时钟配置使能
    delay_us(500);                                  //至少延时200us
    SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0);       //对所有存储区预充电
    SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);//设置自刷新次数
    //配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,
        //bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式
        //bit9为指定的写突发模式,bit10和bit11位保留位
        temp=(u32)SDRAM_MODEREG_BURST_LENGTH_1          |        //设置突发长度:1(可以是1/2/4/8)
              SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |        //设置突发类型:连续(可以是连续/交错)
              SDRAM_MODEREG_CAS_LATENCY_3           |        //设置CAS值:3(可以是2/3)
              SDRAM_MODEREG_OPERATING_MODE_STANDARD |   //设置操作模式:0,标准模式
              SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;     //设置突发写模式:1,单点访问
    SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp);   //设置SDRAM的模式寄存器
   
    //刷新频率计数器(以SDCLK频率计数),计算方法:
        //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
    //我们使用的SDRAM刷新周期为64ms,SDCLK=216/2=108Mhz,行数为8192(2^13).
        //所以,COUNT=64*1000*108/8192-20=823
        HAL_SDRAM_ProgramRefreshRate(&SDRAM_Handler,823);
}

用的也是别人的例程,也不知道改哪里。。。。。。

另外底层刷屏函数怎么优化可以具体说明一下吗?
回复

使用道具 举报

11

主题

31

回帖

64

积分

初级会员

积分
64
发表于 2019-7-4 14:11:04 | 显示全部楼层
eric2013 发表于 2019-7-3 21:18
16bit不行的,性能比32bit差一倍多。
据F429,F7的LCD应用笔记,外接32位和16位SDRAM不仅仅是带宽差一倍 ...

硬汉哥,我点击按钮后面弹出的窗口基本会延时0.5s,窗口内的控件比如列表的滚动条啥的却没啥问题,我也使能了三缓冲,硬件是RT1052+W9825G6KH,有可能是啥问题,刷图倒不会看到一行一行的刷。
回复

使用道具 举报

11

主题

31

回帖

64

积分

初级会员

积分
64
发表于 2019-7-4 14:12:30 | 显示全部楼层
有没有试过多缓冲
回复

使用道具 举报

336

主题

2042

回帖

3055

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3055
发表于 2019-7-4 15:00:41 | 显示全部楼层
会不会arm的外置晶振没有起振?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 22:47 , Processed in 0.178320 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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