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

【经验分享】STM32F7+STM32CubeMX5.21+SD+FATFS

[复制链接]
STMCU小助手 发布时间:2021-12-17 12:05
STM32F7+STM32CubeMX5.21+SD+FATFS2 P6 Y! c0 W' A: _, E/ Z
1、STM32CubeMX配置/ ?( X9 d9 U& H& }! d' g
时钟配置

0 c  @3 F" ]" }; q$ [! N2 Z, D* x9 m1 N! I' D# m( v) f
20200820170455578.png

' }1 N2 K* V7 y2 c& P
' i  `' d- z) @! [SDMMC配置, i, e' r/ t) H2 y( D
  Connectivity->SDMMC1
- j7 y$ ^* S$ k+ E9 C- H" \$ {    MODE选择: SD 4 bits Wide bus; j1 I. P4 ]$ G& i' i
    NVIC Setting4 d' x. f% o) ]' {+ j) F
20200820170641524.png
% I: A1 b! }7 ?" K4 r- Y( C

' u/ I8 T1 c1 ?% ~  DMA Setting设置DMA读写。
$ N; S% h# `! r3 z. u1 z; P+ \" Z: m2 M2 D% j1 V( x3 o; T
20200820170709472.png
. O. a5 i" r* ^: Y6 P& a
" Q$ E! ~* l5 m3 g
  修改CDMMC传输时钟分频。
3 W3 f8 _2 y5 Z- ^, Z& q4 v1 F  K# b( V  /* SDMMC Data Transfer Frequency (25MHz max) */
2 z$ n, \1 T2 {9 Y# T  r* E  APB2=108MHZ, 108/6=18MHZ。频率过高读写SD卡是会出现FR_DISK_ERR错误。
* R' v1 B/ \4 x0 m) G
) @9 ]" L; K' h4 G3 v+ r3 ]
20200820170836459.png

9 q) s: Z8 h, \. C0 Q5 L
  t, q6 S5 u' H4 }$ \* X  其他默认
1 v5 C8 q+ A7 F5 {/ E# d1 f" l4 L8 ?. M$ ^" u+ S
20200820170900683.png
/ ?! l$ \$ t) V% R: C7 a

