stm32 模拟U盘IAP升级 与 FAT16文件系统
如果用的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文件系统相关推荐
- STM32F105实现U盘IAP升级程序
1.理论分析 理论依据很重要,这里稍微介绍一下原理和数据的操作过程.实际实现U盘的IAP升级一共分为两个部分,一部分是bootloader程序,这部分需要使用烧录器或者串口烧写进芯片.另一部分是用户的 ...
- STM32外挂FLASH模拟U盘(基于HAL库)
STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...
- 简单实现stm32f103芯片usb模拟U盘进行IAP更新用户程序
更新单片机内的用户程序,方式一般都是仿真器,串口,网络口,usb DFU,另类一点CAN也行,但是这些方式都有一个共同点,必须要有相应的上位机配合操作,还要教会别人使用,那么能不能有更简单傻瓜化的升级 ...
- 21.国民技术N32G45X例程之-U盘模式IAP升级固件
21.国民技术N32G45X例程之-U盘模式IAP升级固件 文章目录 前言 一.准备工作 1.国民技术N32G45X提供的库 2.下载本作者原创BIN文件合成软件 3.为什么要合成BIN文件? 二.U ...
- STM32 USB HID IAP升级
找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...
- STM32 IAP升级(bootLoader)
STM32 IAP升级(bootLoader) 今天给大家做一个STM32F系列的IAP 升级, 网上有不少例子,我这里字数有点多如果看请耐心看完,如果嫌麻烦可以看其他的帖子 我这边以103为例子,用 ...
- 关于STM32单片机IAP升级中if(((*(__IO uint32_t*)ulAddr_App) 0x2FFE0000) == 0x20000000)语句的理解
没有标题 初见if(((*(__IO uint32_t*)ulAddr_App) & 0x2FFE0000) == 0x20000000) 语句理解 语句功能 为什么ulAddr_App里存的 ...
- STM32CubeMX | STM32基于HAL实现USB模拟U盘
STM32CubeMX | STM32基于HAL实现USB模拟U盘 目录 STM32CubeMX | STM32基于HAL实现USB模拟U盘 (1)工程配置 (2)代码修改 环境说明: win10 S ...
- STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级
STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级 1.Ymodem协议简介 2.Boodload程序 2.1 传输32K限制解决 3.APP程序 4.升级测试 5.工程文件下载 ...
最新文章
- Hadoop(十)Hadoop IO之数据完整性
- 我们怎样确保从大数据计算中获得价值
- DataURL与File,Blob,canvas对象之间的互相转换的Javascript (未完)
- oracle卸数什么是ctrl文件,Oracle数据库的安装和卸载之道
- start mysql server_mysql5我的难点,快捷操作(mysql.server stop start),开机启动
- iptables学习笔记:端口转发之“内网访问外网”
- MFC的DLL中实现定时器功能
- [js]DOM 篇
- vuex从安装到使用
- PostgreSQL-13-缺失值处理
- android revre view,MK802 4.0.4 CWM Recovery
- 跨网段和同网段的通信
- 《Python金融大数据风控建模实战》第4章 数据清洗与预处理
- matlab求解数值积分,应用MATLAB求解数值积分
- 52周存钱挑战2.0
- 基于jsp+mysql+Spring+mybatis的ssm酒店管理系统
- 在“D:/mydat“目录下有一个学生名单文件(文本)“student2018.txt“,里面记载了若干学生信息, 每个学生信息单独一行,每行信息共有五列,每列之间用逗号分开, 其每列含义按顺序是:学
- 用个人电脑搭建服务器
- vscode开发wdk
- 【3B1B笔记】e的矩阵指数——怎么算?为什么?
热门文章
- 对于C语言函数递归的简单理解(新手入门必看!!!)
- ROS1云课→32愉快大扫除
- Autosar Xcp移植
- 计算机电路图用什么画,初学者怎么用电脑画出精美的电路图?
- IOS 集成SeetaFace6框架,实现从采集到图像格式转换再到人脸检测,活体检测,人脸识别
- java gdal_Java GDAL 环境配置
- c语言求玫瑰花数带注释,新人 用C语言画一朵玫瑰
- CC2541增加特征值 CHAR6实现串口透传
- mybatisplus多源配置报错:Failed to determine a suitable driver class
- 将DIB复制到剪贴板