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

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

[复制链接]
STMCU小助手 发布时间:2021-12-14 10:38
一  配置STM32CubeMX$ z7 c" U6 a: z
1.配置Parameter Settings。(Tips:由于各种卡的品质有区别,有时候可以适当增加clock divide的值)
, z/ p0 u4 d/ r; q- a
8 |# a2 n2 K) ?) A7 L- L
201907250945024.png

& ]% B( j5 d3 S4 T, h. V
1 e. s! T0 ~, P" Z' q% w& q. ^* B# s2 .配置DMA Settings。(Tips:使用FatFs必须开启DMA,在FATFS的Advanced Settings页面,Use dma template只有Enabled)
0 q3 B5 j4 [4 n- l/ a, U! k( H0 n0 c1 u. C
20190725094828888.png

6 g- S8 u1 Z. ]4 j! \( ~% S, b0 i7 U) x% e; ?
20190725095305743.png

4 ~7 {) N; r* Q7 l
  I, o6 b/ h+ I9 v  @3 r* b3. NVIC Settings 与 GPIO Settings
0 f- e" K3 j/ P0 n# b1 g+ F% l- g8 l# g2 @4 P0 v* d' \
2019072509505771.png

; b6 Q+ B' N2 A& Q- }+ L/ N; e
. R/ K) N4 U) N, f0 V
20190725095038643.png
" Z/ L4 Z6 m2 ]. V' K

1 f- Z$ k" T6 e9 g+ ~  s! N$ ?  ]4. 勾选FATFS,一帮情况只需要配置Set Defines下的CODE_PAGE
: E$ r' v- p( F; l
: w0 u0 N5 {9 s3 m% x. H) U
20190725095528492.png

