硬汉嵌入式论坛

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

NANDFLASH基于FL-FLASHFS+EMWIN问题

[复制链接]
回帖奖励 1 个金币 回复本帖可获得 1 个金币奖励! 每人限 1 次

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2018-12-11 15:59:04 | 显示全部楼层 |阅读模式
项目要求:给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");
        }
}

回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2018-12-11 16:14:46 | 显示全部楼层
串口调试截图C:\Users\Administrator\Desktop
无标题.png
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2018-12-11 16:51:45 | 显示全部楼层
100*58的图片刷出来了,但不知道为什么我只是用fread读图片,调试串口竟然出现了“写”NANDFLASH的打印信息,而且每次上电读几次之后,图片有些像素点颜色变了,我怀疑就是那个“写”操作导致数据丢失了,但是找不到哪里执行写操作了
1.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 05:00 , Processed in 0.226982 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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