打印
[综合信息]

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

[复制链接]
669|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
c17|  楼主 | 2021-12-31 23:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言
提示: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字节
代码如下(示例、
#define  FLASH_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_t  FatRam[22*256]; //FAT预留22K的RAM

使用特权

评论回复
5
c17|  楼主 | 2021-12-31 23:57 | 只看该作者
3.FAT文件系统识别写入RAM
代码如下(示例):
说明:虽然我们把FAT文件系统存在RAM中,但是在地址还是会按FLASH偏移。也就是Memory_Offset偏移地址

使用特权

评论回复
6
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[wrteAdr] = Writebuff[i>>2];  
            }

            Basic_Offset =0;
            Basic_Flag =0;
            
       }

使用特权

评论回复
7
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盘数据不一致而报错。有兴趣咱还可以深入讨论一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

39

主题

311

帖子

1

粉丝