9 H, C5 F, c0 X2 o
# j+ o3 A5 z8 |+ j2 l% G2 T* S8 k二 编写测试代码
! z6 |, ~/ S/ x# D1 Y* F+ H
在自动生成的MX_FATFS_Init函数中添加测试代码。能够正常输出SD容量,则表示SD卡初始化成功。2 S! n1 T. M" Z! f- i0 w
2 ]+ ?  H0 V7 U) T! T% g  h- x
  1. void MX_FATFS_Init(void)
    2 D% A/ r' L4 }- @
  2. {1 X& g  b7 Z  K" b) `4 G$ B8 a, {8 X
  3.     /*## FatFS: Link the SD driver ###########################*/5 w5 F( P# _; K* E, B; T. n- y
  4.     retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
    ( j$ p# z* V7 T0 D! {; E- H* H! K

  5. ) v! y. V) E" I) d% @
  6.     /* USER CODE BEGIN Init */' U) e8 N( A/ F; B
  7. " {9 w2 Z7 i' k" \+ G$ y' |
  8.     /* additional user code for init */
    9 p- Z( w  r* l  {# r" I1 |9 n5 `
  9.     retSD = f_mount(&SDFatFS, SDPath, 1);                                         //挂载SD卡; f  n1 s$ ^) q9 P9 F) c
  10.     if(retSD)9 `9 R+ p; j% f7 m5 d
  11.     {0 a! s$ _# ?6 K1 r
  12.         Error_Handler();4 _% ?) }; z2 [) p% ~
  13.     }
    $ N7 S7 i  t0 }! C; A
  14.     sd_total_size = (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize;
    ; F. V) z9 q; l  i& W
  15.     sd_total_size = (SDFatFS.csize * (SDFatFS.n_fatent - 2) / 2) >> 10;
    0 x8 Z& Q, `3 g1 d* e1 r& U
  16.     sd_free_size  = (SDFatFS.csize * SDFatFS.free_clst / 2) >> 10;; C* y  k# i; }/ q% v
  17.     printf("SD Capacity: = %d M", (hsd1.SdCard.BlockNbr >> 20) *  hsd1.SdCard.BlockSize);2 J( r0 v! [6 D% G* S$ [8 i  b8 O
  18.     printf("SD Total Size = %d M", sd_total_size);
    9 R6 o- E. x# v- c
  19.     printf("SD Free  Size = %d M", sd_free_size);" l) b( {( Q: F; w& d! Y, Y+ a! k, C$ D

  20. ( W0 G6 q" F: A& \) E
  21.     /* USER CODE END Init */
    ) x8 k0 Z8 z6 E
  22. }
复制代码
8 q9 e. A/ b: E( \2 P( R0 {
三  将cc936.c文件中的uni2oem与oem2uni数组转换成bin文件

: S: @) n) m) Y: O0 L     由于cc936中的有700k左右,该文件主要是数组uni2oem与oem2uni占用空间大,我们可以将该数组转换成bin格式,烧录进SPI Flash,调用数组中的值改为调用对应SPI Flash中的值,这样可以节省大量的空间。
: f# o0 T* e7 D1 U- S* b& Z6 Z0 @
5 T4 V2 x1 k4 `/ @" c操作方式如下:
5 P' A6 y/ }# S5 L/ g9 P* j3 V" a: @6 s
下载C2B转换助手V1.1软件& g6 t( n& {) m2 O5 [: C& @" P

/ ^: o$ Y, `5 ~2 W
20190807170029936.png

2 k9 X  j5 ], x8 b" E$ z9 [3 U8 d$ J8 L8 n
新建 UNIGBK.TXT文档,将两个数组 oem2uni 和 uni2oem 存放在该文档中1 I: X* f: L( ^2 [
使用C2B转换助手V1.1软件打开UNIGBK.TXT文档,点击转换生成UNIGBK.BIN文件
& B9 k8 q$ @' _& N+ `( I将UNIGBK.BIN烧录进SPI FLASH(此过程省略,可参考博客:)1 m7 N$ ^" S) C! W* H3 k+ l( T+ b
修改cc936文件中的ff_convert函数如下(代码中的 ftinfo.ugbksize 为我们刚刚生成的 UNIGBK.bin 的大小,而 ftinfo.ugbkaddr 是我们存放 UNIGBK.bin 文件的首地址。):; \6 H9 H- g5 N: z$ f3 g5 F
  1. WCHAR ff_convert (        /* Converted code, 0 means conversion error */$ c& B# c7 E/ E) F4 S; a+ b  w' m9 Y
  2.         WCHAR        src,        /* Character code to be converted */
    " L& h+ e( z/ B% b# b: ?/ k! k
  3.         UINT        dir                /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
    2 A* F7 U9 L9 _/ R* {+ D" @
  4. )
    , d4 S" ]& G0 P9 h
  5. {3 G" w- C# f0 j7 F( |
  6.         WCHAR t[2];. S  w8 o' ?- Q. A$ a
  7.         WCHAR c;0 V& Y4 ^6 X' Q0 J5 u! ~
  8.         uint32_t i, li, hi;
    8 A* R* z6 S( J. c4 p' A
  9.         uint16_t n;                        
      I: z; D% m, c$ l3 w5 ?! @) f6 X
  10.         uint32_t gbk2uni_offset=0;                  8 V7 i0 x# V. ]$ i8 G$ K
  11.                                                   
    ! c0 x' u& i0 y& I
  12.         if (src < 0x80)c = src;//ASCII,直接不用转换.
    3 ~- t% s& z; C! Q2 E0 n* D
  13.         else
    ' [6 X4 }! t+ A( Z+ }7 o' o4 y" ]
  14.         {* d/ D$ b; P  W. a
  15.                  if(dir)        //GBK 2 UNICODE
    ! s" y/ Z- v4 x" Q6 B/ a
  16.                 {
    3 Z" j2 ]) g# R+ t6 u
  17.                         gbk2uni_offset= ftinfo.ugbksize/2;         
    ( w( W) Q* E0 r4 u
  18.                 }else        //UNICODE 2 GBK  # W8 Z2 B& l8 o& q8 n( @6 S
  19.                 {   
    3 O% u0 R* t  @7 C/ n
  20.                         gbk2uni_offset=0;        
    - Y* Q. L" V/ o  O4 D0 }
  21.                 }   
    ( o7 r- U, r. h6 k
  22.                 /* Unicode to OEMCP */
    5 L, {# f+ n0 I5 T) C
  23.                 hi = ftinfo.ugbksize/2;//对半开.
      [6 ~4 G+ r: z( z8 X
  24.                 hi = hi / 4 - 1;
    0 L# P2 V. o1 I! e7 m' p5 M9 v! u) A
  25.                 li = 0;8 }3 _, i/ w9 |: `
  26.                 for (n = 16; n; n--)# p; ^: a/ P' t, c" W" q
  27.                 {9 ?9 N4 E4 M; O4 z) `
  28.                         i = li + (hi - li) / 2;        ( j% x2 _; J# [8 Z8 {6 |
  29.                         W25QXX_Read((uint8_t*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节  6 K& C) U* M! p  j* j% V  R6 e
  30.                         if (src == t[0]) break;
    , |+ T% e2 @+ S/ E  d# I1 a4 p# F
  31.                         if (src > t[0])li = i;  5 X- X4 P. W" F8 Q
  32.                         else hi = i;   
    % T9 S! q: [( v4 O) ~0 @! E
  33.                 }
      A9 D7 d% ]6 I* @5 T
  34.                 c = n ? t[1] : 0;              
    - U1 v. N9 t) d3 L& ]) ?( @
  35.         }0 s! V- O4 [% M1 J
  36.         return c;4 f1 I2 H, `. f2 a1 l6 \
  37. }
    " x$ R, D. N  @+ L4 h

  38. 4 t% y& t$ e8 k0 d% w
复制代码
6 I, S! [& u9 k9 z5 ^  c, K
, k) p7 L9 o8 A& D( M! `* W  [' s
收藏 评论0 发布时间:2021-12-14 10:38

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版