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

基于STM32CubeMX FATFS文件系统经验分享二

[复制链接]
攻城狮Melo 发布时间:2023-6-28 14:56
1.硬件设计
D1指示灯用来提示系统运行状态,串口1用来打印调试信息,使用FATFS文件系统对SD卡进行相关操作
D1指示灯
USART1串口
TF卡
2 r( i8 F+ S* Z
微信图片_20230628145607.png
5 C) O( C& |. u7 U6 M2 k5 `% i
, N* O5 _6 [$ v5 @: G/ h# a
2.软件设计

5 O  W) S" M6 v
2.1 STM32CubeMX设置
. I( _: c* w* C1 H( \- B
➡️ RCC设置外接HSE,时钟设置为72M

2 ^% v$ u2 K: g- O. k% N
➡️ PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
2 M5 ^. T2 A" z1 Q
➡️ USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位

, V  F6 b; a( [
➡️ 激活SDIO,详细请参考SD卡例程
' G" _. @, m  n4 C2 ]' N
➡️ 打开FATFS文件系统,按下图配置,其余默认值

" n6 y0 }) k/ B5 O% G
微信图片_20230628145602.png
, H5 J# _" b, `
微信图片_20230628145558.png
% T% D6 B  x. |
➡️输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
2.2 MDK-ARM软件编程

# }* K! y: _$ |
➡️ 在main.c文件下编写FATFS读写SD卡测试代码

6 |; y5 A$ j8 B
  1. int main(void){4 O1 g4 i9 d3 Q/ z
  2.   HAL_Init();: k% J' s! Q) ]8 a! H7 y, `0 z3 P. w& i
  3.   SystemClock_Config();
    ; U  |3 V, w& `# p: E
  4.   /* Initialize all configured peripherals */7 q; w8 v( h/ T" u: p
  5.   MX_GPIO_Init();0 s! U+ Y& U2 w, P5 N5 y3 R9 M
  6.   MX_CRC_Init();
    9 _, L5 M. O- y* F3 L( J! @
  7.   MX_FSMC_Init();
    7 `( p, f& C+ `) Y0 y; Q/ k
  8.   MX_SDIO_SD_Init();8 b9 ~' p8 }9 W/ ]
  9.   MX_USART1_UART_Init();4 |9 h; F6 L  a( Q! p
  10.   MX_FATFS_Init();2 S, i; q% V4 A& @
  11.   /* USER CODE BEGIN 2 */" \, s/ R# T$ }/ N" A) p% v
  12.   uint32_t byteswritten;               
    ' r8 N( w1 Z! `: w6 G: Y6 U
  13.   uint32_t bytesread;                  
      O1 T1 M0 M# v9 s% M
  14.   uint8_t wtext[] = "This is STM32 working with FatFs";
    ) M% a! V! K: E1 n0 _
  15.   uint8_t rtext[100];                  
    & g. o& z3 Z* h: B3 @. f
  16.   char filename[] = "STM32cube.txt";
    + i) {" E" m3 x) p
  17.   char SensorBuff[100];- ?5 ^* W  s  R- l
  18.   printf("********* STM32CubeMX FatFs Example *********\r\n\r\n");        + R5 u& @, S: o, Z
  19.   if(f_mount(&SDFatFS,SDPath,1) == FR_OK){' W5 }" q/ s: ^2 o7 Y2 U" C$ K6 f0 C) }
  20.     printf("f_mount sucess!!! \r\n");* T8 ?( j! F  t" Z
  21.     if(f_open(&SDFile,filename,FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){
    ( Z4 m: _& }7 v& b/ C7 U
  22.       printf("f_open file sucess!!! \r\n");
    7 `7 Z( E% l6 n  |5 u0 s
  23.         if(f_write(&SDFile,wtext,sizeof(wtext),&byteswritten) == FR_OK){
    + k- W* ], G/ x7 R: `
  24.           printf("f_write file sucess!!! \r\n");8 y, L5 m8 b( Z" w' N2 c9 o
  25.           printf("f_write Data : %s\r\n",wtext);8 V4 x7 ?* Z& f/ w; Q/ ]
  26.           if(f_close(&SDFile) == FR_OK)
    6 u) a! p- Y/ i! [
  27.             printf("f_close sucess!!! \r\n");6 G: c# Y2 f: {! t, t. z7 ]
  28.           else
    ! s  V) a' b) u$ ^* v# J/ ^
  29.             printf("f_close error : %d\r\n",retSD);
    ; o9 ?! u/ O/ g# W) T* S- T) X& [
  30.               }# U- a7 g( J7 z! _
  31.         else, a3 P  z$ k. ~8 }6 J
  32.           printf("f_write file error\r\n");   
    % {( `2 }2 v- i: k, a* G' r6 v
  33.     }
    % E( V9 q. \: T9 p2 L) H
  34.     else) _) Q0 c) ?  F# N
  35.       printf("f_open file error\r\n");  8 Q: v7 o0 Y% x/ V. l/ P- x
  36.   }else
    ) [/ S. S2 u0 @6 v" F( |. w
  37.     printf("f_mount error : %d \r\n",retSD);
    6 ]6 x, \% {  C$ b: y& t& `9 X
  38.                
    1 h) }4 Q7 ~& M+ A/ }
  39.   retSD = f_open(&SDFile, filename, FA_READ);
    2 j' C9 Q) j/ U/ @! ~% Y5 ^
  40.   if(retSD)
    ; h# p( X) Z5 S  W" f
  41.     printf("f_open file error : %d\r\n",retSD);" V1 x- D2 b" T# a2 q# R1 B
  42.   else
    2 ~" B8 G/ Z" R9 g  a
  43.     printf("f_open file sucess!!! \r\n");# E9 _! o8 A1 ]& u& M
  44. ! h; j" c4 {- F0 m+ V/ |! |
  45.   retSD = f_read(&SDFile, rtext, sizeof(rtext), (UINT*)&bytesread);
    4 N/ V9 i8 v( C; d; R
  46.   if(retSD)
    ) v  J# E: p2 @/ F' O9 M
  47.     printf("f_read error!!! %d\r\n",retSD);4 Z) U+ {& j/ V5 Y4 H* C) r0 X, l
  48.   else{% k- c  s; v! n: F  h. R; G- v
  49.     printf("f_read sucess!!! \r\n");
    ! \/ a8 g, D9 ^1 q+ z
  50.     printf("f_read Data : %s\r\n",rtext);
    * a2 x' B' h1 v% b* ]) m. I
  51.   }
    ! B" _( \; k% E: A  z
  52. 5 \5 T% C: d9 F$ R" v( C4 Z
  53.   retSD = f_close(&SDFile);. t& G# q, \, e' w8 Z3 Z. |. D: Z
  54.   if(retSD)+ E& f$ r2 ?: [8 z) Y% Y9 \
  55.     printf("f_close error!!! %d\r\n",retSD);- c' A% {6 O/ o2 V5 |# C% f# \5 a
  56.   else. r; [7 m+ f/ e) Y
  57.     printf("f_close sucess!!! \r\n");
    5 v% ?' P0 \. @: e. _

  58. - g# X0 F. O: W/ @! X
  59.   if(bytesread == byteswritten); F0 H. ^4 i% p! _
  60.     printf("FatFs is working well!!!\r\n");
    % w: w$ P8 U2 c+ g* m' j- o7 y
  61.   if(f_open(&SDFile,(const char*)"Sensor.csv",FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){
    ; `. z% |) w: _7 M2 t
  62.     printf("Sensor.csv was opened/created!!!\r\n");
    8 z1 {; R0 C/ G/ m+ J
  63.     sprintf(SensorBuff, "Item,Temp,Humi,Light\r\n");
    5 w/ i3 {; b2 ]: J6 A7 C
  64.     f_write(&SDFile,SensorBuff,strlen(SensorBuff),&byteswritten);) z( e. `6 D# f) W# S/ O
  65.     for(int i = 0; i < 10; i++){. M' X- j# z+ C# Q+ @
  66.       sprintf(SensorBuff, "%d,%d,%d,%d\r\n",i + 1, i + 20, i + 30, i + 40);
    4 X6 X: y! n# N* p6 P
  67.       f_write(&SDFile,SensorBuff,strlen(SensorBuff),&byteswritten);# j. t  k' w; J$ T) L3 l
  68.       f_sync(&SDFile);/ c" G- D1 p+ r! U* M. f' z# o8 P
  69.     }* w9 g2 Z* U+ P4 P" R2 I% b% Y
  70.     f_close(&SDFile);" |8 W* N) k& _: G: ^  T' I
  71.   }
      Z7 X+ J, X/ a
  72.   while (1){# d. c% k: E" V, f% j" h3 c  e) E" W
  73.     HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);  X2 d0 w7 V* l# W. g5 m( F! H0 Y% ^& X
  74.     HAL_Delay(500);/ a5 J8 y3 U9 {4 L
  75.   }, X9 O) P; K5 u$ V3 I7 u
  76. }
复制代码
3.下载验证
如果使用的是新SD卡,需要在电脑上进行格式化,建立FAT文件系统,FATFS才能识别并操作SD卡
9 o: p; ^" P! `! f- s; A
微信图片_20230628145550.png

. A3 D; G$ a. f/ ~$ J. ?( ~9 k
编译无误下载到开发板后,可以看到D1指示灯不断闪烁,串口打印出如下信息:

! W6 y" ~/ K; M, N1 n/ d
微信图片_20230628145547.png
$ m% H) Y' v6 r: V
将SD卡插入PC后,可以看到SD卡里建立了2个文件:Sensor.csv和STM32cube.txt,打开文件后可以看到写入的数据
! L( Q! x! H2 w- I
微信图片_20230628145544.png
; ]  T, j4 m3 k
微信图片_20230628145541.png
& a" j* E$ C- q+ H& A  {$ L8 F; O
微信图片_20230628145845.png
* D! ?% x" g2 ^# m4 a7 E
转载自: 嵌入式攻城狮
如有侵权请联系删除

7 C7 N% o9 Q* Q0 {5 F8 S4 h
赞 收藏 评论0 发布时间:2023-6-28 14:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

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