使用STM32Cube对SD卡进行分区

本文介绍了在STM32H743芯片上进行SD卡分区实验的过程,包括理解MBR分区原理,使用FATFS库进行配置,并通过代码实现对256GB SDXC卡的64GB+192GB分区。在实践中遇到了分区容量限制的问题,并分享了调试过程中的注意事项和解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        我的第二篇文章,继续拿SD卡来作妖,这次搞一下SD卡的分区实验。

        首先讲一下SD卡分区的原理,可以先看一下这篇文章:MBR分区表详解

        SD卡MBR的位置和硬盘也差不多,就位于第一扇区。MBR的组成我这里就不详说了,感兴趣的可以自己去研究研究。MBR占用了446字节,剩下的66字节由PTE(分区表4*16,MBR模式只能划分4个分区)和分区的结束标志(0x55AA)组成。实际上我们需要做的就是,通过修改这64字节的PTE来实现SD卡的分区。

        下图为ff.c中对于分区表结构的定义,其实就和上面提到的文章里说的一样的啦。

 原理知道了,那就开始动手了!

我的Cube版本为6.2.1,芯片为STM32H743IIKx,软件包版本为1.9.0

首先是SD卡的配置


然后配置一下FATFS 


别忘了修改一下Stack的大小 (我只要使用FATFS就会把栈改的大一些)


好了,现在就可以生成代码了,我们要做的就是在fatfs.c中 添加以下代码

分区的关键函数就是f_fdisk,由于我只使用了一个物理磁盘,所以该函数的第一个参数直接传递了一个0,当然也可以通过以下代码来获取物理磁盘号(在ff.c的f_mkfs函数中)。

第二个参数用来传递分区的容量分配信息, 我所使用的是256G的SDXC,这里把它分成了64G(0x07726000*512B)和192G (0x1657200*512B)。

第三个参数传递工作缓存地址,注意缓存大小不要小于_MAX_SS。

剩下就是编译烧录,等程序运行到主循环之后,把SD卡拿出来插上电脑,就可以看到分区完成啦


 最后我把调试过程中的一些坑也分享一下

1、cube6.2.1生成的SD初始化函数中,需要手动添加HAL_SD_Init()

2、我一开始分区设置为128G+128G,在使用f_mkfs对第二分区进行格式化时,出现了错误,debug后发现在以下位置出现问题

         这段代码意思是分区的起始地址不允许超过分区容量的一半,通俗说就是多分区时,前面的分区不允许超过总容量的三分之一(大概范围),不然就不许你初始化(大概是嵌入式FATFS的限制吧)。其实使用f_fdisk后,就已经完成了SD的分区了,到此为止是没有上面所说的那个分区容量大小的限制的。不过为了能够更好地看到效果,我直接在分区之后对两个分区进行了格式化,所以就改成了64+192的组合。


        以上实验是我阅读FATFS源码后进行编写调试的,可能会存在一些问题,如发现不对的地方,欢迎指正!我定万分感激!

不用任何软件给SD分区,且能直接用读器读取所有分区 分下面两步: 一、读器读取所有分区SD分区了,电脑不认后面的分区,只能看到第一个分区。怎么办呢? 一般我们的读器,在我的电脑中,显示的是可移动的存储。我们就是要在这里改成---本地磁盘,让windows 把u盘,或者sd认成硬盘。 在设备管理器中-----磁盘驱动器- 列表里有硬盘和你的读器。(每人的不同。)找到读器的那个,单击右键,更新驱动程序。下一步----选择从列表或者指定位置安装,------下一步------选择不要搜索,我要自己选择安装的驱动程序。(一定注意)下一步---选择从磁盘安装-----浏览找到我给你的驱动。(帖子下载)就是cfadisk.inf。下一步,windows会提示不推荐,不管他,点是。然后windows又提示签名,点仍然继续。 windows复制文件。 结束。要求重启,不必重启。 打开我的电脑,sd已经是本地磁盘了。 用一般的分区工具,或者windwos自己的磁盘管理,你想分多少就分多少吧。以前分的,以前分的,也看见了,哈哈哈。 这样,你只能在这台机子看到所有分区。到别的计算机,就只有第一个分区了。你可以把驱动放到第一分区。几十k大小。想用了一装就可以。 卸载很简单。 在刚才的那个设备管理器中一路让windows自动安装一遍驱动,就成了可移动存储了,哈哈。 二、分区: 1.如果SD容量过大,有些机型不能识别,或为了管理方便,可以用分区的方法解决。 上面第一步已经把SD认作了本地磁盘,把SD插入读器连上PC,PC上会多出一个盘符。 2 .然后在PC运行“计算机管理”,在“磁盘管理”功能中找到上面的盘符,右键“删除磁盘分区”; 3. 接下来可以跟操作硬盘一样分区了,在“磁盘管理”功能下面的空白分区中就可以性建分区了,新建几个分区就看你的喜好了,记住要格式化。
STM32中对SD进行分区的过程可以通过修改SD的MBR(Master Boot Record)来实现。MBR位于SD的第一扇区,占用了446字节,剩下的66字节由PTE(分区表)和分区的结束标志(0x55AA)组成。通过修改PTE来实现SD分区。\[1\] 在分区时,需要注意的是分区的起始地址不允许超过分区容量的一半。也就是说,前面的分区不允许超过总容量的三分之一。这可能是嵌入式FATFS的限制之一。使用f_fdisk函数进行分区后,就已经完成了SD分区,不再受到容量大小的限制。\[2\] 在FAT32文件系统中,根目录区与普通目录一样,都位于数据区。典型情况下,根目录区从2号簇开始,数据区起始扇区号为保留扇区+2*分配表扇区。例如,如果保留扇区为32,分配表扇区为1944,则数据区起始扇区号为1976。而3号簇的起始扇区号为1984。可以使用SDRD命令读取数据区的内容。\[3\] 因此,对于STM32SD分区,可以通过修改MBR的PTE来实现分区,并且在FAT32文件系统中,根目录区与普通目录一样,都位于数据区。 #### 引用[.reference_title] - *1* *2* [使用STM32CubeSD进行分区](https://blog.csdn.net/weixin_44536527/article/details/119177014)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [基于STM32SDFATFS文件系统学习笔记](https://blog.csdn.net/ba_wang_mao/article/details/108455283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值