当前位置:   article > 正文

【正点原子STM32连载】 第四十七章 FATFS实验 摘自【正点原子】APM32E103最小系统板使用指南_fatfs 正点原子

fatfs 正点原子

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第四十七章 FATFS实验

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

47.1 硬件设计
47.1.1 例程功能

  1. 程序运行后,初始化SD卡,并挂载SD卡和NOR Flash,接着在LCD上显示SD卡的容量信息
  2. 可通过USMART使用FatFs对SD卡和NOR Flash进行文件系统的相关操作
  3. LED0闪烁,指示程序正在运行
    47.1.2 硬件资源
  4. LED
    LED0 - PB5
  5. USART1(PA9、PA10连接至板载USB转串口芯片上)
  6. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  7. SD卡(SDIO驱动)
  8. NOR Flash(SPI驱动)
    47.1.3 原理图
    本章实验使用的FATFS为软件库,因此没有对应的连接原理图。
    47.2 程序设计
    47.2.1 FATFS的使用
    FATFS涉及多个文件,在本章实验的配套实验例程中,如下图所示:
    在这里插入图片描述

图47.2.1.1 实验例程中的FATFS源文件
对于不同的硬件,使用FATFS仅需修改diskio.c和ffconf.h文件即可,并且本章实验配套的实验例程中的FATFS文件已经针对正点原子APM32E103最小系统板进行了移植适配,用户在使用时,仅需直接将这些文件添加到自己的工程,并根据实际需求适当修改diskio.c和ffconf.h文件即可。
为了方便读者使用FATFS,本章实验配套的实验例程另外提供了四个文件,如下图所示:
在这里插入图片描述

图47.2.1.2 实验FATFS扩展文件
这几个文件中提供了许多便捷使用和测试FATFS的函数,例如:获取文件类型、获取磁盘剩余容量和复制文件夹等。
47.2.2 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    FRESULT res;
    uint32_t total;
    uint32_t free;
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    usmart_dev.init(120);                             /* 初始化USMART */
    led_init();                                       /* 初始化LED */
    lcd_init();                                       /* 初始化LCD */
    my_mem_init(SRAMIN);                              /* 初始化内部SRAM内存池 */
   
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "FATFS TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 110, 200, 16, 16, "Use USMART for test", RED);
    
    while (sd_init() != 0)                            /* 初始化SD卡 */
    {
        lcd_show_string(30, 150, 200, 16, 16, "SD Card Error!", RED);
        delay_ms(500);
        lcd_show_string(30, 150, 200, 16, 16, "Please Check! ", RED);
        delay_ms(500);
        LED0_TOGGLE();
    }
    
    exfuns_init();                                    /* 为exfuns申请内存 */
    f_mount(fs[0], "0:", 1);                          /* 挂载SD卡 */
