|
SD卡MBR的位置和硬盘也差不多,就位于第一扇区。MBR的组成我这里就不详说了,感兴趣的可以自己去研究研究。MBR占用了446字节,剩下的66字节由PTE(分区表4*16,MBR模式只能划分4个分区)和分区的结束标志(0x55AA)组成。实际上我们需要做的就是,通过修改这64字节的PTE来实现SD卡的分区。/ B% I$ B' x3 K( q. w3 F; K& [ 下图为ff.c中对于分区表结构的定义,其实就和上面提到的文章里说的一样的啦。
, }6 _9 V. Q/ v+ t1 z7 V1 |' K 原理知道了,那就开始动手了! + t. A3 t/ ]# E- M3 r 我的Cube版本为6.2.1,芯片为STM32H743IIKx,软件包版本为1.9.0 1 s' Z9 K( l' Q. J7 ]1 I 首先是SD卡的配置 E8 o: q7 }$ X 5 A5 w2 F: V. H! H6 k; ~6 j
+ u7 X, O: z7 v/ @8 f/ V2 Z 然后配置一下FATFS
别忘了修改一下Stack的大小 (我只要使用FATFS就会把栈改的大一些)7 v; B/ N3 L6 S3 u+ i 4 W& u% b' W3 {' n2 I" m
, F! `- e. P! D8 W, M 好了,现在就可以生成代码了,我们要做的就是在fatfs.c中 添加以下代码 * `, d( Y* \7 x6 C3 k2 g" a; z# g
分区的关键函数就是f_fdisk,由于我只使用了一个物理磁盘,所以该函数的第一个参数直接传递了一个0,当然也可以通过以下代码来获取物理磁盘号(在ff.c的f_mkfs函数中)。$ C0 f% [; d! |' Z8 h
第二个参数用来传递分区的容量分配信息, 我所使用的是256G的SDXC,这里把它分成了64G(0x07726000*512B)和192G (0x1657200*512B)。 第三个参数传递工作缓存地址,注意缓存大小不要小于_MAX_SS。 # \1 @8 f: E) `% c 剩下就是编译烧录,等程序运行到主循环之后,把SD卡拿出来插上电脑,就可以看到分区完成啦! w+ q) L7 Y P% }' X6 V / K8 s' h a8 [' S l8 v* J3 n
最后我把调试过程中的一些坑也分享一下 1、cube6.2.1生成的SD初始化函数中,需要手动添加HAL_SD_Init()" |; ^9 s; Z7 u1 G! d
2、我一开始分区设置为128G+128G,在使用f_mkfs对第二分区进行格式化时,出现了错误,debug后发现在以下位置出现问题; J1 X/ q& \8 _' z# z; m3 Z % c8 I, C# I+ P0 U0 s v! l8 ?% I$ f
' t2 j: Q; S! @6 @9 J9 x 这段代码意思是分区的起始地址不允许超过分区容量的一半,通俗说就是多分区时,前面的分区不允许超过总容量的三分之一(大概范围),不然就不许你初始化(大概是嵌入式FATFS的限制吧)。其实使用f_fdisk后,就已经完成了SD的分区了,到此为止是没有上面所说的那个分区容量大小的限制的。不过为了能够更好地看到效果,我直接在分区之后对两个分区进行了格式化,所以就改成了64+192的组合。9 a- c9 i2 z H! E# A ———————————————— 版权声明:balibala' a; ^' F4 s! F H |
【STM32H5 评测】ADC 电压表
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】介绍、环境搭建、工程测试
#双节活动 1.在CubeMX中引用touchGFX出现的问题与解决
如何将STM32CubeMX生成的CMake工程导入STM32CubeIDE
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
微信公众号
手机版