3 N, ?0 K- M% D# S! B6 h  TFATFS配置
9 [+ ~% T# p. X- f3 c  U  Middleware->FATFS
+ q$ i$ S( w: B, |: I  在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。) @$ l; `, u$ T4 b1 l( ^
  Set->Defines修改两项$ }1 ]! E- B+ E5 Z0 G
  其他默认: W- Y/ R3 @9 _" d! _
1 I' u0 ]$ u' f3 Y; U6 {2 H% q( M0 @& k
20200820171411382.png
% `9 J% t! }8 v( }3 c
  [( g5 C# O7 Q# D3 N1 M
  点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。6 `0 ^3 q! z. J/ N

3 e8 |( G, s7 x, |6 |, r- @/ s
20200820171503585.png
* `; q, r  k; r% s% N
' ~, l8 Y/ ^4 Q, |
2、main函数增加FASFS相关测试代码段。
% G# I3 M% t/ t0 H  挂载工作区时,调用bsp_driver_sd.c函数BSP_SD_Init()进行SD卡初始化设置。4 B3 X: g3 q0 o( K9 d5 L" y" {

- f3 B- S$ J: |; `9 I7 [4 z
  1. /**
    9 z* N" ]7 p$ Z% @3 V& x+ B. U$ i: F
  2.   ******************************************************************************( {: O$ ^- D/ M
  3.   * @file           : main.c1 \3 |2 c+ M4 O) d
  4.   * @brief          : Main program body6 b0 @& X1 ?& t2 ~1 P; ]' l1 H
  5.   ******************************************************************************
    $ f2 X$ x. o# n  @9 e% o( y
  6.   * @attention
    ; h9 \" F( T5 \3 I
  7.   *+ c+ {% l8 i8 z% m' n6 K' @) k/ f
  8.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.% e' q" S; |! W
  9.   * All rights reserved.</center></h2>) k! S4 R! n; v4 j4 ]1 T9 T/ Q
  10.   *
    : L0 \/ ~; v+ x+ i) e
  11.   * This software component is licensed by ST under Ultimate Liberty license* T8 u( r3 Y9 ~2 [' w2 {& z
  12.   * SLA0044, the "License"; You may not use this file except in compliance with
    3 C( Y% J: S* B) z1 O4 e
  13.   * the License. You may obtain a copy of the License at:+ N! a, ]  G+ m  m; F, U
  14.   *                             <a href="http://www.st.com/SLA0044" target="_blank">www.st.com/SLA0044</a>- D+ L, J& R/ g
  15.   *
    3 {4 T+ B: \, F% B6 I( E
  16.   ******************************************************************************
    : Z) x1 g2 V: A8 l6 x* [* l& O* M
  17.   */
    # }6 |( H3 u: u# Y* ]
  18. /* USER CODE END Header */
    " h3 q. t: i1 f

  19. 5 r8 M2 o; j/ L( H
  20. /* Includes ------------------------------------------------------------------*/9 s- g1 F$ i/ h/ M# |2 |8 T/ w
  21. #include "main.h"2 }" Q% F% F. H9 t# B# j
  22. #include "dma.h") L6 G# Z$ U' h$ j% f
  23. #include "fatfs.h"
    4 B4 @* s0 B. Q& n
  24. #include "sdmmc.h"
    * T" n7 \. P; E# z9 v# [
  25. #include "gpio.h"
    8 y' w6 T' H9 Q

  26. 5 c9 ]/ N6 h) P& i. h
  27. /* Private function prototypes -----------------------------------------------*/  b6 q; f. T, r; [
  28. void SystemClock_Config(void);, q" Q8 Y1 A/ w- I7 ]4 F* P
  29. 8 {( j9 ~& g4 G, U; [$ D' w) N
  30. HAL_SD_CardInfoTypeDef  SDCardInfo; % R& k& o1 {; Z8 I7 L7 `

  31. 5 N- s; q, [% b; O2 a/ b
  32. FRESULT ret_sd;
    / q6 X& |6 d+ `" k& H5 c

  33. 1 u* B+ ], z' b
  34. uint8_t rtext[100];                     /* File read buffers */1 G, z  U- A6 G" M5 w- f+ }+ d0 H" S
  35. ! u% A( B; x/ z
  36. /**
    % m8 v' d2 h: \. J
  37.   * @brief  The application entry point.
    0 }/ S5 V/ b7 r5 J2 P/ p
  38.   * @retval int- a& f4 ^5 Y8 }3 @
  39.   */$ B" f0 P. ?7 O- d1 _/ L/ m" }
  40. int main(void)6 U! L5 B( T6 W; y% g7 q* o6 j
  41. {
    # ]! Z& G6 b# y  C
  42.   /* USER CODE BEGIN PV */+ q) Q. p, d* {. _# Q
  43.         /* Private variables ---------------------------------------------------------*/2 f' c6 q1 x" V
  44.         BYTE work[_MAX_SS];
    7 u6 t1 T# A; d0 g- M4 p
  45.         8 Y) u- q" K& u: g" v0 }; \6 H
  46.         FATFS fs;                 // Work area (file system object) for logical drive& t1 W5 p0 h# p+ c5 _- q8 ]7 R
  47.         FIL file;                  // file objects
    $ y/ B: s0 `" o' i2 G+ I" G
  48. % b( P: W( x. _. Z9 P
  49.         uint32_t byteswritten;                /* File write counts */1 ^2 s1 o2 k) Z) c5 |$ }
  50.         uint32_t bytesread;                   /* File read counts */
    8 v2 A: c4 a/ J, v# J4 {2 |$ |

  51. + a% u( w+ o0 m! Q- C
  52.         uint8_t wtext[] = "STM32 working with FatFs Test"; /* File write buffer */
    7 L5 d8 w' P8 k- D7 N. f
  53.         6 G/ Y  I5 X% ]6 J( @
  54.         char filename[] = "STM32cube.txt";
    + ~" j- r9 i& Y& s8 a
  55.         /* USER CODE END PV */
    ; w  I; m1 w& \; j1 R
  56. % g' u9 g: m( \" O7 S  b$ q3 W
  57.         /* Enable I-Cache---------------------------------------------------------*/
    4 V8 r6 C8 s! o7 ^- X$ g
  58.         SCB_EnableICache();
    % {( Y( `4 @- k# G6 m3 }

  59. / f( `- M$ r+ N$ u1 f) o1 v
  60.         /* Enable D-Cache---------------------------------------------------------*/
    - d9 U# I7 d5 Q/ K
  61.         SCB_EnableDCache();9 }- J( y; K* J

  62. . H* R5 W: d4 ?5 E; r5 W
  63.         /* MCU Configuration--------------------------------------------------------*/
    : \" e' H& Z& M

  64.   K/ t5 _& O3 g) o- p/ i- k
  65.         /* Reset of all peripherals, Initializes the Flash interface and the Systick. */9 }+ k, p/ e) Y" f+ A; u4 e# g
  66.         HAL_Init();6 [( S9 H4 N8 ?

  67. , s( y8 R; a+ X* }; H) L
  68.         /* Configure the system clock */
    1 d) L* i; X/ J; d7 a
  69.         SystemClock_Config();& p4 z0 W1 \3 H% q9 ~
  70. # P  v& L( S4 S( O
  71.         /* Initialize all configured peripherals */8 \% \2 `' ^: c( w9 t
  72.         MX_DMA_Init();                        //开启DMA相关时钟、设置中断优先级6 o) E2 a9 a1 H$ o. w0 {1 c( W% K
  73.         MX_SDMMC1_SD_Init();        //设置SD初始化变量,并未进行初始化+ T8 P$ o' n, F0 y7 r
  74.         MX_FATFS_Init();                //链接兼容的diskio驱动程序并增加活动数量链接驱动程序,创建盘符3 K% ?8 B$ F8 T* X& Z5 \

  75. 6 N0 n" A2 L8 C2 s0 b: n
  76.         /*----------------------- 文件系统测试:挂载测试 -----------------------------*/
    ( ?* Z! h3 F0 c3 W0 e
  77.         ret_sd = f_mount(&fs, "0:", 1);        //挂载工作区
    ( o3 w2 O6 S8 a3 G8 i, q
  78.         /* 如果没有文件系统就格式化创建创建文件系统 */
    9 c1 ^$ o2 ]3 a
  79.         if(ret_sd == FR_NO_FILESYSTEM)
    1 |  m' ^  ~7 ]% p( ^
  80.         {6 s6 |# e$ V# R
  81.                 /* 格式化 */
    8 {% l% R+ [+ H6 l) W5 o
  82.                 ret_sd=f_mkfs("0:", FM_FAT, 0, work, sizeof(work));                                                        
    ; c# n, {9 Y) u3 f3 O
  83.                 1 l: V& L; R2 w8 N0 h9 k! k9 x
  84.                 if(ret_sd == FR_OK)' @( H5 L* A7 x' N" M) g
  85.                 {8 m  `9 M* ^% A+ S* o. ?" T+ y* [3 ^% ^
  86.                         /* 格式化后,先取消挂载 */
    $ g8 Q7 h, ^8 J& w$ [
  87.                         ret_sd = f_mount(NULL,"0:",1);                        
    + n5 u  Q/ m+ u+ I! P/ {
  88.                         /* 重新挂载        */                        1 Z. y+ G6 M0 N9 `6 s% x6 c( M
  89.                         ret_sd = f_mount(&fs,"0:",1);/ }) h8 x2 \7 a
  90.                 }9 y) @/ y$ p# R% o9 r/ i
  91.                 else  \) w& M/ G: Z
  92.                 {! ~( s2 b6 D4 a) N
  93.                         //格式化失败
    ' h' j0 Y* k5 O' q! C7 @/ L5 N5 S6 C
  94.                         while(1);
    ' D1 G6 Q+ x6 F0 q) j
  95.                 }9 Y' j( M1 N  N0 F
  96.         }6 g3 Q8 u5 L4 f! @
  97.         else if(ret_sd!=FR_OK), j8 M7 {* g. N) \: d/ T# Y
  98.         {/ a+ `# G& o8 z
  99.                 //SD卡挂载文件系统失败' b2 f0 q/ ?, _8 Y: ~
  100.                 //可能原因:SD卡初始化不成功4 z; n( Q) H. M- P: H7 N$ m8 H
  101.                 while(1);$ p3 o& `4 W- m6 L) }1 w$ u  |3 a
  102.         }6 _$ L3 q; c" j% _
  103. 4 O9 e% F! Z9 L% Q$ {+ Y$ R- E
  104.         /*----------------------- 文件系统测试:写测试 -----------------------------*/
    : {+ C5 R* o3 M+ E1 P! q$ \6 m
  105.         /* 打开文件,如果文件不存在则创建它 */
    7 e1 R7 [. n( h  r, _( f) n
  106.         ret_sd = f_open(&file, "STM32.txt", FA_CREATE_ALWAYS | FA_WRITE );$ ?7 i, E' g/ W$ U5 F( k" H- t
  107.         if ( ret_sd == FR_OK )
    " M. b, o) J. x& h2 t& x* g
  108.         {
    % t- Z6 c, O& n! Q4 _, w
  109.                 //打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。/
    - n9 A$ A- j1 |3 r+ Y3 n
  110.                 /* 将指定存储区内容写入到文件内 */4 x6 L8 x1 P! W
  111.                 ret_sd=f_write(&file, wtext,sizeof(wtext),&byteswritten);
    + n  l" q8 w+ \% P6 Q6 D

  112. : a; s+ b/ D0 y) R$ \3 G
  113.                 /* 不再读写,关闭文件 */; C' y: O1 J' G
  114.                 f_close(&file);
    ! m3 K0 ~9 g  p2 b0 Q
  115.         }; B  v8 |0 Z% l
  116. . v+ h* {/ }  p
  117.         
    ) F, h/ Q9 s. k9 @
  118.         /*------------------- 文件系统测试:读测试 ------------------------------------*/
    + u: L! O# y; v' s- z
  119.         ret_sd = f_open(&file, "STM32.txt", FA_OPEN_EXISTING | FA_READ);         
    0 \; h6 d) g6 s; ?$ y: d) m: ^
  120.         if(ret_sd == FR_OK)& R/ U2 r* Z% p/ Y" e( @& o
  121.         {
    ' O  ]' H+ ]# x- x8 e9 }4 Q
  122.                 //打开文件成功6 `$ J0 U! Q2 l! M& {) U4 c
  123.                 ret_sd = f_read(&file, rtext, sizeof(rtext), &bytesread);                 
    2 T# K* ~: V) M6 R
  124.         }, s2 ]' ~. b" ?! r# v

  125. : F8 S$ ?: k2 }5 z/ U; g' s+ k
  126.         /* 不再读写,关闭文件 */
    ; X8 v- @4 V& x
  127.         f_close(&file);        
    1 z$ X9 `0 M: P

  128. ; p2 N3 K" C( Z' }" w$ u" g' Z
  129.         /* 不再使用文件系统,取消挂载文件系统 */2 g( ~% o5 \( A+ F" ^/ C
  130.         f_mount(NULL,"0:",1);
    , @' t- x! F  I6 ~
  131.         
    + k) a3 I9 h6 O5 j( d
  132.         HAL_SD_GetCardInfo(&hsd1, &SDCardInfo);
    ( W; E' Y5 K" |/ w

  133. 6 ~% p/ y/ X& k( o: P
  134.         while (1)
    5 B; s; t6 \+ g# W
  135.         {
    + O1 v( @) u! q4 Q7 c0 O  u" \  {5 }- v2 e
  136.                 /* USER CODE END WHILE */
    6 X9 J7 }. b8 a4 N4 A4 q# l

  137. , [; w- ~& t( g- q* T( Z
  138.                 /* USER CODE BEGIN 3 */, ~' X9 h4 V; d
  139.         }7 m; P3 s# E6 E; ]
  140.   /* USER CODE END 3 */& L1 V) |8 q" |. |/ n3 H+ M3 s
  141. }+ e: v" z6 [+ n6 P% v0 D- r3 s: N- {
  142. 4 Q- [; ?( E5 D
复制代码
4 @* F4 a& ~* C8 w4 t" t

3 y& e& w" q+ D: t7 E' w5 }/ C
收藏 评论0 发布时间:2021-12-17 12:05

举报

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