|
项目要求:给NANDFALSH做了RL-FLASHFS文件系统,同时使用EMWIN,通过RL-USB模拟U盘,在PC端将MBP图片导入到模拟的U盘,关闭模拟U盘后,在429上通过文件系统读取该图片,通过EMWIN在屏幕上刷图片,,
问题现象:PC端能正确识别模拟好的U盘,初始化等都没问题,但在429上读取图片再用EMWIN刷图时,老是进入硬件错误Enter HardFault_Handler, System Halt.
100*50的图片,有时候能成功显示,有时候不行,800*480每次都失败。哪位大神做过leisi
附上关键代码:(前面的while(1)是为了方便格式化和模拟U盘用的,图片通过PC端复制进去之后不再用,,,测试代码)
void MainTask(void)
{
uint8_t cmd;
uint8_t ucUSBInit = 0;
FILE *fin;
uint8_t result;
while(1)
{
if (comGetChar(COM1, &cmd)) /* 从串口读入一个字符(非阻塞方式) */
{
printf("\r\n");
switch (cmd)
{
case '0':
printf("【0 - ViewNandCapacity】\r\n");
ViewNandCapacity(); /* 低级格式化,显示NAND Flash容量和剩余容量 */
break;
case 'a':
printf("【a - OpenUSB Device】\r\n");
printf("注意,NAND挂载期间,不可操作其它命令,要卸载后才可以操作!!\r\n");
mc0 = ioc_getcb ("N0:");
if (ioc_init (mc0) == 0)
{
ioc_read_info (&info, mc0);
if(ucUSBInit == 0)
{
/* 仅需初始化一次即可,否则重复初始化三次会进入硬件异常 */
usbd_init();
ucUSBInit = 1;
}
usbd_connect(__TRUE); /* USB设备连接 */
printf("NAND挂载成功\r\n");
}
else
{
printf("NAND挂载失败\r\n");
}
break;
case 'b':
printf("【b - CloseUSB Device】\r\n");
usbd_connect (__FALSE);
/*
1. 此函数加不加意义都不大, 加上的话,下次重连时间稍长,有时候还会有连接不上的情况
,
特别是拔掉过一次USB线的情况下。
2. 如果不加上的话,在拔掉USB的情况下,再次连接USB,使用函数usbd_configured会误判
,
返回已经连接上了。
*/
//usbd_reset_core();
if(ioc_uninit (mc0) != NULL)
{
printf("卸载NAND失败\r\n");
}
else
{
printf("卸载NAND成功\r\n");
}
break;
case 'c':
goto main_prog;
break;
default:
break;
}
}
}
main_prog:
result = finit("N0:");
if(result != NULL)
{
printf("挂载文件系统失败\r\n");
result = funinit("N0:");
if(result != NULL)
{
printf("卸载文件系统失败\r\n");
}
else
{
printf("卸载文件系统成功\r\n");
}
}
else
{
printf("挂载文件系统成功\r\n");
}
/* 初始化 */
GUI_Init();
/* 设置字体,文本模式和前景色 */
GUI_SetFont(&GUI_Font24B_ASCII);
GUI_SetTextMode(GUI_TM_TRANS);
GUI_SetColor(GUI_RED);
/*
关于多缓冲和窗口内存设备的设置说明
1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
WM_MULTIBUF_Enable(1);
2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
4. 所有emWin例子默认是开启三缓冲。
*/
WM_MULTIBUF_Enable(1);
Show_Bmp("1.bmp");
// FlashFS_Nandflash_op();
}
void Show_Bmp(unsigned char *pic_dir)
{
GUI_MEMDEV_Handle hMemBMP;
uint32_t t0, t1, i, count = 0;
char buf[50];
GUI_DispStringAt("Load BMP File to Memory Devices....", 10, 10);
/* 加载BMP图片到内存设备 */
hMemBMP = _ShowBMP2(pic_dir, 0, 0);
/*刷新20次,串口打印速度数值,时间单位ms */
for(i = 0; i < 1; i++)
{
t0 = GUI_GetTime();
/* 用到BMP图片的时候,调用此函数即可 */
GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
t1 = GUI_GetTime() - t0;
printf("速度 = %dms\r\n", t1);
count += t1;
}
/* 求出刷新20次的平均速度 */
sprintf(buf, "speed = %dms/frame", count/i);
GUI_DispStringAt(buf, 10, 10);
}
GUI_HMEM _ShowBMP2(const char *sFilename, int x, int y)
{
u8 *_acBuffer;
int XSize, YSize;
uint32_t bw = 0;
FILE *fin;
FINFO info;
unsigned char result = 0;
u32 bmp_size;
u32 i = 0;
GUI_HMEM hMem;
GUI_MEMDEV_Handle hMemBMP;
info.fileID = 0;
result = ffind ((const char *)sFilename, &info);
if(result==0)
{
printf("找到文件\r\n");
printf("文件大小为%d\r\n",info.size);
printf("文件名%s\r\n",info.name);
printf("文件ID = %d\r\n",info.fileID);
}
else
{
printf("未找到文件\r\n");
}
bmp_size = info.size/NAND_PAGE_SIZE;
bmp_size += 1;
/* 打开文件 */
fin = fopen(sFilename,"r");
if (fin != NULL)
{
printf("打开图片成功\r\n");
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(info.size);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer = GUI_ALLOC_h2p(hMem);
/* 读数据 */
if(bmp_size==1)
{
bw = fread(_acBuffer, 1, info.size, fin);
}
else
{
for(i=0;i<bmp_size;i++)
{
bw += fread(_acBuffer, 1, NAND_PAGE_SIZE, fin);
printf("bw = %d\r\n",bw);
_acBuffer += NAND_PAGE_SIZE;
info.size -= NAND_PAGE_SIZE;
if(info.size<NAND_PAGE_SIZE)
{
bw += fread(_acBuffer, 1, info.size, fin);
}
}
}
printf("bmp_size = %d\r\n",bmp_size);
bsp_DelayMS(200);
XSize = GUI_BMP_GetXSize(_acBuffer);
YSize = GUI_BMP_GetYSize(_acBuffer);
printf("XSize = %d\r\n",XSize);
printf("YSize = %d\r\n",YSize);
printf("bw = %d\r\n",bw);
if(bw == info.size)
{
printf("读内容成功\r\n");
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);
/* 关闭文件 */
fclose(fin);
result = funinit("N0:");
if(result != NULL)
{
printf("卸载文件系统失败\r\n");
}
else
{
printf("卸载文件系统成功\r\n");
}
return hMemBMP;
}
else
{
printf("读内容失败\r\n");
fclose(fin);
}
}
else
{
printf("打开文件失败\r\n");
}
/* 卸载NAND Flash */
result = funinit("N0:");
if(result != NULL)
{
printf("卸载文件系统失败\r\n");
}
else
{
printf("卸载文件系统成功\r\n");
}
}
|
|