OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 587|回复: 1

《M144Z-M3最小系统板使用指南——STM32F103版》第四十七章 FATFS实验

[复制链接]

1118

主题

1129

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4672
金钱
4672
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-17 16:37:12 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-16 11:21 编辑

第四十七章 FATFS实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

上一章实验中已经成功驱动SD卡,并可对SD卡进行读写操作,但读写SD卡时都是直接读出或写入二进制数据,这样使用起来显得十分不方便,因此本章将介绍FATFS,FATFS是一个通用的FAT文件系统模块,能够帮助实现文件系统,方便对SD卡、NOR Flash或其他存储介质中数据的管理。通过本章的学习,读者将学习到FATFS的基本使用。
本章分为如下几个小节:
47.1 硬件设计
47.2 程序设计
47.3 下载验证

47.1 硬件设计
47.1.1 例程功能
1. LCD上显示SD卡容量和剩余容量
2. 可通过USMART对SD卡和NOR Flash的文件系统进行操作
3. LED0闪烁,提示程序正在运行

47.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块
3. 按键
       WKUP - PA0
4. USART1
       USART1_TX - PA9
       USART1_RX - PA10
5. NOR Flash
       SPI2_SCK - PB13
       SPI2_MISO - PB14
       SPI2_MOSI - PB15
       SPI2_CS - PB12
6. SD
       SDIO_D0 - PC8
       SDIO_D1 - PC9
       SDIO_D2 - PC10
       SDIO_D3 - PC11
       SDIO_SCK - PC12
       SDIO_CMD - PD2

47.1.3原理图
本章实验使用的FATFS为软件库,因此没有对应的连接原理图。

47.2 程序设计
47.2.1 FATFS的使用
FATFS涉及多个文件,在本章实验的配套实验例程中,如下图所示:                                 
1.png
图47.2.1.1 实验例程中的FATFS源文件
对于不同的硬件,使用FATFS仅需修改diskio.c和ffconf.h文件即可,并且本章实验配套的实验例程中的FATFS文件已经针对正点原子M144Z-M3最小系统板STM32F103版进行了移植适配,用户在使用时,仅需直接将这些文件添加到自己的工程,并根据实际需求适当修改diskio.c和ffconf.h文件即可。
为了方便读者使用FATFS,本章实验配套的实验例程另外提供了四个文件,如下图所示:     
2.png
图47.2.1.2 实验FATFS扩展文件
这几个文件中提供了许多便捷使用和测试FATFS的函数,例如:获取文件类型、获取磁盘剩余容量和复制文件夹等。

47.2.2 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.    FRESULT res;
  4.     uint32_t total;
  5.     uint32_t free;
  6.    
  7.    HAL_Init();                         /* 初始化HAL库 */
  8.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  9.    delay_init(72);                     /* 初始化延时 */
  10.    usart_init(115200);                 /* 初始化串口 */
  11.    led_init();                         /* 初始化LED */
  12.    lcd_init();                         /* 初始化LCD */
  13.    my_mem_init(SRAMIN);                /* 初始化内部SRAM内存池 */
  14.    
  15.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  16.    lcd_show_string(30, 70, 200, 16, 16, "FATFSTEST", RED);
  17.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  18.    lcd_show_string(30, 110, 200, 16, 16, "Use USMARTfor test", RED);
  19.    
  20.     while (sd_init() != 0)
  21.     {
  22.          lcd_show_string(30, 130, 200, 16, 16, "SD CardError!", RED);
  23.          delay_ms(500);
  24.          lcd_show_string(30, 130, 200, 16, 16, "PleaseCheck! ", RED);
  25.          delay_ms(500);
  26.          LED0_TOGGLE();
  27.     }
  28.    
  29.    exfuns_init();
  30.    
  31.     /* 挂载SD卡 */
  32.    f_mount(fs[0], "0:", 1);
  33.    
  34.     /* 挂载NOR Flash,如果NOR Flash没有文件系统则需要进行格式化 */
  35.     res= f_mount(fs[1], "1:", 1);
  36.     if (res == FR_NO_FILESYSTEM)
  37.     {
  38.          lcd_show_string(30, 130, 200, 16, 16, "Flash DiskFormatting...", RED);
  39.          res = f_mkfs("1:", NULL, NULL, FF_MAX_SS);
  40.          if (res == FR_OK)
  41.          {
  42.              f_setlabel((const TCHAR *)"1:ALIENTEK");
  43.              lcd_show_string(30, 130, 200, 16, 16,
  44.                              "Flash Disk Format Finish", RED);
  45.          }
  46.          else
  47.          {
  48.              lcd_show_string(30, 130, 200, 16, 16,
  49.                              "Flash Disk Format Error ", RED);
  50.          }
  51.          delay_ms(1000);
  52.     }
  53.    lcd_fill(30, 130, 239, 145, WHITE);
  54.    
  55.     /* 获取SD卡容量 */
  56.     while (exfuns_get_free("0", &total, &free) != 0)
  57.     {
  58.          lcd_show_string(30, 130, 200, 16, 16, "SD CardFatFs Error!", RED);
  59.          delay_ms(200);
  60.          lcd_fill(30, 130, 240, 150 + 16, WHITE);
  61.          delay_ms(200);
  62.          LED0_TOGGLE();
  63.     }
  64.    
  65.    lcd_show_string(30, 130, 200, 16, 16, "FATFSOK!", BLUE);
  66.    lcd_show_string(30, 150, 200, 16, 16, "SD TotalSize:     MB", BLUE);
  67.    lcd_show_string(30, 170, 200, 16, 16, "SD FreeSize:     MB", BLUE);
  68.    lcd_show_num(142, 150, total >> 10, 5, 16, BLUE);
  69.    lcd_show_num(134, 170, free >> 10, 5, 16, BLUE);
  70.    
  71.     while (1)
  72.     {
  73.          delay_ms(200);
  74.          LED0_TOGGLE();
  75.     }
  76. }
