|
本帖最后由 hpdell 于 2018-3-14 21:35 编辑
请教下,使用emwin 显示bmp图片时,有时显示出现硬件错误?是怎么个情况啊 ?
程序如下:
/*
*********************************************************************************************************
* 函 数 名: _ShowBMP2
* 功能说明: 显示BMP图片
* 形 参: sFilename 要读取的文件名
* x 要显示的x轴坐标位置
* y 要显示的y轴坐标位置
* 返 回 值: 返回绘制了BMP图片的内存设备句柄。
*********************************************************************************************************
*/
GUI_HMEM _ShowBMP2(const char *sFilename, int x, int y)
{
FRESULT result;
UINT bw;
char *_acBuffer;
int XSize, YSize;
GUI_HMEM hMem;
GUI_MEMDEV_Handle hMemBMP;
/* 打开文件 */
result = f_open(&BMP_File, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
if (result != FR_OK)
{
return 0;
}
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(BMP_File.obj.objsize);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer = GUI_ALLOC_h2p(hMem);
/* 读取文件到动态内存 */
result = f_read(&BMP_File, _acBuffer, BMP_File.obj.objsize, &bw);
if (result != FR_OK)
{
return 0;
}
XSize = GUI_BMP_GetXSize(_acBuffer);
YSize = GUI_BMP_GetYSize(_acBuffer);
/* 创建内存设备,并将BMP图片绘制到此内存设备里面,此内存设备要在主程序中用到
所以退出此函数前,不要释放。
*/
hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
GUI_MEMDEV_Select(hMemBMP);
GUI_BMP_Draw(_acBuffer, 0, 0);
GUI_MEMDEV_Select(0);
/* 释放动态内存hMem */
GUI_ALLOC_Free(hMem);
/* 关闭文件 */
f_close(&BMP_File);
return hMemBMP;
}
void GUI_BMP_DrawShow(const char *FileName, U16 _usX, U16 _usY)
{
GUI_MEMDEV_Handle hMemBMP;
uint32_t t0 = 0, t1 = 0;
char buf[50];
GUI_DispStringAt("Load BMP File to Memory Devices....", 10, 10);
/* 加载BMP图片到内存设备 */
hMemBMP = _ShowBMP2(FileName, 0, 0);
#if 1
t0 = GUI_GetTime();
// 用到BMP图片的时候,调用此函数即可
GUI_MEMDEV_WriteAt(hMemBMP, _usX, _usY);
t1 = GUI_GetTime() - t0;
printf("速度 = %dms\r\n", t1);
sprintf(buf, "speed = %dms/frame", t1);
#else
{
uint32_t i, count = 0;
//刷新20次,串口打印速度数值,时间单位ms
for(i = 0; i < 20; i++)
{
t0 = GUI_GetTime();
// 用到BMP图片的时候,调用此函数即可
GUI_MEMDEV_WriteAt(hMemBMP, _usX, _usY);
t1 = GUI_GetTime() - t0;
printf("速度 = %dms\r\n", t1);
count += t1;
}
/* 求出刷新20次的平均速度 */
sprintf(buf, "speed = %dms/frame", count/i);
}
#endif
GUI_DispStringAt(buf, 10, 50);
}
int main(void)
{
/* BMP图片显示方式一:做到15ms一帧,实际项目强烈推荐 */
#if defined Method1
{
GUI_BMP_DrawShow("0 icture/bmp/1024x600-6.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/320x480_32.bmp", (1024-320)/2, (600-480)/2);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/680x480_24.bmp", (1024-680)/2, (600-480)/2); //屏幕中间显示
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/480x272_1.bmp", (1024-480)/2, (600-272)/2);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/480x272_4.bmp", (1024-480)/2, (600-272)/2);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/480x320_rgb565_16bit.bmp", (1024-480)/2, (600-320)/2);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/1024x600-rgb888-24bit-2.bmp", 0, 0); //xx
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawExShow("0 icture/bmp/480x320_rgb555_16bit.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/480x320_rgb444_16bit.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0 icture/bmp/480x320_rgb8888_32bit_X.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0:Picture/bmp/480x272_rgb555_b_16bit.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0:Picture/bmp/A4R4G4B4.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0:Picture/bmp/480x272_rgb555_a_16bit.bmp", 0, 0); // xx
GUI_Delay(50);
GUI_Clear();
GUI_BMP_DrawShow("0:Picture/bmp/A1R5G5B5.bmp", 0, 0);
GUI_Delay(50);
GUI_Clear();
}
}
上术显示的bmp图片,出现死机的位置没有固定的, 王大侠指点指点迷津 ?!!
// 错误会进入到这里来 ??????????????????
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
printf("HardFault_Handler Error ??????? \r\n");
/* USER CODE END HardFault_IRQn 0 */
while (1)
{
}
/* USER CODE BEGIN HardFault_IRQn 1 */
/* USER CODE END HardFault_IRQn 1 */
}
|
|