c17 发表于 2021-12-31 23:52

国民技术N32G45X例程之-U盘模式IAP升级固件

前言
提示:21.国民技术N32G45X例程之-U盘模式IAP升级固件,本例程为作者原创,利用模拟U盘方式做固件升级,配合“国民技术N32G45X例程之-C-Free5合成BIN文件”可以适应WIN7和WIN10电脑系统,本例程使用了N32G45X内部RAM存贮FAT文件系统,大大减少FLASH的使用,最大只使用24K的FLASH空间,例程已经在成熟项目中使用。

一、准备工作
1.国民技术N32G45X提供的库
在国民技术N32G45X提供的库的USB例程中,找到Mass_Stroage_DataFlash例程,这是USB模式U盘的例程。

2.下载本作者原创BIN文件合成软件
“国民技术N32G45X例程之-C-Free5合成BIN文件”用于合成BIN文件

3.为什么要合成BIN文件?
这时因为不同的系统在识别U盘时,会在U盘中生成隐藏文件,这些隐藏文件占据了FLASH的地址,不同的系统在BIN文件拷贝到U盘时,所在的起始地址是不一样的。

合成BIN文件有一个可以识别的头信息,当U盘识别到这个头信息时,可以把BIN文件放在固定的没有被占用的FLASH地址上,这样就避免了不同系统被占用的地址不一样的问题。

例如:起始地址0X8006000
WIN7系统在识别U盘时没有隐藏文件,那正常拷贝没有加工过的BIN文件会从0X8006000开始。
WIN10系统在识别U盘是会有6K的隐藏文件,那正常拷贝没有加工过的BIN文件会从0X8007800开始。

这时如果是合成BIN文件会有一个头信息,在拷贝BIN文件时如果识别到这个头信息,就把BIN文件都从起始地址0X8007800开始存,这样就避免了上面的问题。
————————————————

c17 发表于 2021-12-31 23:55

二、U盘模式IAP升级实现之读写
1.宏定义之一次读写大小512字节
代码如下(示例、
#defineFLASH_PAGE_SIZE      0x200       // 2K per page N32G435一页2K

c17 发表于 2021-12-31 23:56

为什么是512字节,N32G45X是2K,这里要说明只是读写,N32G45X是2K一页只是在擦除的时候要一次2K,所以会在擦除的时候处理成2K一次。

定义读写大小为512字节,是因为FAT文件系统是以512字节做为数据存在,这样可以减少在电脑识别U盘时隐藏文件占用FLASH的大小。
比如,如果读写2K,在WIN10识别U盘时会有6K的占用,如果是512字节,就只有2K不到的占用。

c17 发表于 2021-12-31 23:57

定义RAM大小用于存贮FAT文件系统
代码如下(示例):
这里要说明一点:
如果定义读写大小2K,在WIN7下文件系统是20K, WIN10系统下是24K。
如果定义读写大小为512字节,在WIN7下文件系统是20K, WIN10系统下是21.5K。
所以预留22K空间。

uint32_tFatRam; //FAT预留22K的RAM

c17 发表于 2021-12-31 23:57

3.FAT文件系统识别写入RAM
代码如下(示例):
说明:虽然我们把FAT文件系统存在RAM中,但是在地址还是会按FLASH偏移。也就是Memory_Offset偏移地址

c17 发表于 2021-12-31 23:58

                //文件系统部分:Memory_Offset = 0x0000~0X5400共21K
                //写入RAM中。
       if(Memory_Offset<FAT_ADDR)
       {   
            for( i = 0; i < Transfer_Length; i+=4 )
            {
                wrteAdr = Memory_Offset/4 + (i>>2);
                FatRam = Writebuff;
            }

            Basic_Offset =0;
            Basic_Flag =0;
            
       }

shipeng1989 发表于 2022-1-1 15:25

本帖最后由 shipeng1989 于 2022-1-1 15:28 编辑

巧了我的U盘IAP也是划拨了24K空间,我做了两个盘符一个给片内FLASH另一个给SPI FLASH。另外我干脆把FAT文件系统加载到RAM都省了。如果Windows要读DBR、FAT表和根目录区直接到flash拿数据丢给它,他如果要写FAT表区或根目录区的数据则不做任何操作直接告诉他写入成功了。
另外关于Windows强行往U盘写入隐藏文件的操作也很好对付,你只要把这些隐藏文件的文件目录都存到根目录区,并将隐藏文件文件的起始簇指向几个根本不存在的簇:例如我的2,3,4三个簇都是假的他的隐藏文件起始簇指向的就是这三个簇(我的簇大小是2048刚好是一个FLASH页),我的APP数据是从第5簇开始的,整个FAT文件系统算下来在BOOTLOADER中没有超过1K。令我意外的是Windows这个傻白甜自己居然复制了一套一模一样的模拟U盘的全盘数据到他的内存,你往模拟U盘中写入文件的时候他copy的全盘内存数据也会同步改写和正常的U盘操作无任何异样,并且不会因为和你当前的真实U盘数据不一致而报错。有兴趣咱还可以深入讨论一下。
页: [1]
查看完整版本: 国民技术N32G45X例程之-U盘模式IAP升级固件