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

【经验分享】stm32Cubemx实用篇(四):SD卡读写实验

[复制链接]
STMCU小助手 发布时间:2022-3-8 22:09
一、Cubemx工程配置
( t* t  I: h1 K3 d- X1、时钟配置
" _4 m) Z" h0 X4 V- }# ~: s& I0 H
) D0 Z" R$ A; T0 y7 O Y`E)D33`RG0AQBL4%OV)WTN.png 7 y1 @  ]" @1 f; F2 @! [( ~9 W

( t9 h5 C& @+ M2、SDMMC设置
+ M& J+ c9 K  R% C5 A# ^
+ {+ I8 p2 a% ^# ?/ G, v5 U官方库文件建议如下:
9 i+ u* p; T" R9 Y7 AThe SD Card frequency (SDMMC_CK) is computed as follows:
$ ]) I% b  }: k- w1 V* k6 g% {SDMMC_CK = SDMMCCLK / (2 * ClockDiv)! l. t1 J3 Q  v4 E+ O

: G1 U+ E0 X9 ^4 p) r0 A4 W- o( F$ R具体设置如下图所示:# Q9 }- ~, @4 d; f! ^, o
[1NDJNFA5T~Z1BFBURRZN(X.png 2 p) b6 X0 D; u$ C0 ~3 L

- m% U* v" y* z4 t# q二、实验部分
7 ^5 U! a& r; C; W& {5 S4 |1.获得TF卡信息

4 f+ i0 i( X2 }' p初始化好SD后我们先获得卡信息并串口打印出来。
7 ^) S0 M4 ]& y  K$ M, L
  1. HAL_SD_CardInfoTypeDef  SDCardInfo;         //SD卡信息结构体: x2 ?" `! n1 T/ p# m8 s9 H
  2. //得到卡的信息并输出到串口13 V7 j! H% N. P6 L( o" c4 W
  3. HAL_SD_GetCardInfo(&hsd1, &SDCardInfo);//HAL_SD_CardInfoTypeDef *pCardInfo);//获取SD卡信息2 U7 q, o0 D& b. \  w
  4. printf("Card Type:%d\r\n",SDCardInfo.CardType);   //卡类型
    - T. O  o+ ]' J1 @; Y2 ?/ u
  5. printf("Card CardVersion:%d\r\n",SDCardInfo.CardVersion);             //CardVersion
    1 F3 I* ^4 _1 j0 a5 W" k
  6. printf("Card RCA:%d\r\n",SDCardInfo.RelCardAdd);        //卡相对地址$ S: z1 r( C7 e) t' `- ]
  7. printf("Card Capacity:%d MB\r\n",(u32)(SDCardInfo.LogBlockNbr)>>11);        //显示容量
    1 b# W: N& z1 T
  8. printf("Card BlockSize:%d\r\n\r\n",SDCardInfo.LogBlockSize);//显示块大小
复制代码
4 A) M$ r6 l: ]* v" `  @- f
可以看出已经正确读出卡片信息,如下图:
& k4 E7 K( l4 o* L, q3 m. x# g4 p" y$ h" Z
9[33H@@)QQ%]7L6ZF3~8YJI.png . ?9 _5 c( u$ w
$ o5 W: Z" X# t; F
2.读、写、擦除SD卡
: c! y) }9 i" P这里需要注意的一点是,库文件官方建议如下:
, O/ L1 `9 }. a/ ]/ _8 _% P% h0 C0 z; K: u! g* q
XL`9N%4K`2CY`Z`_$ES12GI.png 5 T) i: d# H, G. t
, h7 j7 I6 i' @, @2 h: M: t
操作SD卡后需要先用函数HAL_SD_GetCardState()确定一下卡的状态再进行其他操作。后期使用需要注意
9 m- f  M: |1 m5 m
) J% e1 ^. |& f( h4 G- k) f! k实验方式:按键1按下时给扇区6写入512个字节的0xbb。按键2按下时读取扇区6内的内容。按键3按下时擦除扇区6的内容。 另外,由于定义了rd_buf和buf为512个字节需要将栈设置大一点,不然程序运行会不正常。
/ z) y5 s( s2 b& @: ~& l0 q8 E
$ ?9 M; R) V, l2 l$ X7 P 5BDED(72Y6`YJI%)Y(EH]NA.png 2 E8 i/ k) @2 v6 V

9 i, Z9 ]2 @  ]. M: j实验代码如下(示例):
  1. key=KEYPRESS();    //按键6 `* v3 V. p0 h6 M8 T  u! V+ X6 G
  2. if(key==1)//KEY1按下了 - f: U9 B: v" N
  3. {+ N" C5 E: N; w$ L% v
  4.          for(sd_size=0;sd_size<512;sd_size++)buf[sd_size]=0xbb;  //给扇区6写数据8 x% l1 A: n$ ^- G& E, f) p
  5.        HAL_SD_WriteBlocks(&hsd1, buf, 512*6, 1, 0xff);- }) O8 j6 T' K. N# O
  6.        printf("\r\nWrite DATA ENDED\r\n");
    % r) ?! I( ?8 P  Z' H8 j- A7 r
  7. }  6 A; e) a- c* M9 Z1 D# H4 O; [
  8. if(key==2)//KEY2按下了
    / |. O2 X4 {2 n9 P  |
  9. {
    . ^# ~% G6 v1 v' @4 r6 g
  10. //读取扇区6的内容
    ; P2 Q: \( v6 ^6 G6 @6 s
  11. if(HAL_SD_ReadBlocks(&hsd1, rd_buf, 512*6, 1, 0xff)  == HAL_OK)
    ( V- B: }( V6 k$ K# V' Y1 w, A
  12. {        
    2 F& C( K8 C' \6 B
  13.         printf("SECTOR 6  DATA:\r\n");
    3 r2 D$ h' ~9 c3 h8 \
  14.         for(sd_size=0;sd_size<512;sd_size++)' H6 O1 G% B2 H( C+ m7 S* y- a. Q
  15.         printf("%x ",rd_buf[sd_size]);//打印扇区数据               
    , E$ i8 f) y+ A7 k2 Y$ k/ M  ~
  16.     printf("\r\nRead DATA ENDED\r\n");
      W8 T! V8 S% }
  17.         }
    ) s- I6 h% J9 B6 G
  18. } 7 b' j! P) a  O# {, f
  19. if(key==3)//KEY3按下了 擦除扇区6的内容9 `6 G5 T2 g! e* b! f
  20. {7 z$ x% l, t# [7 j
  21.    HAL_SD_Erase(&hsd1,512*6,512*7);# a7 J6 C0 g1 K9 r" j
  22.    printf("\r\nErase DATA ENDED\r\n");% {  O+ r- N9 U8 Z
  23. } ) ]/ S" }* y2 K- x% }5 H1 p4 {8 v
复制代码

' [( Y$ }' U. z" l- l7 M( x1 z) p3 K1 h8 \9 v
3.实验现象

最终可以在串口看到正确的实验现象,如下图:

6B@J17L9N}~S1_KJQ8V`GEQ.png

! }7 P: A: _8 E% Y$ T+ S

- L0 X: c7 X! U( D1 s+ g& ], w9 {! F+ Y" h" s/ K

" r# ]7 C& S$ i, @1 t) h2 w. G4 S
赞 收藏 评论0 发布时间:2022-3-8 22:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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