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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:38
一  配置STM32CubeMX
$ [, \+ P9 _7 s! q% H; t! Y4 j1.配置Parameter Settings。(Tips:由于各种卡的品质有区别,有时候可以适当增加clock divide的值)
- @4 y3 _; c5 x
2 g- M5 @' N0 S1 f; [  A  \
201907250945024.png
9 p* p- i/ R2 L& ^

9 L" J+ C9 }7 Y4 J( q8 m9 D' [2 .配置DMA Settings。(Tips:使用FatFs必须开启DMA,在FATFS的Advanced Settings页面,Use dma template只有Enabled)
0 K) w! V3 Z' Y& t! _  ~9 d6 a
20190725094828888.png

; a5 X+ S2 t5 S" w
4 N" y5 K, x3 N
20190725095305743.png

$ Z9 l* ?, S5 Z; t) E) G
, L/ |% X0 Y; M5 m7 s3. NVIC Settings 与 GPIO Settings6 J: x" L# \) z3 c3 H! l6 b$ x
8 L/ k: ~) c/ y7 Z
2019072509505771.png

: c2 b2 E- j$ F" R/ A0 Y9 ^9 B, M1 j. e, Y. ^
20190725095038643.png
% B) K$ c8 `. E, |7 ~4 c

2 y( d4 b! Y: G, J/ t4. 勾选FATFS,一帮情况只需要配置Set Defines下的CODE_PAGE) d4 p5 L5 O: r6 |2 K

' i; u6 l7 |% H8 M; \
20190725095528492.png
( d# x* n7 x  o( S/ n" F

0 ~, o+ s: E% H5 r二 编写测试代码

& i4 n+ ^0 }7 V4 P; _在自动生成的MX_FATFS_Init函数中添加测试代码。能够正常输出SD容量,则表示SD卡初始化成功。
1 N  E% W  q8 O" M* o: i) Y. I
/ W4 P, L0 C( h% Y* `6 E" M% y2 w" B, R
  1. void MX_FATFS_Init(void)) L+ {, P/ _- h6 n
  2. {
    , j  [* e: \- R& j4 B
  3.     /*## FatFS: Link the SD driver ###########################*/
    ) v- F  {% ~, V: s/ m3 B9 k" m" f9 D
  4.     retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
    0 r, S8 v( U9 b7 \0 Q: ?$ A

  5. . Z; U6 D+ s( X( h6 p( @) A9 w3 S7 y
  6.     /* USER CODE BEGIN Init */# b3 F% @& B9 X0 A& [

  7. 7 }% s" w& k  Q2 q" Q
  8.     /* additional user code for init */9 p/ q! D! L$ p/ X9 f5 W
  9.     retSD = f_mount(&SDFatFS, SDPath, 1);                                         //挂载SD卡1 [  M8 W: k% |- ^/ V! v4 y4 a
  10.     if(retSD)/ v. f# p3 U. h: r# c# w
  11.     {
    - C2 X" P2 x; h8 y3 ^
  12.         Error_Handler();
    : j# H4 `/ [+ e, L% T  l, o
  13.     }- `1 v. V4 ^2 [% f
  14.     sd_total_size = (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize;
    ( O/ p2 K, F: a# z
  15.     sd_total_size = (SDFatFS.csize * (SDFatFS.n_fatent - 2) / 2) >> 10;
    9 p# ^' m/ U1 b# z* x4 |
  16.     sd_free_size  = (SDFatFS.csize * SDFatFS.free_clst / 2) >> 10;
    1 q& M& x# O' H1 h- i
  17.     printf("SD Capacity: = %d M", (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize);3 {. W7 z, k6 L7 c
  18.     printf("SD Total Size = %d M", sd_total_size);
    * \1 Z$ T- P2 n3 _/ b
  19.     printf("SD Free  Size = %d M", sd_free_size);
    1 @5 @1 ^( i$ m" m9 q* P( M0 v
  20. # Y' c" _. ^6 H  e6 r- R1 V
  21.     /* USER CODE END Init */
    " z! T$ e1 P1 K$ B8 |
  22. }
复制代码

% u5 w% _% ^6 z. w* G三  将cc936.c文件中的uni2oem与oem2uni数组转换成bin文件
; ?! V, U" ]/ c* N! x
     由于cc936中的有700k左右,该文件主要是数组uni2oem与oem2uni占用空间大,我们可以将该数组转换成bin格式,烧录进SPI Flash,调用数组中的值改为调用对应SPI Flash中的值,这样可以节省大量的空间。' t/ @. x+ |- a" I4 @1 s6 w2 p
8 ^5 }! b/ i. t. x' j; J3 J
操作方式如下:5 D. z$ A; f9 ^

+ {7 B' k9 U8 {; z4 p( k下载C2B转换助手V1.1软件
6 u4 r0 I3 X1 j5 R. p% E2 g( j8 w' U/ {
20190807170029936.png
5 \, R* z2 r, B! f8 D3 N4 P, S: P9 Y
5 y' f8 \. w; \
新建 UNIGBK.TXT文档,将两个数组 oem2uni 和 uni2oem 存放在该文档中
% ]! e  K7 ]  x9 K4 h使用C2B转换助手V1.1软件打开UNIGBK.TXT文档,点击转换生成UNIGBK.BIN文件
* g7 v9 T- I, X& c% L, V0 X; d将UNIGBK.BIN烧录进SPI FLASH(此过程省略,可参考博客:)& ~  \/ N8 Y- c7 z7 o. A
修改cc936文件中的ff_convert函数如下(代码中的 ftinfo.ugbksize 为我们刚刚生成的 UNIGBK.bin 的大小,而 ftinfo.ugbkaddr 是我们存放 UNIGBK.bin 文件的首地址。):
& T  n7 |( t+ g0 i% s- n
  1. WCHAR ff_convert (        /* Converted code, 0 means conversion error */
    , i% T6 Y8 Z+ z( u. a2 E
  2.         WCHAR        src,        /* Character code to be converted */
    ( j/ ?/ i) L  a& W5 `0 O& e0 ]/ j
  3.         UINT        dir                /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
    5 ]+ D* j0 F% H9 N9 r: m: p# E" c. P
  4. )
    3 O( m; |  D# I  G" ]' \
  5. {5 p5 R4 s! E& w( L; d; a7 g
  6.         WCHAR t[2];
    ; ?$ \% U' b& p6 M, V3 z/ A" W) ^
  7.         WCHAR c;$ [. j/ _" i" x( o
  8.         uint32_t i, li, hi;
    * d  {" s9 T' o" Y" w
  9.         uint16_t n;                        
    " `* B$ U9 p  O6 e" x  g
  10.         uint32_t gbk2uni_offset=0;                  . f" {1 M4 C1 s1 c% u
  11.                                                   3 @+ H  ^& w. j
  12.         if (src < 0x80)c = src;//ASCII,直接不用转换.
    # R3 E' `3 w% P) F# w: [0 @
  13.         else 2 R* f6 |+ n. C+ W7 w1 D8 B& I
  14.         {& c/ Z9 y; r( h$ }; F% `. w
  15.                  if(dir)        //GBK 2 UNICODE
    % ^, `& S; ], K. H" f# p6 m9 }% H
  16.                 {9 }  b# i* I/ _& L2 i! T2 F
  17.                         gbk2uni_offset= ftinfo.ugbksize/2;         % @: n& Q4 t; H- e! G" \$ T2 i, U
  18.                 }else        //UNICODE 2 GBK  
    + T* _5 E9 D* H# Z8 c
  19.                 {   
    4 B: j3 ~: a" G/ f7 J' L! N
  20.                         gbk2uni_offset=0;        
    2 D: @* S6 R( g
  21.                 }   
    + F7 W4 q" v, Y# e
  22.                 /* Unicode to OEMCP */& q. j! i4 l. U7 ?- V" `# f- x
  23.                 hi = ftinfo.ugbksize/2;//对半开.% T3 D. D7 l  Q1 Z
  24.                 hi = hi / 4 - 1;8 @6 e1 i- `+ n0 B+ s* S
  25.                 li = 0;
    ' g) D* t0 H) l. `9 ]8 F
  26.                 for (n = 16; n; n--). x& ^- u1 B" K  G- S- a+ S
  27.                 {3 s$ |8 o. y8 s6 m3 C
  28.                         i = li + (hi - li) / 2;        
    $ G5 ]) q* l4 p/ E* p
  29.                         W25QXX_Read((uint8_t*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节  
    $ u$ f. h# D1 \3 z. g8 p
  30.                         if (src == t[0]) break;
    ! @4 S% r: z& L# i$ X/ H8 t
  31.                         if (src > t[0])li = i;  1 t; h& c5 M' z7 z1 j. o  V3 v
  32.                         else hi = i;   
    9 B5 C1 a7 }, b. j9 o
  33.                 }
    $ C5 U! a# v9 M/ {  G# \, L
  34.                 c = n ? t[1] : 0;              ( p9 J# o# v4 P1 q+ A& b1 q4 ]7 b% g  N/ n
  35.         }( s1 @# U# v9 B
  36.         return c;' H/ s) ?2 U. I) s) ]5 ~
  37. }! j& ^' k+ l# B  h
  38. 8 Z+ R7 C+ n' C3 l2 A+ l* h( l
复制代码

# O. i, l# {" C. m
7 o+ L+ X% R% ]+ |9 q. _
收藏 评论0 发布时间:2021-12-14 10:38

举报

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