你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32Cube对SD卡进行分区

[复制链接]
攻城狮Melo 发布时间:2022-11-4 16:34
SD卡MBR的位置和硬盘也差不多,就位于第一扇区。MBR的组成我这里就不详说了,感兴趣的可以自己去研究研究。MBR占用了446字节,剩下的66字节由PTE(分区表4*16,MBR模式只能划分4个分区)和分区的结束标志(0x55AA)组成。实际上我们需要做的就是,通过修改这64字节的PTE来实现SD卡的分区。/ B% I$ B' x3 K( q. w3 F; K& [

9 l, D3 ~5 w7 ?. U+ M% t下图为ff.c中对于分区表结构的定义,其实就和上面提到的文章里说的一样的啦。
$ N/ g  j/ d8 J
+ o  g5 C5 w$ A3 j) Q4 l% p5 M 2021072813184699.png , V2 `0 m$ f8 D6 L& I
, }6 _9 V. Q/ v+ t1 z7 V1 |' K
原理知道了,那就开始动手了!
; L9 M2 j$ b9 t& e. i" d9 U+ t. A3 t/ ]# E- M3 r
我的Cube版本为6.2.1,芯片为STM32H743IIKx,软件包版本为1.9.0
: b) A( {/ k. g  `. `1 s' Z9 K( l' Q. J7 ]1 I
首先是SD卡的配置  E8 o: q7 }$ X
5 A5 w2 F: V. H! H6 k; ~6 j
20210728132057381.png
+ J! ]2 g! t( e, t9 j/ ?
" S! S2 m6 ?7 @- ?9 v 20210728132128797.png
/ d  m0 M& n0 ]7 Z" e1 ?8 Q+ u7 X, O: z7 v/ @8 f/ V2 Z
然后配置一下FATFS
' d$ a  Z+ a( _8 t0 ~- G; V
. D$ y9 {' D- C% g3 q4 A! U% A 20210728132233201.png 3 Q6 e- N3 P) k

! H# C) f0 D. a" W7 M) O别忘了修改一下Stack的大小 (我只要使用FATFS就会把栈改的大一些)7 v; B/ N3 L6 S3 u+ i
4 W& u% b' W3 {' n2 I" m
20210728132507825.png   ]8 y- c) E% e8 ]4 A  e3 l# @
, F! `- e. P! D8 W, M
好了,现在就可以生成代码了,我们要做的就是在fatfs.c中 添加以下代码
2 Q. b! w3 m  |# u  ^* `, d( Y* \7 x6 C3 k2 g" a; z# g
20210728132755614.png
+ |% ?4 d8 b- q5 d% I
+ N- S/ I1 W) r9 w2 O- E6 B( V6 X: y* c1 n分区的关键函数就是f_fdisk,由于我只使用了一个物理磁盘,所以该函数的第一个参数直接传递了一个0,当然也可以通过以下代码来获取物理磁盘号(在ff.c的f_mkfs函数中)。$ C0 f% [; d! |' Z8 h

& ]8 _8 h/ I! ]; S0 k7 W, ~/ } 20210728133541750.png
% _1 g4 D0 c9 r
' S4 {% Z7 ^/ ^3 f" k第二个参数用来传递分区的容量分配信息, 我所使用的是256G的SDXC,这里把它分成了64G(0x07726000*512B)和192G (0x1657200*512B)。
  N& N/ h3 y+ i# ^/ j9 a
6 y( t5 J; z7 `# Z; X' H9 C/ N) t第三个参数传递工作缓存地址,注意缓存大小不要小于_MAX_SS。
6 L" N! A; v5 O( i# \1 @8 f: E) `% c
剩下就是编译烧录,等程序运行到主循环之后,把SD卡拿出来插上电脑,就可以看到分区完成啦! w+ q) L7 Y  P% }' X6 V
/ K8 s' h  a8 [' S  l8 v* J3 n
20210728134053418.png
7 r1 X' a( A4 ~& U+ [4 e
- {! }" T+ e& J  J% d: Y) d 最后我把调试过程中的一些坑也分享一下
/ R4 ]/ {5 e; ?* z) Z* t. t
7 I/ r( o' r! s1、cube6.2.1生成的SD初始化函数中,需要手动添加HAL_SD_Init()" |; ^9 s; Z7 u1 G! d

% q. V* r% d4 O* s' s 20210728134510390.png # }! L$ C; H1 _3 D

5 H3 z6 i7 a3 {9 ?& M2、我一开始分区设置为128G+128G,在使用f_mkfs对第二分区进行格式化时,出现了错误,debug后发现在以下位置出现问题; J1 X/ q& \8 _' z# z; m3 Z
% c8 I, C# I+ P0 U0 s  v! l8 ?% I$ f
20210728134809458.png
/ U& r+ z2 S9 ~8 z: ^' t2 j: Q; S! @6 @9 J9 x
         这段代码意思是分区的起始地址不允许超过分区容量的一半,通俗说就是多分区时,前面的分区不允许超过总容量的三分之一(大概范围),不然就不许你初始化(大概是嵌入式FATFS的限制吧)。其实使用f_fdisk后,就已经完成了SD的分区了,到此为止是没有上面所说的那个分区容量大小的限制的。不过为了能够更好地看到效果,我直接在分区之后对两个分区进行了格式化,所以就改成了64+192的组合。9 a- c9 i2 z  H! E# A
————————————————
1 r2 c; \' V& ~3 t* z4 [( [版权声明:balibala' a; ^' F4 s! F  H

2 V9 W/ `) ?$ Q$ R9 M+ ?
赞 收藏 评论0 发布时间:2022-11-4 16:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版