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 的中断,才能出现设备一直链接,导致一些问题。
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 的中断,才能出现设备一直链接,导致一些问题。
举报