硬汉嵌入式论坛

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

[emWin] 请教下,使用emwin 显示bmp图片时,有时显示出现硬件错误?

[复制链接]

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
发表于 2018-3-14 21:19:00 | 显示全部楼层 |阅读模式
本帖最后由 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("0icture/bmp/1024x600-6.bmp", 0, 0);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/320x480_32.bmp", (1024-320)/2, (600-480)/2);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/680x480_24.bmp", (1024-680)/2, (600-480)/2);  //屏幕中间显示
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/480x272_1.bmp", (1024-480)/2, (600-272)/2);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/480x272_4.bmp", (1024-480)/2, (600-272)/2);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/480x320_rgb565_16bit.bmp", (1024-480)/2, (600-320)/2);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/1024x600-rgb888-24bit-2.bmp", 0, 0);  //xx
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawExShow("0icture/bmp/480x320_rgb555_16bit.bmp", 0, 0);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/bmp/480x320_rgb444_16bit.bmp", 0, 0);
       GUI_Delay(50);
       GUI_Clear();
       GUI_BMP_DrawShow("0icture/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 */
}






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-3-15 01:48:53 | 显示全部楼层
估计底层移植的不好,另外就是确定你的外部存储器是否稳定好用。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-3-15 09:26:40 | 显示全部楼层
本帖最后由 hpdell 于 2018-3-15 09:27 编辑
eric2013 发表于 2018-3-15 01:48
估计底层移植的不好,另外就是确定你的部存储器简单好用。

我 的内存 ram 还没有测试,等会我测试看看,

另外,如果我使用内部的 ram 不会出现死机的情况,那么是不是说明我的 外部 sdram 有问题 ?

目前我的 外部 sdram 测试是没有问题的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-3-16 02:29:06 | 显示全部楼层
hpdell 发表于 2018-3-15 09:26
我 的内存 ram 还没有测试,等会我测试看看,

另外,如果我使用内部的 ram 不会出现死机的情况,那么 ...

这种情况的确是好些人都问过,跟你的情况一样。可以适当降低LTDC和SDRAM的GPIO速度等级看看。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-3-17 13:02:20 | 显示全部楼层
eric2013 发表于 2018-3-16 02:29
这种情况的确是好些人都问过,跟你的情况一样。可以适当降低LTDC和SDRAM的GPIO速度等级看看。

终于彻底的搞定了,原因是任务的优先级比较低,还有一个就是在读取sd卡里面的数据时,需要加上调度所,

现在不会出现硬件中断错误了,
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 15:20 , Processed in 0.231497 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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