如果用的MCU有USB接口,那么使用模拟U盘升级程序,不失为一个好办法,因为

第1,模拟U盘,不需要驱动,也不需要上位机,现场操作非常方便,

第2,USB传输速度快,升级过程耗时少,且可靠。

这项技术的难点在于FAT16文件系统,因为STM32并没有真正的实现一个FAT文件系统,一切都是模拟的,这要求研发者对FAT16文件系统认识的非常深刻。下面为FAT16系统的简易结构图:

1DBR引导扇区

首先是DBR引导扇区,这里面保存着很多参数,这个不要求 每个参数都弄懂,这个数据也可以直接从一个小U盘中用winhex软件读出来使用,我用的是

const uint8_t FAT16_BootSector[FATBootSize]= 
{
    0xEB,           /*00 - BS_jmpBoot */
    0x3C,           /*01 - BS_jmpBoot */
    0x90,           /*02 - BS_jmpBoot */
    'M','S','D','O','S','5','.','0',    /* 03-10 - BS_OEMName */
    0x00,           /*11 - BPB_BytesPerSec = 2048 */
    0x08,           /*11 - BPB_BytesPerSec = 2048 */
    0x04,           /*13 - BPB_Sec_PerClus = 2K*4 = 8K*/
    2,              /*14 - BPB_RsvdSecCnt = 2 */
    0,              /*15 - BPB_RsvdSecCnt = 2 */
    2,              /*16 - BPB_NumFATs = 2 */
    0x0,            /*17 - BPB_RootEntCnt = 512 */
    0x2,            /*18 - BPB_RootEntCnt = 512 */
    0,              /*19 - BPB_TotSec16 = 0 */
    0,              /*20 - BPB_TotSec16 = 0 */
    0xF8,           /*21 - BPB_Media = 0xF8 */
    0x0D,           /*22 - BPBFATSz16 = 0x000D */
    0,              /*23 - BPBFATSz16 = 0x000D */
    0x3F,           /*24 - BPB_SecPerTrk = 0x003F */
    0,              /*25 - BPB_SecPerTrk = 0x003F */
    0xFF,           /*26 - BPB_NumHeads = 255 */
    0,              /*27 - BPB_NumHeads = 255 */
    0,              /*28 - BPB_HiddSec = 0 */
    0,              /*29 - BPB_HiddSec = 0 */
    0,              /*30 - BPB_HiddSec = 0 */
    0,              /*31 - BPB_HiddSec = 0 */
    0x00,           /*32 - BPB_TotSec32 = */
    0xC8,           /*33 - BPB_TotSec32 = 0x0000C800 100Mb*/
    0x00,           /*34 - BPB_TotSec32 = */
    0x00,           /*35 - BPB_TotSec32 = */
    0x80,           /*36 - BS_DrvNum = 0x80 */
    0,              /*37 - BS_Reserved1 = 0 , dirty bit = 0*/ /* Updated from FSL*/
    0x29,           /*38 - BS_BootSig = 0x29 */
    0xBD,           /*39 - BS_VolID = 0x02DDA5BD */
    0xA5,           /*40 - BS_VolID = 0x02DDA5BD */
    0xDD,           /*41 - BS_VolID = 0x02DDA5BD */
    0x02,           /*42 - BS_VolID = 0x02DDA5BD */
    'N','O',' ','N','A','M','E',' ',' ',' ',' ',  /*43-53 - BS_VolLab */
    'F','A','T','1','6',' ',' ',' '   /*54-61 - BS_FilSysType */
};

实时证明最后的55 AA不要也是可以的。

2。FAT文件分区表

FAT16文件分区表,其实就是一个链表结构,下面描述了2个文件使用的簇号分布。(顾名思义,FAT16使用16bit表示簇号)

文件1:  3  5

文件2: 4 6 7 8 9 10 11 12 13 14

3根目录

根目录也可重要,FAT32是没有根目录了,因为FAT32把根目录也当成文件存储到数据区了, 下图为目录项的定义,

读文件的过程就是先找到文件,确定文件的首簇号,在FAT表中找到首簇号对应的链表,就可以依次把此文件所有的内容读出来了。

参考程序USB固件升级_像U盘一样升级程序.zip-嵌入式文档类资源-CSDN下载转自amobbs,版权归原作者所有

启动扇区 Boot Sector

在没有分区表的设备中,第一个扇区是启动扇区,包含了访问该磁盘分卷所需的基本信息,扇区数据解释如下,注意,除文本和特殊数据外,其余数据均按照小段格式存储:

偏移(字节) 长度(字节) 典型值 说明
0x00 3 EB 3C 90 x86 跳转指令,JMP 003E NOP
0x08 8 MSDOS5.0 OEM 名称,空格补齐不足的字节
0x0B 2 00 02 每扇区字节数,一般为 512 字节
0x0D 1 08 每簇扇区数,太大会浪费磁盘空间,太小会导致文件碎片过多
0x0E 2 01 00 保留扇区数,包括启动扇区,最小值为 1
0x10 1 02 FAT 数目
0x11 2 00 02 根目录最大条目数,其中第一个条目作为卷标
0x13 2 总扇区数,要求小于 65536,如果扇区数大于 65536,则此字段为 0,使用偏移为 0x20 的 4 字节字段。
0x15 1 F8 存储介质类型,0xF8 表示该介质为硬盘
0x16 2 18 00 每个 FAT 的扇区数
0x18 2 20 00 每轨道扇区数
0x1A 2 40 00 磁头数量
0x1C 4 00 00 00 00 隐藏扇区数
0x20 4 00 00 00 00 4 字节扇区数,当 2 字节的扇区数为 0 时,该字段被使用
0x24 1 80 物理硬盘号
0x25 1 00 当前磁头号,不被 FAT 文件系统使用
0x26 1 29 签名,用于被 Windows NT 系统识别
0x27 4 CE 13 46 30 分卷序列号
0x2B 11 NO NAME 卷标,但现在卷标被存储在根目录中
0x36 8 FAT 16 磁盘文件系统格式,FAT12 或 FAT16
0x3E 448 启动代码
0x1FE 2 55 AA 启动扇区结束标志

stm32 模拟U盘IAP升级 与 FAT16文件系统相关推荐

  1. STM32F105实现U盘IAP升级程序

    1.理论分析 理论依据很重要,这里稍微介绍一下原理和数据的操作过程.实际实现U盘的IAP升级一共分为两个部分,一部分是bootloader程序,这部分需要使用烧录器或者串口烧写进芯片.另一部分是用户的 ...

  2. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  3. 简单实现stm32f103芯片usb模拟U盘进行IAP更新用户程序

    更新单片机内的用户程序,方式一般都是仿真器,串口,网络口,usb DFU,另类一点CAN也行,但是这些方式都有一个共同点,必须要有相应的上位机配合操作,还要教会别人使用,那么能不能有更简单傻瓜化的升级 ...

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

    21.国民技术N32G45X例程之-U盘模式IAP升级固件 文章目录 前言 一.准备工作 1.国民技术N32G45X提供的库 2.下载本作者原创BIN文件合成软件 3.为什么要合成BIN文件? 二.U ...

  5. STM32 USB HID IAP升级

    找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...

  6. STM32 IAP升级(bootLoader)

    STM32 IAP升级(bootLoader) 今天给大家做一个STM32F系列的IAP 升级, 网上有不少例子,我这里字数有点多如果看请耐心看完,如果嫌麻烦可以看其他的帖子 我这边以103为例子,用 ...

  7. 关于STM32单片机IAP升级中if(((*(__IO uint32_t*)ulAddr_App) 0x2FFE0000) == 0x20000000)语句的理解

    没有标题 初见if(((*(__IO uint32_t*)ulAddr_App) & 0x2FFE0000) == 0x20000000) 语句理解 语句功能 为什么ulAddr_App里存的 ...

  8. STM32CubeMX | STM32基于HAL实现USB模拟U盘

    STM32CubeMX | STM32基于HAL实现USB模拟U盘 目录 STM32CubeMX | STM32基于HAL实现USB模拟U盘 (1)工程配置 (2)代码修改 环境说明: win10 S ...

  9. STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级

    STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级 1.Ymodem协议简介 2.Boodload程序 2.1 传输32K限制解决 3.APP程序 4.升级测试 5.工程文件下载    ...

最新文章

  1. Hadoop(十)Hadoop IO之数据完整性
  2. 我们怎样确保从大数据计算中获得价值
  3. DataURL与File,Blob,canvas对象之间的互相转换的Javascript (未完)
  4. oracle卸数什么是ctrl文件,Oracle数据库的安装和卸载之道
  5. start mysql server_mysql5我的难点,快捷操作(mysql.server stop start),开机启动
  6. iptables学习笔记:端口转发之“内网访问外网”
  7. MFC的DLL中实现定时器功能
  8. [js]DOM 篇
  9. vuex从安装到使用
  10. PostgreSQL-13-缺失值处理
  11. android revre view,MK802 4.0.4 CWM Recovery
  12. 跨网段和同网段的通信
  13. 《Python金融大数据风控建模实战》第4章 数据清洗与预处理
  14. matlab求解数值积分,应用MATLAB求解数值积分
  15. 52周存钱挑战2.0
  16. 基于jsp+mysql+Spring+mybatis的ssm酒店管理系统
  17. 在“D:/mydat“目录下有一个学生名单文件(文本)“student2018.txt“,里面记载了若干学生信息, 每个学生信息单独一行,每行信息共有五列,每列之间用逗号分开, 其每列含义按顺序是:学
  18. 用个人电脑搭建服务器
  19. vscode开发wdk
  20. 【3B1B笔记】e的矩阵指数——怎么算?为什么?

热门文章

  1. 对于C语言函数递归的简单理解(新手入门必看!!!)
  2. ROS1云课→32愉快大扫除
  3. Autosar Xcp移植
  4. 计算机电路图用什么画,初学者怎么用电脑画出精美的电路图?
  5. IOS 集成SeetaFace6框架,实现从采集到图像格式转换再到人脸检测,活体检测,人脸识别
  6. java gdal_Java GDAL 环境配置
  7. c语言求玫瑰花数带注释,新人 用C语言画一朵玫瑰
  8. CC2541增加特征值 CHAR6实现串口透传
  9. mybatisplus多源配置报错:Failed to determine a suitable driver class
  10. 将DIB复制到剪贴板