主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
读写文件系统重点课程 | 什么是FAT文件系统,文件格式。CH376操作文件系统,新建、删除、编辑TXT文件。 | 能调用函数简单操作文件。 |
师从洋桃电子,杜洋老师
📑文章目录
- 引言
- 一、文件系统程序分析概述
- 1.1 系统架构设计
- 1.2 关键功能模块
- 二、驱动程序深度解析
- 2.1 CH376驱动核心函数
- 2.2 SPI通信时序优化
- 2.3 中断处理机制
- 三、U盘读写程序实现
- 3.1 主程序逻辑分析
- 3.2 多级目录创建技巧
- 3.3 数据写入优化策略
- 四、文件系统操作全流程
- 4.1 标准操作流程
- 4.2 错误处理机制
- 五、扩展设计思路
- 5.1 长文件名支持
- 5.2 大文件存储优化
- 5.3 文件系统监控
- 六、相关资源
▲ 回顾上期🔍STM32 SPI总线驱动CH376T实现U盘/TF卡读写全解析(上) | 零基础入门STM32第七十二步
▲ 回顾上期🔍STM32 SPI总线驱动CH376T实现U盘/TF卡读写全解析—CH376数据手册分析(中上) | 零基础入门STM32第七十三步
▲ 回顾上期🔍STM32 SPI总线驱动CH376T实现U盘/TF卡读写全解析—在U盘读写中的应用(中下) | 零基础入门STM32第七十四步
▲ 回顾上期🔍STM32 SPI总线驱动CH376T实现U盘/TF卡读写全解析—SPI通信、命令集与文件操作(下) | 零基础入门STM32第七十五步
引言
在嵌入式系统中实现U盘文件操作是物联网设备数据存储的关键技术之一。本文基于STM32F10x系列微控制器,结合CH376 USB控制芯片,详细解析文件系统操作的全流程。我们将从程序架构、驱动实现到具体应用层层剖析,并附上完整的流程图和扩展设计思路。
一、文件系统程序分析概述
1.1 系统架构设计
系统采用分层架构设计,包含以下核心模块:
+-------------------+
| 应用层(main.c) |
+-------------------+
| 文件系统层(filesys) |
+-------------------+
| 驱动层(CH376+SPI) |
+-------------------+
| 硬件层(STM32) |
+-------------------+
1.2 关键功能模块
- 硬件接口:SPI通信协议实现
- 设备管理:U盘连接检测与初始化
- 文件操作:创建/写入/关闭文件
- 数据缓存:128字节RAM缓冲区管理
二、驱动程序深度解析
2.1 CH376驱动核心函数
/* filesys.c关键函数说明 */
UINT8 CH376DiskConnect(void); // 检测U盘连接状态
UINT8 CH376FileCreatePath(PUINT8); // 创建多级目录文件
UINT8 CH376ByteWrite(...); // 字节写入操作
UINT8 CH376FileClose(UINT8); // 关闭文件并更新长度
2.2 SPI通信时序优化
void SPI2_Init(void) {// 配置SPI为模式3(CPOL=1, CPHA=1)SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;// 8位数据格式,MSB先行SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;// 时钟预分频设置(18MHz主频时)SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
}
2.3 中断处理机制
三、U盘读写程序实现
3.1 主程序逻辑分析
// main.c核心流程
while(1){// 等待U盘连接while(CH376DiskConnect() != USB_INT_SUCCESS)delay_ms(100);// 文件创建与写入CH376FileCreatePath("/洋桃.TXT");sprintf(buf, "洋桃电子 www.DoYoung.net/YT");CH376ByteWrite(buf, strlen(buf), NULL);// 安全关闭文件CH376FileClose(TRUE);
}
3.2 多级目录创建技巧
通过路径分隔符处理实现多级目录创建:
s=CH376FileCreatePath("/data/log/2023.TXT");
内部处理流程:
- 解析"/data/log"路径
- 逐级创建目录节点
- 在log目录下创建2023.TXT
3.3 数据写入优化策略
采用分块写入机制防止缓冲区溢出:
#define WRITE_BLOCK_SIZE 64
for(int i=0; i<data_len; i+=WRITE_BLOCK_SIZE){uint16_t write_len = (data_len-i) > WRITE_BLOCK_SIZE ? WRITE_BLOCK_SIZE : (data_len-i);CH376ByteWrite(buf+i, write_len, &real_write);
}
四、文件系统操作全流程
4.1 标准操作流程
-
设备初始化
- SPI接口配置
- CH376芯片复位
- 设置USB主机模式
-
U盘检测
-
文件操作
- 路径解析与目录遍历
- 文件指针定位
- 数据块读写操作
- FAT表更新
4.2 错误处理机制
建立三级错误恢复策略:
UINT8 file_operation_retry(uint8_t max_retry){uint8_t retry = 0;do{uint8_t status = CH376FileCreatePath(path);if(status == USB_INT_SUCCESS) return SUCCESS;if(status == ERR_DISK_DISCON) CH376DiskMount();}while(++retry < max_retry);return ERR_OPERATION_FAIL;
}
五、扩展设计思路
5.1 长文件名支持
启用EN_LONG_NAME宏定义:
#define EN_LONG_NAME
#define LONG_NAME_BUF_LEN 256
使用UNICODE编码方案:
uint16_t long_name[] = {0x6D4B,0x8BD5,0x6587,0x4EF6}; // "测试文件"
CH376CreateLongName(path, (PUINT8)long_name);
5.2 大文件存储优化
采用扇区级操作提升效率:
#define SECTOR_SIZE 512
uint8_t sector_buf[SECTOR_SIZE];
CH376SecWrite(sector_buf, 1, NULL); // 整扇区写入
5.3 文件系统监控
添加状态回调函数:
typedef void (*fs_callback)(uint8_t event);
void register_fs_callback(fs_callback cb){// 注册存储操作事件回调
}
六、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] CH376(U盘文件读写)
[5] U盘读写文件程序
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨4x4阵列键盘,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-18)