res = f_mount(fs[1], "1:", 1);                    /* 挂载NOR Flash */
/* 没有文件系统,需要进行格式化 */
    if (res == FR_NO_FILESYSTEM)
    {
        lcd_show_string(30, 150, 200, 16, 16, "Flash Disk Formatting...", RED);
        res = f_mkfs("1:", NULL, NULL, FF_MAX_SS);    /* 格式化NOR Flash */
        if (res ==FR_OK)                              /* 格式化完成 */
        {   /* 设置NOR Flash磁盘的名字为:ALIENTEK */
            f_setlabel((const TCHAR *)"1:ALIENTEK");
            lcd_show_string(30, 150, 200, 16, 16, 
"Flash Disk Format Finish", RED);
        }
        else                                          /* 格式化失败 */
        {
            lcd_show_string(30, 150, 200, 16, 16, 
"Flash Disk Format Error ", RED);
        }
        delay_ms(1000);
    }
    lcd_fill(30, 150, 240, 150 + 16, WHITE);
    
    while (exfuns_get_free("0", &total, &free) != 0)  /* 获取SD卡容量 */
    {
        lcd_show_string(30, 150, 200, 16, 16, "SD Card FatFs Error!", RED);
        delay_ms(200);
        lcd_fill(30, 150, 240, 150 + 16, WHITE);
        delay_ms(200);
        LED0_TOGGLE();
    }
    
    lcd_show_string(30, 150, 200, 16, 16, "FATFS OK!", BLUE);
    lcd_show_string(30, 170, 200, 16, 16, "SD Total Size:     MB", BLUE);
    lcd_show_string(30, 190, 200, 16, 16, "SD Free Size:     MB", BLUE);
    lcd_show_num(30 + 8 * 14, 170, total >> 10, 5, 16, BLUE);
    lcd_show_num(30 + 8 * 13, 190, free >> 10, 5, 16, BLUE);
    
    while (1)
    {
        delay_ms(200);
        LED0_TOGGLE();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

可以看到,本实验的应用代码中,使用函数exfuns_init()函数为使用和测试FATFS完成一些必要的初始化后,便挂载了SD卡和NOR Flash,并且在NOR Flash上没有文件系统的情况下对其进行格式化,随后借助函数exfuns_get_free()获取SD卡的总容量和剩余容量,并且将其在LCD上进行显示。
本实验还使用到了USMART调试组件,方便使用串口调试助手测试FATFS,usmart_config.c文件中添加的函数,如下所示:

struct _m_usmart_nametab usmart_nametab[] =
{
#if USMART_USE_WRFUNS == 1      /* 如果使能了读写操作 */
    (void *)read_addr, "uint32_t read_addr(uint32_t addr)",
    (void *)write_addr, "void write_addr(uint32_t addr,uint32_t val)",
#endif
    (void *)delay_ms, "void delay_ms(uint16_t nms)",
    (void *)delay_us, "void delay_us(uint32_t nus)",
    (void *)mf_init, "uint8_t mf_init(void)",
    (void *)mf_free, "void mf_free(void)",
    (void *)mf_mount, "uint8_t mf_mount(uint8_t *path, uint8_t mt)",
    (void *)mf_open, "uint8_t mf_open(uint8_t *path, uint8_t mode)",
    (void *)mf_close, "uint8_t mf_close(void)",
    (void *)mf_read, "uint8_t mf_read(uint16_t len)",
    (void *)mf_write, "uint8_t mf_write(uint8_t *pdata, uint16_t len)",
    (void *)mf_opendir, "uint8_t mf_opendir(uint8_t *path)",
    (void *)mf_closedir, "uint8_t mf_closedir(void)",
    (void *)mf_readdir, "uint8_t mf_readdir(void)",
    (void *)mf_scan_files, "uint8_t mf_scan_files(uint8_t *path)",
    (void *)mf_showfree, "uint32_t mf_showfree(uint8_t *path)",
    (void *)mf_lseek, "uint8_t mf_lseek(uint32_t offset)",
    (void *)mf_tell, "uint32_t mf_tell(void)",
    (void *)mf_size, "uint32_t mf_size(void)",
    (void *)mf_mkdir, "uint8_t mf_mkdir(uint8_t *path)",
(void *)mf_fmkfs, 
"uint8_t mf_fmkfs(uint8_t *path, uint8_t opt, uint16_t au)",
    (void *)mf_unlink, "uint8_t mf_unlink(uint8_t *path)",
    (void *)mf_rename, "uint8_t mf_rename(uint8_t *oldname, uint8_t *newname)",
    (void *)mf_getlabel, "void mf_getlabel(uint8_t *path)",
    (void *)mf_setlabel, "void mf_setlabel(uint8_t *path)",
    (void *)mf_gets, "void mf_gets(uint16_t size)",
    (void *)mf_putc, "uint8_t mf_putc(uint8_t c)",
    (void *)mf_puts, "uint8_t mf_puts(uint8_t *str)",
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

这么一来便可以通过串口调试助手借助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中文件系统根目录下的目录结构等。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/172494
推荐阅读
相关标签
  

闽ICP备14008679号