STM32
直播中

挽你何用

9年用户 879经验值
擅长:电源/新能源 MEMS/传感技术
私信 关注
[问答]

Fatfs文件系统移植要经过哪几个步骤呢

Fatfs文件系统有何特点?
Fatfs文件系统移植要经过哪几个步骤呢?



回帖(1)

关睿

2021-12-1 09:56:42
1.Fatfs系统

1.1Fatfs文件系统简介

Fatfs是一个免费的FAT文件模块,专门为小型嵌入式系统系统设计。他完全用标准c语言写成,具有良好的平***立性。它支持FAT12、FAT16、 FAT32和exFAT的(R0.12及以后版本),支持多个存储媒介,有独立的缓冲区,可以对对个文件进行读/写,并针对8位单片机和16位单片机做了优化。
FATFS的特点:
Windows 精简的FAT文件系统(FAT12、FAT32和exFAT)
2.与平台工具,移植简单
3.代码量,高
4.多种配置:
(1)支持多卷(物理驱动)或缩小,最多支持10个)
(2)多个ANSI/OEM代码页包括DBCS
(3)长文件名、ANSI/OEM或Unicode
(4)支持RTOS
(5)支持多种卷大小
(6)只读,最小化的API和I / O缓冲区
FATFS的层次结构如下图所示:





2.移植步骤

2.1配置SDMMC

stm32CubeMx配置SDMMC如下图所示:





根据硬件需求,这里将SDMMC1的模式配置成4位。宽总线模式
2.2配置时钟

stm32CubeMx时钟树如下所示:





2.3添加并配置FATFS文件系统

1.由于选择的存储媒介是SD卡,所以FATFS选项勾选SD卡。





2.SDMMC的参数设置使用默认状态,使能SDMMC的收发选择DMA方式。










3.配置FATFS系统-文件





配置完成后生成代码。
3.修改代码调试






需要修改的文件如下:
sd_diskio.h
stm32f7xx_it.c
。主程序C
在sd_diskio.h添加中一个两个函数声明

// 高亮块
void BSP_SD_WriteCpltCallback(void);
void BSP_SD_ReadCpltCallback(void);
在stm32f7xx_it.c中添加一下代码


// 高亮块
#include "ff_gen_drv.h"
#include "sd_diskio.h"


无效DMA2_Stream3_IRQHandler(无效)
{
  /* 用户代码开始 DMA2_Stream3_IRQn 0 */


  /* 用户代码结束 DMA2_Stream3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_sdmmc1_rx);
  /* 用户代码开始 DMA2_Stream3_IRQn 1 */
  BSP_SD_ReadCpltCallback();
  /* 用户代码结束 DMA2_Stream3_IRQn 1 */
}


/**
* @brief 此函数处理 DMA2 stream6 全局中断。
*/
无效DMA2_Stream6_IRQHandler(无效)
{
  /* 用户代码开始 DMA2_Stream6_IRQn 0 */


  /* 用户代码结束 DMA2_Stream6_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_sdmmc1_tx);
  /* 用户代码开始 DMA2_Stream6_IRQn 1 */
  BSP_SD_WriteCpltCallback();
  /* 用户代码结束 DMA2_Stream6_IRQn 1 */
}
主要函数如下:


int main(void)
{
  /* 用户代码开始 1 */
        静态 uint32_t 滴答声 = 0;
  /* 用户代码结束 1 */


  /* MCU配置---------------------------------------------- ------------*/


  /* 重置所有外设,初始化 Flash 接口和 Systick。*/
  HAL_Init();


  /* 用户代码开始初始化 */


  /* 用户代码结束初始化 */


  /* 配置系统时钟 */
  SystemClock_Config();


  /* 用户代码开始 SysInit */


  /* 用户代码结束系统初始化 */


  /* 初始化所有配置的外设 */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDMMC1_SD_Init();
  MX_FATFS_Init();
  MX_USART1_UART_Init();
  /* 用户代码开始 2 */
       
       
       
        printf("rn********sdio test!********rn");
       
        ret = f_mount(&sd_fatfs, "0:", 1);
       
        printf("rnf_mount:%drn", ret);
//       
//         BSP_SD_ReadBlocks((uint32_t *)buf, 0, 1, 10);
//       


//       
        ret = f_open(&sd_file, "0:/test.txt", FA_READ | FA_WRITE | FA_OPEN_ALWAYS);
        printf("rnf_open:%drn", ret);
       
        ret = f_write(&sd_file, w_buf, sizeof(w_buf), &num);
        printf("rnf_write:%d, br:%drn", ret, num);
       
        ret = f_lseek(&sd_file, 0);
        printf("rnf_lseek:%drn", ret);
       
        ret = f_read(&sd_file, buf, sizeof(buf), &num);
       
        printf("rn");
        printf("%s", buf);
        printf("rn");
       
        printf("rnf_open:%d, br:%drn", ret, num);
       
        ret = f_close(&sd_file);
       
  /* 用户代码结束 2 */


  /* 无限循环 */
  /* 用户代码开始时 */
  而 (1)
  {


  /* 用户代码结束时 */


  /* 用户代码开始 3 */
        if (HAL_GetTick() - 滴答数 > 200)
        {
//                 HAL_UART_Transmit_DMA(&huart1, "hellorn", 7);
                滴答 = HAL_GetTick();
                HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
                HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
        }
  }
  /* 用户代码结束 3 */


}


编译之后,现在到加速中,Fatfs 文件系统移植!
需要的是,一定要开启 SDMMC 的中断,才能出现设备一直链接,导致一些问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分