SD卡STM32C8T6-FATFS文件系统的使用

本文介绍了如何在STM32上移植和使用FATFS文件系统,包括文件的读写、目录遍历以及资源占用情况。通过简单的API调用实现对SD卡的读写操作,同时展示了如何遍历目录和文件,以及在资源有限的环境中优化内存占用。

1-关于移植,网上教程非常多了,没多少讲的,移植也比较简单,基本只要提供读写扇区函数就可以了。本次使用的是官网最新的0.4版本

本文记录一下

--读写文件功能

--遍历目录和文件

--使用的内存情况

直接跳过移植,和SD卡驱动部分。

 文件读写-------------

基本和C语言file操作一致,这几个函数基本不会陌生吧,流程也是打开,读写,关闭

res =f_mount(&fs,"0:",1); 					//挂载SD卡 

	if(res)
	{
		
	}
	else
	{
		
		exf_getfree("0",&total,&free);
		printf("SD total %d free %d\r\n",total,free);
		
	}
	
	scan_files("0:");
	
	res = f_open(&fil, "0:/test1.txt",FA_OPEN_APPEND|FA_WRITE|FA_READ);
	printf("open %d size %d\r\n",res,f_size(&fil));

	
	res = f_write(&fil, wrbuf, sizeof(wrbuf), &bw);
	printf("write %d len %d\r\n",res,bw);

	f_lseek(&fil,0);
	res = f_read(&fil,mm,12,&read_len);
	printf("read %s len %d res %d\r\n",(char*)mm,read_len,res);
	
	f_close(&fil);
	/*卸载文件系统*/
	f_mount(0, "0:", 0);

----遍历目录和文件

scan_files("0:"); 函数就是扫描当前所有的文件和目录,里面会有递归,目录不要太深,否则main函数的栈不够你用的。

代码: 

FRESULT scan_files(char *path)
{
	FRESULT res; //定义结果对象
	DIR dir; //定义目录对象
	char pathBuff[100]={0}; //定义路径数组
	static FILINFO fno; //定义静态文件信息结构对象
	res = f_opendir(&dir,path); //打开目录,返回状态 和 目录对象的指针

	if(res == FR_OK) //打开成功
	{
		while(1) //遍历
		{
			res = f_readdir(&dir, &fno); //读取目录,返回状态 和 文件信息的指针
			if(res != FR_OK || fno.fname[0] == 0) 
				break; //若打开失败 或 到结尾,则退出
			if(fno.fattrib & AM_DIR) //是目录
			{
		
				sprintf(pathBuff,"%s/%s",path,fno.fname); //将新目录添加在原目录后面
				printf("is path:%s\r\n",pathBuff);
				res = scan_files(pathBuff); //将新目录进行递归调用
				if(res != FR_OK) break; //打开失败则退出
	
			}else
			{
				printf("si file:%s/%s %d\r\n",path,fno.fname,fno.fsize); //是文件
			
			}
		}
	}
	else
	{
		printf("失败 - %d",&res); //打开失败
	}
	f_closedir(&dir); //关闭目录
	return res; //返回状态
}

运行如下:和我sd卡中文件结构一致

 

 ----最后关于占用的资源部分,

使用的US编码

#define FF_CODE_PAGE    437

使用小型模式

#define FF_FS_TINY        1

不使用格式化功能

#define FF_USE_MKFS        0

在keil的map中看,ROM大概在7.3K,  RAM使用的非常小,目前是大部分功能都有的情况下,后续把一些独立的功能再裁剪一下应该更小巧

### STM32C8T6 使用 HAL 库与 CubeMX 驱动 IIC OLED 的相关资料 #### 一、硬件准备 为了实现 STM32C8T6 对 SSD1306 OLED 显示屏的支持,需准备好以下设备: - **STM32 C8T6 最小系统板** - **SSD1306 OLED 屏幕 (IIC 接口)** - 开发环境:Keil MDK v5 或更高版本 通过 HAL 库和 CubeMX 工具完成初始化配置。 --- #### 二、软件工具链设置 1. **CubeMX 初始化** 在 STMCubeMX 中创建项目并选择目标 MCU(STM32F103C8T6),启用 I2C 外设功能。通常情况下,推荐使用 `I2C1` 并将其映射至 GPIO 引脚 PB6 和 PB7[^1]。 2. **生成代码框架** 完成外设配置后,导出工程文件至 Keil IDE,并确保 HAL_I2C 模块已正确导入。 --- #### 三、第三方库集成 由于 HAL 库本身并不直接提供针对 SSD1306 的驱动支持,因此需要引入外部图形库来简化开发流程。以下是两种常见方案: ##### 方案 A: U8Glib 图形库移植 - **背景**: U8Glib 是一款广泛应用于嵌入式系统的开源图形库,由德国开发者 Oliver Kraus 维护,并被后续社区不断优化扩展。 - **获取方式**: 访问 GitHub 地址 https://github.com/SL-RU/stm32libs 下载适配于 STM32 的分支版本。 - **主要特性**: - 支持多种显示控制器型号,包括 SSD1306。 - 提供丰富的绘图 API 函数,例如绘制像素点、直线、矩形以及文字输出等功能。 ##### 方案 B: 自定义驱动函数编写 如果倾向于轻量化设计,则可基于官方数据手册手动构建通信协议逻辑。此方法涉及更复杂的底层操作,但对于资源受限场景可能更加高效。 --- #### 四、典型问题排查 当遇到屏幕无法点亮或其他异常现象时,请逐一验证以下几个方面: 1. **确认 I2C 设备地址匹配性** 不同厂商生产的 OLED 模组可能存在默认从机地址差异,默认值一般为 `0x3C` 或 `0x3D`。可通过万用表测量 SDA/SCL 波形或者借助调试工具读取实际寄存器状态[^2]。 2. **检查拉电阻连接情况** 如果未安装上拉电阻组件,在某些电路布局条件下可能导致信号传输不稳定,进而引发显示紊乱等问题。 3. **调整波特率参数设定** 过高的时钟频率可能会超出 OLED 芯片承受范围,建议初始阶段保持较低速率运行测试稳定性后再逐步提升性能指标[^3]。 --- #### 五、核心代码片段展示 下面给出一段基础示例用于演示如何利用 HAL 库发送命令帧序列控制显示器清零动作: ```c #include "stm32f1xx_hal.h" #include "u8glib_stm32.h" // 声明全局句柄实例变量 U8GLIB_SSD1306_128X64 u8g(I2C_HandleTypeDef *hi2c, uint8_t dev_addr); void DisplayInit(void){ /* 初始化过程 */ u8g.begin(); } int main(void){ HAL_Init(); SystemClock_Config(); // 启动 I2C 总线服务 MX_I2C1_Init(); // 执行画面刷新前准备工作 DisplayInit(); while(1){ u8g.firstPage(); do{ u8g.drawStr(0,10,"Hello World!"); }while(u8g.nextPage()); HAL_Delay(1000); } } ``` 上述代码展示了基本的初始化步骤及字符串渲染机制。 --- #### 六、总结说明 综上所述,采用 HAL 库搭配 CubeMX 自动生成模板能够显著降低复杂度门槛;与此同时结合成熟的第三方图像处理类库则进一步增强了应用灵活性与功能性表现力。对于初学者而言,优先考虑成熟解决方案有助于快速入门实践环节。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值