复制代码
可以看到,本实验的应用代码中,使用函数exfuns_init()函数为使用和测试FATFS完成一些必要的初始化后,便挂载了SD卡和NOR Flash,并且在NOR Flash上没有文件系统的情况下对其进行格式化,随后借助函数exfuns_get_free()获取SD卡的总容量和剩余容量,并且将其在LCD上进行显示。
本实验还使用到了USMART调试组件,方便使用串口调试助手测试FATFS,usmart_config.c文件中添加的函数,如下所示:
  1. struct _m_usmart_nametab usmart_nametab[] =
  2. {
  3. #if USMART_USE_WRFUNS == 1 /* 如果使能了读写操作 */
  4.     (void *)read_addr, "uint32_tread_addr(uint32_t addr)",
  5.     (void *)write_addr, "voidwrite_addr(uint32_t addr,uint32_t val)",
  6. #endif
  7.     (void *)delay_ms, "voiddelay_ms(uint16_t nms)",
  8.     (void *)delay_us, "voiddelay_us(uint32_t nus)",
  9.    
  10.     (void *)mf_init, "uint8_tmf_init(void)",
  11.     (void *)mf_free, "voidmf_free(void)",
  12.     (void *)mf_mount, "uint8_tmf_mount(uint8_t *path, uint8_t mt)",
  13.     (void *)mf_open, "uint8_tmf_open(uint8_t *path, uint8_t mode)",
  14.     (void *)mf_close, "uint8_tmf_close(void)",
  15.     (void *)mf_read, "uint8_tmf_read(uint16_t len)",
  16.     (void *)mf_write, "uint8_tmf_write(uint8_t *pdata, uint16_t len)",
  17.     (void *)mf_opendir, "uint8_tmf_opendir(uint8_t *path)",
  18.     (void *)mf_closedir, "uint8_t mf_closedir(void)",
  19.     (void *)mf_readdir, "uint8_tmf_readdir(void)",
  20.     (void *)mf_scan_files, "uint8_tmf_scan_files(uint8_t *path)",
  21.     (void *)mf_showfree, "uint32_tmf_showfree(uint8_t *path)",
  22.     (void *)mf_lseek, "uint8_tmf_lseek(uint32_t offset)",
  23.     (void *)mf_tell, "uint32_tmf_tell(void)",
  24.     (void *)mf_size, "uint32_tmf_size(void)",
  25.     (void *)mf_mkdir, "uint8_tmf_mkdir(uint8_t *path)",
  26.     (void *)mf_fmkfs,
  27.                      "uint8_t mf_fmkfs(uint8_t *path, uint8_t opt, uint16_t au)",
  28.     (void *)mf_unlink, "uint8_tmf_unlink(uint8_t *path)",
  29.     (void *)mf_rename, "uint8_tmf_rename(uint8_t *oldname, uint8_t *newname)",
  30.     (void *)mf_getlabel, "voidmf_getlabel(uint8_t *path)",
  31.     (void *)mf_setlabel, "void mf_setlabel(uint8_t*path)",
  32.     (void *)mf_gets, "voidmf_gets(uint16_t size)",
  33.     (void *)mf_putc, "uint8_tmf_putc(uint8_t c)",
  34.     (void *)mf_puts, "uint8_tmf_puts(uint8_t *str)",
  35. };
复制代码
这么一来便可以通过串口调试助手借助USMART调试组件对FATFS进行测试。

47.3 下载验证
在完成编译和烧录操作后,将准备好的SD卡插入开发板板载的SD卡卡座(请确保SD卡中没有有用的数据,或已做好备份),接着若SD卡和NOR Flash都初始化并挂载和格式化成功,便能在LCD上看到SD卡的总容量和剩余容量。
接下来便可以通过串口调试助手借助USMART对FATFS进行测试,例如:“mf_scan_files(”0:”)和“mf_scan_files(”1:”)”可分别查看SD卡和NOR Flash中文件系统根目录下的目录结构等。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2019-8-31
在线时间
55 小时
发表于 2024-5-27 15:23:05 | 显示全部楼层
在例程源码FatFs实验的基础下,稍稍修改了一下,发现程序卡死在了f_open(),想请教一下各位前辈,是我哪里没有注意吗?在此谢过
捕获.JPG
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表