打印

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

[复制链接]
294|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
你画我瞎|  楼主 | 2018-8-8 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教下,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;
        }
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

395

主题

395

帖子

0

粉丝