请教下,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;
}
} |