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

【经验分享】STM32CubeMX 5.2配置使用STM32F7 的 SD与FatFs

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:38
一  配置STM32CubeMX) V  ]  y) z$ p8 _. x3 X6 G
1.配置Parameter Settings。(Tips:由于各种卡的品质有区别,有时候可以适当增加clock divide的值)
9 E) {/ }+ l$ I+ l& H3 g' U# ]  N5 n4 ?# X
201907250945024.png

7 z% N8 ^% k, e# b: L* N5 `& P* e' v, L7 t
2 .配置DMA Settings。(Tips:使用FatFs必须开启DMA,在FATFS的Advanced Settings页面,Use dma template只有Enabled)
* B# y7 E3 j+ l$ e$ }8 k8 e. d. {( O% Z- ^9 z2 b0 t
20190725094828888.png

+ v1 R; M! ^! l8 _7 Z) e" a; g3 q) I) E4 U" G6 C% h
20190725095305743.png
' l* W0 f" _: G
% H. U* t* `. b2 Q% g6 ^' R5 E6 _
3. NVIC Settings 与 GPIO Settings
5 @4 Y& b; C1 r* d$ J
% n; y) y) W. u
2019072509505771.png

7 V! _1 J( Q( I4 u$ O4 w
! w5 A; P8 d4 K- d# ^! S
20190725095038643.png

. S' r, @# C6 I: o" i
9 ^, m5 c) R" }# `% V4 M( T3 c4. 勾选FATFS,一帮情况只需要配置Set Defines下的CODE_PAGE
9 p/ `' Y, W* E- i. o% U: @3 b! M4 p- C
20190725095528492.png
, Q# |) F& ~; R, m6 X0 m# F( w
* A6 y% @; @+ l( F6 |% \
二 编写测试代码

' B0 J& {5 Z" q6 z1 O+ ~在自动生成的MX_FATFS_Init函数中添加测试代码。能够正常输出SD容量,则表示SD卡初始化成功。( ]. D9 n/ N# ]: n% e

( F, G+ Z- h+ m8 @& k. D
  1. void MX_FATFS_Init(void)2 A- X5 P! ~1 ^  U8 C( u
  2. {$ x- P/ J: F0 t
  3.     /*## FatFS: Link the SD driver ###########################*/
    $ G/ l8 l% Z* _4 A6 w& P- D( o5 ?
  4.     retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
    ( W& ^$ p) k& g: f5 z- x5 h* i
  5. ) T7 l* p, N& R( K; k+ n' X8 f# I
  6.     /* USER CODE BEGIN Init */
      [2 x+ I2 M: s% C

  7. . [" }2 G, B; C9 z- m& q' ^! m0 d
  8.     /* additional user code for init */5 V$ A4 b- N' T; u$ o( A' O' J
  9.     retSD = f_mount(&SDFatFS, SDPath, 1);                                         //挂载SD卡
    * D- T, Z) Y! a
  10.     if(retSD)
    9 v( `9 V, W% P8 }- M
  11.     {
    ) I) a0 N& f1 e+ W  {
  12.         Error_Handler();8 a2 L8 g1 G. j1 N& F
  13.     }
    ! M  H+ b8 N( H
  14.     sd_total_size = (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize;
    % Y0 ~; b/ P) c$ J% J4 |) C
  15.     sd_total_size = (SDFatFS.csize * (SDFatFS.n_fatent - 2) / 2) >> 10;
    " }9 m& M7 `$ z2 q8 V
  16.     sd_free_size  = (SDFatFS.csize * SDFatFS.free_clst / 2) >> 10;% Z! d; C8 v8 \! J# e8 p
  17.     printf("SD Capacity: = %d M", (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize);
    & R. g, z/ v( [3 p6 ^
  18.     printf("SD Total Size = %d M", sd_total_size);
    , a+ z" Q" a8 O$ {5 J% I  d
  19.     printf("SD Free  Size = %d M", sd_free_size);% A9 j  m) s# |% S. L

  20. $ {7 ^" i1 ^  i0 H
  21.     /* USER CODE END Init */
    3 ^+ N4 y* ]! b
  22. }
复制代码
0 \; {6 I6 j% N2 W
三  将cc936.c文件中的uni2oem与oem2uni数组转换成bin文件

$ R8 h' a- j+ I8 w     由于cc936中的有700k左右,该文件主要是数组uni2oem与oem2uni占用空间大,我们可以将该数组转换成bin格式,烧录进SPI Flash,调用数组中的值改为调用对应SPI Flash中的值,这样可以节省大量的空间。2 ?% b( Y; S6 b, t: a" K
- e' k; K! N1 J! I5 R# I
操作方式如下:: L2 y; b- d4 l' L+ R

6 i1 j- i. |& _: C1 a6 W下载C2B转换助手V1.1软件
. ~0 E# I+ h% h4 h$ ]- \: U5 R8 f& H! I' u! Z$ ?* J
20190807170029936.png

1 s) l* V$ ]+ j( M
) s1 a. e. W- e新建 UNIGBK.TXT文档,将两个数组 oem2uni 和 uni2oem 存放在该文档中% [; ?: O$ b! Q% u% r
使用C2B转换助手V1.1软件打开UNIGBK.TXT文档,点击转换生成UNIGBK.BIN文件
6 ?$ ^% \$ S; M8 B将UNIGBK.BIN烧录进SPI FLASH(此过程省略,可参考博客:)
, d$ u1 L( f6 d' M/ v修改cc936文件中的ff_convert函数如下(代码中的 ftinfo.ugbksize 为我们刚刚生成的 UNIGBK.bin 的大小,而 ftinfo.ugbkaddr 是我们存放 UNIGBK.bin 文件的首地址。):1 D+ ~7 F+ y7 l8 C# ~8 X: g3 Y2 T; _
  1. WCHAR ff_convert (        /* Converted code, 0 means conversion error */; J( Y. O$ z4 l4 a
  2.         WCHAR        src,        /* Character code to be converted */
    5 ]( r) m8 A- G8 Q  s9 K& j9 l. N5 X
  3.         UINT        dir                /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */& q+ Z8 Y% v- P# [6 i, M6 [* r5 a
  4. )
    $ P! R& N5 p# _' B/ p* a
  5. {
    3 ?6 v5 J9 l4 o& X! w. ?& ?9 ?
  6.         WCHAR t[2];
    ' ~5 \+ p0 ^, I! |( {7 a
  7.         WCHAR c;
    0 ?& Q  g- q1 g
  8.         uint32_t i, li, hi;
    ' p7 L8 g. D* m/ @# O$ Z1 g
  9.         uint16_t n;                        
    9 w- ?1 ]. E" m$ e8 J8 y, I- c
  10.         uint32_t gbk2uni_offset=0;                  
    ; R1 Y. ?4 w4 }6 s
  11.                                                   0 x. a, o$ y2 C7 H& W! j. h
  12.         if (src < 0x80)c = src;//ASCII,直接不用转换.
      S+ D0 A) d: D0 \+ K
  13.         else ! t5 l, V5 d9 _
  14.         {
    9 R# W3 |5 A# c# w7 n' L5 R/ G. A
  15.                  if(dir)        //GBK 2 UNICODE
    $ ]2 e. Y5 U( Q' B6 i$ V5 {9 y
  16.                 {4 d; V& f* [* t* l; e5 F! ~
  17.                         gbk2uni_offset= ftinfo.ugbksize/2;           A( l+ h/ _; O8 n
  18.                 }else        //UNICODE 2 GBK  * g7 T  _( _) w1 l5 m; `3 D/ p
  19.                 {   
    * z6 k8 C  ~: ~' n- K$ l
  20.                         gbk2uni_offset=0;        6 u' [! ]/ d8 z4 E& ]' F
  21.                 }    ' e/ N0 ?3 N, b: Y
  22.                 /* Unicode to OEMCP */
    - x! @6 D  o% _  B4 k/ v! K' a  q
  23.                 hi = ftinfo.ugbksize/2;//对半开.
    * p. x# K. K" U8 H, R# c
  24.                 hi = hi / 4 - 1;
    & g5 g' A: ^5 v8 Q
  25.                 li = 0;2 X# p; p' s+ @7 T: M- J
  26.                 for (n = 16; n; n--). g  F. [" V* r, t: _& g
  27.                 {$ Y3 D/ ^# V9 b5 f7 t! b
  28.                         i = li + (hi - li) / 2;        5 i4 W# u9 I7 A; B; O2 Y  n
  29.                         W25QXX_Read((uint8_t*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节  9 V: Y$ n) ^0 j2 z
  30.                         if (src == t[0]) break;
    & A2 A" r. f) {+ I  ?/ ~% ?; a
  31.                         if (src > t[0])li = i;  : w. p& ~+ J6 D4 z" ?
  32.                         else hi = i;    % H1 |/ A: d& T5 U
  33.                 }8 _: i* k* A/ M) a8 D7 C
  34.                 c = n ? t[1] : 0;              5 T0 P9 e9 _# m  ?9 n* H
  35.         }# }5 f& R% m3 N8 K0 Q
  36.         return c;
    ' G4 T. w( L( Q# P2 }3 C$ C
  37. }2 [* U2 s7 N& i. c" Y4 q/ d# l
  38. 9 ]' S2 w8 R0 c- F! d& ]- M8 [# W
复制代码
5 l7 G% D: J+ _) V, t' H; o

! x8 b+ D% u: p" M7 K
收藏 评论0 发布时间:2021-12-14 10:38

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版