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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:38
一  配置STM32CubeMX
- k) y  A2 x) h- S/ l1.配置Parameter Settings。(Tips:由于各种卡的品质有区别,有时候可以适当增加clock divide的值)
( ?# T+ O: u5 o5 x* l( |
! s7 s) F8 @8 a: e6 y
201907250945024.png

/ K  t7 T8 ]3 {
9 L7 \5 A( w4 ^0 u- m7 g5 s2 .配置DMA Settings。(Tips:使用FatFs必须开启DMA,在FATFS的Advanced Settings页面,Use dma template只有Enabled)1 D- ~( V/ q* F6 L! g! C  C" e3 U

7 Y5 C. q' U) T: B& L7 D+ y
20190725094828888.png

! Z2 @0 J! a5 ~1 J- E
7 V: M# M. D6 a! S; ]$ K. Y
20190725095305743.png

. ]5 V9 E8 }9 b) s9 F4 m" ~; o4 S& U. I$ J# k( ?# {" N6 ^
3. NVIC Settings 与 GPIO Settings
  l& D! F2 G4 _  h- P; R6 q
8 P# S7 f0 Q% D# I, C$ _* z' A
2019072509505771.png

4 Z+ K4 v! Y% n0 S+ U7 n- e- i) a0 O, v& k# O, m5 M$ w. S# h6 Y
20190725095038643.png

