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

F7-DISCO笔记之三:SD和FATFS 精华

[复制链接]
netlhx 发布时间:2015-8-11 21:40
感觉在F7上尽是些比较复杂的东西了。; G! `6 u0 Q0 J" m9 Z$ c
板载一个TF卡接口,忍不住就塞了块TF卡进去,得配置一下。以前看别人的教程,光一个SD卡驱动流程就晕了,但总得试一下。实际上如果使用HAL库的话,驱动流程要简单得多。: a5 k  g' N2 e  n

# V/ K8 `& [0 O% g& {
  1. uint8_t BSP_SD_Init(void)
    1 D6 c9 t) g# ?$ [6 n! p0 k8 i
  2. { ( {" `: S" I" l& I' l7 _/ P/ j0 O+ Y
  3.   uint8_t sd_state = MSD_OK;
    & [3 N# I2 N' N: p9 |; y) [
  4.   
    . J7 R- A# a4 Y4 C! ]6 d/ _9 M3 k- L
  5.   /* uSD device interface configuration */
    4 n6 \" m2 b$ u  j
  6.   uSdHandle.Instance = SDMMC1;& l% G( _4 h8 O- J0 K; x
  7. 5 p) G" r* k" c7 M' o* \
  8.   uSdHandle.Init.ClockEdge           = SDMMC_CLOCK_EDGE_RISING;
    . x7 h4 Q8 i; l% ]! `: C, B% f
  9.   uSdHandle.Init.ClockBypass         = SDMMC_CLOCK_BYPASS_DISABLE;7 a" _7 |5 z+ q" L% G7 x  {' ^0 Z
  10.   uSdHandle.Init.ClockPowerSave      = SDMMC_CLOCK_POWER_SAVE_DISABLE;
    5 H( N% A5 v* y6 Y1 `) x
  11.   uSdHandle.Init.BusWide             = SDMMC_BUS_WIDE_1B;
    ; [6 h# D# m+ @$ N* {8 N& o
  12.   uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
    0 J- m% Z* \' f$ P* ~+ G0 H- z
  13.   uSdHandle.Init.ClockDiv            = SDMMC_TRANSFER_CLK_DIV;
    2 I5 k+ T( `9 S% ^3 Y
  14.   ! B9 m. W! T5 T& x* ~3 w
  15.   /* Msp SD Detect pin initialization */7 W" n! x; b: N' Z) n
  16.   BSP_SD_Detect_MspInit(&uSdHandle, NULL);' F) D  c2 [; ]2 m
  17.   if(BSP_SD_IsDetected() != SD_PRESENT)   /* Check if SD card is present */
    2 `+ @% ]4 [$ j6 k! t# h5 F2 s8 |
  18.   {4 {% @9 ~& c( K; d+ f! l8 S* [
  19.     return MSD_ERROR_SD_NOT_PRESENT;
    ! B6 k7 r1 k" S6 b+ j! q, d
  20.   }
    % L0 [* o0 {+ g
  21.   
    & a: F* y" Y+ T) S' t( v& ?
  22.   /* Msp SD initialization */
    3 ?4 |7 m) H+ g) b
  23.   BSP_SD_MspInit(&uSdHandle, NULL);
    ' u: H9 @4 r' X( g* Y$ j5 K0 T1 S
  24. * I( f, r) J2 E0 `$ V& w) X. I
  25.   /* HAL SD initialization */
    # d" Z9 J1 F, g3 K. r$ e% w
  26.   if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK)
    % l- {6 k) U. I8 @4 N* b8 T
  27.   {& C% C+ o9 C( x* C  n1 X0 ~" Z8 I
  28.     sd_state = MSD_ERROR;
    & J; b, G9 u) q3 [, G
  29.   }
    3 q8 W: e3 ]- Y+ M) u; Q5 Z
  30.   
    $ D; b  R5 u5 n8 }" N1 v
  31.   /* Configure SD Bus width */
    ' g+ F' h: B' l5 m2 n% r7 F, x
  32.   if(sd_state == MSD_OK)
    # b  k* g- [6 H* E  N- l- M- q$ S
  33.   {
    ' T6 F# P. S* e, q- y! i7 j
  34.     /* Enable wide operation */
    / W% l6 f0 Y! l2 k/ u: k! ^' `2 z$ ]
  35.     if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDMMC_BUS_WIDE_4B) != SD_OK)3 x% G/ Q; a# `& K
  36.     {2 }! z# `6 m- m; w( U' P0 J+ `
  37.       sd_state = MSD_ERROR;, Z- E8 R. v) i4 t  N% o
  38.     }" b- B$ X% C9 C8 ?* q  o+ b
  39.     else
    + j1 f& ]0 l1 M' v9 i3 d
  40.     {! ?$ \' Q9 z6 h2 X
  41.       sd_state = MSD_OK;9 w# S. M+ D1 g- }- I; o: }
  42.     }
    ! Q2 B/ U9 |, J3 S" n: A5 Q" J
  43.   }
    5 |6 D! D5 C; k9 a: D1 R9 r
  44.   
    3 h# g8 x' p) d% _7 O
  45.   return  sd_state;
    7 T, z. j# E! |) c, a8 y/ Z
  46. }0 u3 g; x) c% c1 j# n) R0 p
