硬汉嵌入式论坛

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

[STM32H7] 请教下,h7 的 mpu 的 sdram 设置影响到 emwin bmp 显示问题 ?

[复制链接]

615

主题

3078

回帖

4943

积分

至尊会员

积分
4943
发表于 2019-6-17 10:15:27 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2019-6-17 10:30 编辑

请教下,h7 的 mpu 的 sdram 设置影响到 emwin bmp 显示问题 ?

具体如下:
mpu 的sdram 设置

// 方法 1
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0xC00000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_32MB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
        HAL_MPU_ConfigRegion(&MPU_InitStruct);



// 方法 2
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0xC00000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_32MB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;  
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
        HAL_MPU_ConfigRegion(&MPU_InitStruct);



上述2个方法中,使用
方法 1,使用emwin 解码并显示 bmp 图片正常
方法2, 使用emwin 解码并显示 bmp 图片 不正常,貌似根本就显示不出来 ??????

这是何故啊 ??

除了这个 mpu 配置有点差别外,其他程序都没有做任何更改的

emwin bmp 读取函数
使用内存设备显示的

uint8_t  *_acBufferPtr = NULL;
uint8_t  * _rx_BmpBuff = NULL;
GUI_MEMDEV_Handle hMemBMP_Bk = NULL;

/*
*********************************************************************************************************
*        函 数 名: _ShowBMP2
*        功能说明: 显示BMP图片,加载到内存后显示
*        形    参: sFilename  要读取的文件名
*           SetBkPicture   BMP_NO_BK_PICTURE不设置为背景图片,BMP_BK_PICTURE设置为背景图片
*        返 回 值: 返回绘制了BMP图片的内存设备句柄。
*********************************************************************************************************
*/

GUI_HMEM _ShowBMP2(const char *sFilename, _BMP_BkPictTpyeDef SetBkPicture)
{
  FRESULT result;
        FIL  BMP_File;
  UINT    bw;
        int XSize, YSize;

       
       
        /* 打开文件 */               
        result = f_open(&BMP_File, sFilename, FA_READ);
        if (result != FR_OK)
        {
                return 0;
        }

        // 申请一块内存空间
        _acBufferPtr = GUI_MYmalloc(BMP_File.obj.objsize);
        if(_acBufferPtr == NULL) return 0;
       
        vTaskSuspendAll(); /* 禁止任务调度 */
        _rx_BmpBuff = _acBufferPtr;
       
        /* 读取文件到动态内存 */
        result = f_read(&BMP_File, _rx_BmpBuff, BMP_File.obj.objsize, &bw);
        if (result != FR_OK)
        {
                GUI_MYfree((void *)_acBufferPtr);
    xTaskResumeAll (); /* 恢复任务调度 */
                return 0;
        }
        xTaskResumeAll (); /* 恢复任务调度 */
       
  _rx_BmpBuff = _acBufferPtr;
        XSize = GUI_BMP_GetXSize(_rx_BmpBuff);
        _rx_BmpBuff = _acBufferPtr;
        YSize = GUI_BMP_GetYSize(_rx_BmpBuff);
       
        /* 创建内存设备,并将BMP图片绘制到此内存设备里面,此内存设备要在主程序中用到
           所以退出此函数前,不要释放。
        */
        if(SetBkPicture == BMP_NO_BK_PICTURE)
        {
                hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
                GUI_MEMDEV_Select(hMemBMP);
        }
        else
        {
                if(hMemBMP_Bk != NULL)
                {
                        GUI_MEMDEV_Delete(hMemBMP_Bk); //如果之前有使用过,则先删除图片内存,之后再重新创建,这样可以重复使用
                        hMemBMP_Bk = NULL;
                }
                hMemBMP_Bk = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
                GUI_MEMDEV_Select(hMemBMP_Bk);       
        }
        _rx_BmpBuff = _acBufferPtr;
        GUI_BMP_Draw(_rx_BmpBuff, 0, 0);
        GUI_MEMDEV_Select(0);
       
        /* 关闭文件 */
        f_close(&BMP_File);

                /* 释放动态内存hMem */
                GUI_MYfree((void *)_acBufferPtr);       
       
        if(SetBkPicture == BMP_NO_BK_PICTURE)
        {
          return hMemBMP;
        }
        else
        {       
                return hMemBMP_Bk;
        }
}











回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-6-17 10:27:52 | 显示全部楼层
主要还是cache的问题
回复

使用道具 举报

615

主题

3078

回帖

4943

积分

至尊会员

积分
4943
 楼主| 发表于 2019-6-17 10:30:52 | 显示全部楼层
本五心 发表于 2019-6-17 10:27
主要还是cache的问题

估计应该有可能是这个问题吧
回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-6-17 10:52:46 | 显示全部楼层
本帖最后由 本五心 于 2019-6-17 11:09 编辑
hpdell 发表于 2019-6-17 10:30
估计应该有可能是这个问题吧

前段时间我也在倒腾这个问题,不开CACHE话,什么问题都没有,但是速度和F4基本上一个级别的。要是速度和F4一样,那还不如用F4得了,所以这cache还得开。可是一开起cache,有时候你可能增减一些无关代码,都会影响到显示。给楼主几点建议,也是那几天我查资料瞎摸索的,不对的话还请其他坛友指出。
1、整个系统彻底关掉cache,不是说只关掉sdram就行(这种情况,性能下降难以接受,不建议使用)。
2、dma传输前,先clear一下,以保证数据写到真实的物理地址中去。
3、dma传输完后,invalidate一下。直接去真实的物理地址去读,更新cache
4、emwin要使用cache的话,参考一下38章第小节。

回复

使用道具 举报

615

主题

3078

回帖

4943

积分

至尊会员

积分
4943
 楼主| 发表于 2019-6-17 11:12:56 | 显示全部楼层
本五心 发表于 2019-6-17 10:52
前段时间我也在倒腾这个问题,不开CACHE话,什么问题都没有,但是速度和F4基本上一个级别的。要是速度和F ...

好的,我去查看查看一下,多谢多谢啊
回复

使用道具 举报

615

主题

3078

回帖

4943

积分

至尊会员

积分
4943
 楼主| 发表于 2019-6-17 11:21:30 | 显示全部楼层
本五心 发表于 2019-6-17 10:52
前段时间我也在倒腾这个问题,不开CACHE话,什么问题都没有,但是速度和F4基本上一个级别的。要是速度和F ...

你好,你说的 38 章 是哪个资料上面的 第 38 章啊 ??
回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-6-17 13:28:00 | 显示全部楼层
hpdell 发表于 2019-6-17 11:21
你好,你说的 38 章 是哪个资料上面的 第 38 章啊 ??

enwin手册
回复

使用道具 举报

615

主题

3078

回帖

4943

积分

至尊会员

积分
4943
 楼主| 发表于 2019-6-17 16:23:58 | 显示全部楼层

好的,多谢多谢啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 07:13 , Processed in 0.169777 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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