4 a( P2 C0 U3 m
/ h; x; a3 R3 r! R, ~  ~4. 勾选FATFS,一帮情况只需要配置Set Defines下的CODE_PAGE
% `( e( e9 O4 ~! a
' s% @: N1 u/ |
20190725095528492.png
) `6 E- J, p5 y7 C4 o* u5 |/ l5 k
, ~1 {! d- O% v$ B. [) x
二 编写测试代码

$ n3 @6 ^8 }" s! V: x9 f4 ~在自动生成的MX_FATFS_Init函数中添加测试代码。能够正常输出SD容量,则表示SD卡初始化成功。6 W% M& a5 u5 ]* U4 a4 C# B
6 I- }3 s, F1 g8 I% l/ u
  1. void MX_FATFS_Init(void). A+ |0 f5 i: P( W
  2. {/ M: ]& j# Z1 v2 `4 _1 O
  3.     /*## FatFS: Link the SD driver ###########################*/" G6 e) H/ {4 J! `
  4.     retSD = FATFS_LinkDriver(&SD_Driver, SDPath);4 A* P7 J% x' o! _! O
  5. . U6 P3 T# H' R& u! k2 M1 {9 e- R
  6.     /* USER CODE BEGIN Init */1 o* I' a$ i) h/ U) R$ k

  7. 3 V! U% P4 t& |
  8.     /* additional user code for init */
    - ^' {, h9 s' g
  9.     retSD = f_mount(&SDFatFS, SDPath, 1);                                         //挂载SD卡) D# g% }7 h. v
  10.     if(retSD)2 @: U; f) r3 D3 N1 p  ]( ~
  11.     {  E3 L( u1 J/ _* L. `
  12.         Error_Handler();
    ( q* B* R# ^! s/ g
  13.     }4 [6 W9 n6 i; w* ~# G& z
  14.     sd_total_size = (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize;
    ( ]3 t( P, v9 e! t5 x: O3 E2 l( y. b3 D
  15.     sd_total_size = (SDFatFS.csize * (SDFatFS.n_fatent - 2) / 2) >> 10;
    & a0 w- M6 p, l2 c
  16.     sd_free_size  = (SDFatFS.csize * SDFatFS.free_clst / 2) >> 10;9 ?4 x; o9 D/ f1 X( Q: z/ \
  17.     printf("SD Capacity: = %d M", (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize);
    1 w6 r- N+ F: p5 W
  18.     printf("SD Total Size = %d M", sd_total_size);
    - \, t( }8 A4 P7 b9 ]! d
  19.     printf("SD Free  Size = %d M", sd_free_size);% T$ ~4 r; C9 h' V; b# e4 ^. D) L

  20. + q' ]% H! ^1 `6 [# |) z  i
  21.     /* USER CODE END Init */
    2 @. O" u1 e3 o& M6 T, _8 p' B
  22. }
复制代码
( s9 L0 w$ E* L1 y5 I5 S
三  将cc936.c文件中的uni2oem与oem2uni数组转换成bin文件
$ P" \" z; z  M
     由于cc936中的有700k左右,该文件主要是数组uni2oem与oem2uni占用空间大,我们可以将该数组转换成bin格式,烧录进SPI Flash,调用数组中的值改为调用对应SPI Flash中的值,这样可以节省大量的空间。8 K/ j) [) @. I! R

+ y3 t' f. O3 R- A$ [% x5 }" d操作方式如下:
% Q! g3 ?0 u/ ]4 l
; ], E: ~* w% N8 O+ B下载C2B转换助手V1.1软件+ W- `1 n2 m3 r5 G9 n$ S% l4 O

# X0 o- j) S2 k4 c" }4 }
20190807170029936.png

. F, y2 i0 w0 K  ?
  V* `* I. O  P5 `; v0 {新建 UNIGBK.TXT文档,将两个数组 oem2uni 和 uni2oem 存放在该文档中( r7 u5 ]) ~0 `' U4 Z8 M
使用C2B转换助手V1.1软件打开UNIGBK.TXT文档,点击转换生成UNIGBK.BIN文件! Y0 A5 d  z+ E; x! ]7 ~
将UNIGBK.BIN烧录进SPI FLASH(此过程省略,可参考博客:)1 V8 Z* w3 q' }5 u
修改cc936文件中的ff_convert函数如下(代码中的 ftinfo.ugbksize 为我们刚刚生成的 UNIGBK.bin 的大小,而 ftinfo.ugbkaddr 是我们存放 UNIGBK.bin 文件的首地址。):
; n! j" T- X) P# k+ [
  1. WCHAR ff_convert (        /* Converted code, 0 means conversion error */
    . X# u* J" }( ?0 V8 p5 ?
  2.         WCHAR        src,        /* Character code to be converted */
    * ]: g& Z8 i) Q8 F  c/ b
  3.         UINT        dir                /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
    ' o$ }+ v. F- x& |
  4. )
    / |- ?& I+ T3 Y1 t) U& }
  5. {
    % D: Z# f6 ^  e, n2 R! n: \
  6.         WCHAR t[2];
    + H. n3 v  B4 [/ u' _9 g2 R/ x
  7.         WCHAR c;
    . x0 Q) N. q5 t% q7 f' w- J
  8.         uint32_t i, li, hi;
      g/ `  g' W1 }) k, ^5 l6 V: p) R0 I
  9.         uint16_t n;                        
    * a5 g  m; `& L1 Q" n
  10.         uint32_t gbk2uni_offset=0;                  ' [4 U4 L- I6 D/ w# P) H
  11.                                                   # F! z' U0 g; N4 G: \! `
  12.         if (src < 0x80)c = src;//ASCII,直接不用转换.
    ) }+ F, J" Z& s* p# c# E8 ]2 R9 ?% _
  13.         else 5 p4 r9 I# ~) n5 x. [
  14.         {
    . C. N: b% y' z4 p
  15.                  if(dir)        //GBK 2 UNICODE* N& V) J; R; R, Q
  16.                 {  z+ E& }. l- W" z" X, y* {( y: |
  17.                         gbk2uni_offset= ftinfo.ugbksize/2;         
    2 L7 d' P. k4 n
  18.                 }else        //UNICODE 2 GBK  
    " j3 M; h8 f- P1 n: q  G# u1 C
  19.                 {   : Y$ G( y0 g- P2 B9 z& x# L
  20.                         gbk2uni_offset=0;        / Z7 a; v, a8 ], ^1 O" h3 c8 Z
  21.                 }    1 L/ C# F' U" P- u0 _
  22.                 /* Unicode to OEMCP */5 V& M" W6 u9 X7 a5 H% O4 n
  23.                 hi = ftinfo.ugbksize/2;//对半开.
    5 T, f' ~% H" ^2 h1 @, ^1 p
  24.                 hi = hi / 4 - 1;
    0 |3 f/ D0 I2 n, k3 M3 K
  25.                 li = 0;
    7 n9 `* U! @* `) A& @' e
  26.                 for (n = 16; n; n--)2 V8 T$ ^: z, D  i) }
  27.                 {
    . u0 p8 t+ g) {6 K. s' ?
  28.                         i = li + (hi - li) / 2;        & a4 E: T  H- U/ N% s
  29.                         W25QXX_Read((uint8_t*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节  3 U! F/ o- i" s0 v
  30.                         if (src == t[0]) break;% z/ d1 N. \6 Q; j9 I+ G8 E
  31.                         if (src > t[0])li = i;  
    * `" s) x3 z, z/ T
  32.                         else hi = i;      R1 w* w$ w) i7 K. i7 [/ s! t
  33.                 }
    . l; b& t3 a- e0 I8 S0 X
  34.                 c = n ? t[1] : 0;              0 W# l- c) P8 T, n, F! e
  35.         }
    / y  H) i! w/ O' h2 [$ C( ]8 K$ l
  36.         return c;* E; x4 D/ O8 o% Q2 S4 z
  37. }! N) E/ ~7 O9 _( L
  38. ( X  K! b5 @, g+ J
复制代码

1 X& G7 o! H: q+ J! x3 M
6 g; L+ c; J9 B/ S: u1 s/ ?" ~
赞 收藏 评论0 发布时间:2021-12-14 10:38

举报

0个回答

所属标签

相似技术帖

官网相关资源

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