STM32F7+STM32CubeMX5.21+SD+FATFS
1、STM32CubeMX配置
时钟配置
SDMMC配置
Connectivity->SDMMC1
MODE选择: SD 4 bits Wide bus
NVIC Setting
DMA Setting设置DMA读写。
修改CDMMC传输时钟分频。
/* SDMMC Data Transfer Frequency (25MHz max) */
APB2=108MHZ, 108/6=18MHZ。频率过高读写SD卡是会出现FR_DISK_ERR错误。
其他默认
FATFS配置
Middleware->FATFS
在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。
Set->Defines修改两项
其他默认
点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。
2、main函数增加FASFS相关测试代码段。
挂载工作区时,调用bsp_driver_sd.c函数BSP_SD_Init()进行SD卡初始化设置。
- /**
- ******************************************************************************
- * @file : main.c
- * @brief : Main program body
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2020 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * <a href="http://www.st.com/SLA0044" target="_blank">www.st.com/SLA0044</a>
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- #include "dma.h"
- #include "fatfs.h"
- #include "sdmmc.h"
- #include "gpio.h"
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- HAL_SD_CardInfoTypeDef SDCardInfo;
- FRESULT ret_sd;
- uint8_t rtext[100]; /* File read buffers */
- /**
- * @brief The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- BYTE work[_MAX_SS];
-
- FATFS fs; // Work area (file system object) for logical drive
- FIL file; // file objects
- uint32_t byteswritten; /* File write counts */
- uint32_t bytesread; /* File read counts */
- uint8_t wtext[] = "STM32 working with FatFs Test"; /* File write buffer */
-
- char filename[] = "STM32cube.txt";
- /* USER CODE END PV */
- /* Enable I-Cache---------------------------------------------------------*/
- SCB_EnableICache();
- /* Enable D-Cache---------------------------------------------------------*/
- SCB_EnableDCache();
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_DMA_Init(); //开启DMA相关时钟、设置中断优先级
- MX_SDMMC1_SD_Init(); //设置SD初始化变量,并未进行初始化
- MX_FATFS_Init(); //链接兼容的diskio驱动程序并增加活动数量链接驱动程序,创建盘符
- /*----------------------- 文件系统测试:挂载测试 -----------------------------*/
- ret_sd = f_mount(&fs, "0:", 1); //挂载工作区
- /* 如果没有文件系统就格式化创建创建文件系统 */
- if(ret_sd == FR_NO_FILESYSTEM)
- {
- /* 格式化 */
- ret_sd=f_mkfs("0:", FM_FAT, 0, work, sizeof(work));
-
- if(ret_sd == FR_OK)
- {
- /* 格式化后,先取消挂载 */
- ret_sd = f_mount(NULL,"0:",1);
- /* 重新挂载 */
- ret_sd = f_mount(&fs,"0:",1);
- }
- else
- {
- //格式化失败
- while(1);
- }
- }
- else if(ret_sd!=FR_OK)
- {
- //SD卡挂载文件系统失败
- //可能原因:SD卡初始化不成功
- while(1);
- }
- /*----------------------- 文件系统测试:写测试 -----------------------------*/
- /* 打开文件,如果文件不存在则创建它 */
- ret_sd = f_open(&file, "STM32.txt", FA_CREATE_ALWAYS | FA_WRITE );
- if ( ret_sd == FR_OK )
- {
- //打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。/
- /* 将指定存储区内容写入到文件内 */
- ret_sd=f_write(&file, wtext,sizeof(wtext),&byteswritten);
- /* 不再读写,关闭文件 */
- f_close(&file);
- }
-
- /*------------------- 文件系统测试:读测试 ------------------------------------*/
- ret_sd = f_open(&file, "STM32.txt", FA_OPEN_EXISTING | FA_READ);
- if(ret_sd == FR_OK)
- {
- //打开文件成功
- ret_sd = f_read(&file, rtext, sizeof(rtext), &bytesread);
- }
- /* 不再读写,关闭文件 */
- f_close(&file);
- /* 不再使用文件系统,取消挂载文件系统 */
- f_mount(NULL,"0:",1);
-
- HAL_SD_GetCardInfo(&hsd1, &SDCardInfo);
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码
|