复制代码
这是从官方例程里截取的驱动SD卡的代码片段,实际上并不怎么复杂。主要的工作流程
" i' _' l$ ~: [+ p6 P: r1 k
  • 设置SD接口的基本参数
  • BSP_SD_IsDetected()检测TF卡是否插上
  • 初始化SD相关的GPIO
  • HAL_SD_Init(&uSdHandle, &uSdCardInfo) 初始化SD
  • 将总线宽度设置为4. [& }% q" w. N% I

  Z+ }. y1 `5 ~% G8 U7 m重头戏在第4步,也就是传统意义上的SD外设驱动过程,仔细一看,原来这个调用的是库函数!ST把初始化工作都作完了,你就调用就行,有没欢喜得晕过去!3 c+ q' v( p3 O, p3 V' m

' d0 T4 V# d# F当然泼冷水的来了,这样子不利于理解外设的工作原理,其实只要你真想了解SD驱动原理,把这个函数反复啃上八遍,不就理解了么?关键还是你自己的态度,哈哈。% l4 k& C) j5 i9 _

+ B6 A6 ?- Y5 A; ]& [  X( X' W( p# v代码就不上了,自己用CUBEMX创建一个工程,设置好参数,好好研究吧。
! N& @; I1 N0 o! G/ Z1 }- @
' Z. R+ G9 _4 J这样子驱动的TF卡停留在底层,要想像在电脑上一样访问TF卡的内容,得另外一个组件:FATFS。
. M  \; m# {' z  Q) _+ s) u9 E3 n4 l+ j5 D" |0 l- g3 \
FATFS就是一个文件系统,配置好后,使用FOPEN, FREAD类的函数就可以访问SD卡上的内容,实际上FATFS是一个硬件无关组件,配置好底层的驱动,可以驱动USB、SPI FLASH等许多存储设备。5 o  U, N3 {! Y5 ~5 {3 S1 M2 g
4 O, a) {/ V; {3 Z6 r
HAL做了大量的工作,帮助我们更好的使用FATFS。
. t% e/ g# d5 A
1 Y' {; I  v) m5 p( r首先在工程里面添加FATFS组件,最简单的办法就是将FATFS整个拷到目标工程下面,然后将相应的支持文件加入到工程当中。  l& }* k8 f# i
- V; |0 b1 ]9 h; ~* g1 d* d1 P) o
QQ截图20150811204114.png ) S1 v' l7 o$ Y$ b/ L

2 c# y; b7 V" g& P& \这些都是要加入到工程中必不可少的文件。
2 n8 F9 o  E6 G/ M  B, S0 e# h
4 v+ ?: S' {1 T" Q, o* \注意最后面的那个文件sd_diskio.c,这个文件就是FATFS与SD接口的桥梁,FATFS执行读写操作,实际上要调用SD的读写函数,下面以读操作为例,
: _; a/ @& r) N/ i( \1 s9 ^7 L: t
QQ截图20150811204732.png
3 p7 g% ]) d( r8 X$ v4 u
9 O  r: s. T3 K接着看$ W5 L* Z( b# r  ]; P, F' O0 g/ n

) h& f" L. B/ G7 U QQ截图20150811213006.png & t6 Q7 F6 ^. u6 D

2 I7 u- m- ~8 D8 ^1 f2 R$ |disk是一个结构体变量,其定义如下# F% _" {+ I/ D4 ^6 P5 }: z; w  V9 T! @$ v

" E1 T! U" h% O3 [2 A: N QQ截图20150811213241.png
9 Z- d4 ^1 g/ i2 z8 S) G3 @
( h/ a6 `) {. M% I; |其中的Diskio_drvTypeDef结构定义如下1 \; a8 F# x' |% Z# G

1 W3 I) r/ I. k0 A9 j QQ截图20150811213051.png
6 t0 y$ R9 U! g  D
, v' J  d3 d0 Q. c* E. A1 s8 x
4 C1 `" n2 {0 V! S: p# l! n: x将SD卡的读写与FATFS的读写连接到一起的是下面这个定义
& Z% c: H4 x! \% ?% w. C9 q
$ M; d, a0 d" [5 x! K% T1 d6 Q. a QQ截图20150811213457.png 4 p: D8 W2 K7 ^+ m
7 a. V0 w0 N$ D( l  O% y
这样,一个f_read操作就被链接到了SD_Read操作,下面就是SD_Read的代码,可以看到该函数执行SD的块读写操作。
) x7 ^3 J2 U* R8 M5 O
/ G4 P3 r+ b* ]/ l+ s0 q) \) C, m) e- p$ R5 ^: V; y
QQ截图20150811213519.png 7 A! s1 T$ D- W2 o7 `* `

+ z* I4 Q+ I! E; N) r嗯,有点乱,该好好捋一捋思路了!
6 ]  I3 L  y' C! w& `5 {# y- N  D0 I4 O# Q, V6 l! r
下面是做实验的结果,将点阵字库放到SD卡上,读写点阵字库输出的效果!
3 ?* S" z/ L2 i# f$ J: l# b8 }: u7 E$ y: s: z( q
IMG_20150811_213804.jpg " Z+ \3 ~1 ^/ z4 h( v

. l5 n: K) a  @  `- M
& n% X& [4 N2 |, q$ `2 N) q

评分

参与人数 1 ST金币 +30 收起 理由
沐紫 + 30 赞一个!

查看全部评分

赞 收藏 2 评论5 发布时间:2015-8-11 21:40

举报

5个回答
netlhx 回答时间:2015-8-11 21:42:55
怎么看点阵字库有点VFD的效果,有么有
shanji 回答时间:2015-8-12 00:02:19
社区图片有logo了
yanhaijian 回答时间:2015-8-12 10:08:47
楼主有心人。
沐紫 回答时间:2015-8-12 10:31:33
谢谢楼主
moyanming2013 回答时间:2015-8-12 11:08:23
学习了。。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版