STM32Cube配置SdCard+DMA+FatFs

配置其实没什么好说的,基本都是默认参数,或者FATFs里根据需求更改配置就行。

需要注意的是栈的设置,默认的栈大小为0x200,需更改大一点,如0x1000。

STM32Cube配置如下。

STM32Cube配置SdCard+DMA+FatFs_第1张图片

STM32Cube配置SdCard+DMA+FatFs_第2张图片

STM32Cube配置SdCard+DMA+FatFs_第3张图片

以上是SDIO和Uart的配置。

下面是FatFs的配置:

STM32Cube配置SdCard+DMA+FatFs_第4张图片

编码选择简体中文(DBCS)

平台设置需选择SD卡插入检测引脚,就是一个普通引根据原理图脚配置成输入就行,

STM32Cube配置SdCard+DMA+FatFs_第5张图片

然后就是需要更改栈大小了,默认是0x200,更改为0x1000

STM32Cube配置SdCard+DMA+FatFs_第6张图片

。配置完成后生成代码。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDIO_SD_Init();
  MX_USART1_UART_Init();
  MX_FATFS_Init();
  /* USER CODE BEGIN 2 */
	HAL_Delay(100);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

//	SD_Test();
	FatFsTest();
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

文件系统测试函数,参考硬石的代码

void FatFsTest(void)
{

FIL file;													/* 文件对象 */
FRESULT f_res;                    /* 文件操作结果 */
UINT fnum;            					  /* 文件成功读写数量 */
BYTE ReadBuffer[1024]={0};        /* 读缓冲区 */
BYTE WriteBuffer[]= "新建文件系统测试文件\n";
BYTE work[512];
    //在SD卡挂载文件系统,文件系统挂载时会对SD卡初始化
    f_res = f_mount(&SDFatFS,(TCHAR const*)SDPath,1);
//						f_mount(&SDFatFS, (TCHAR const*)SDPath, 1);

    /*----------------------- 格式化测试 ---------------------------*/  
    /* 如果没有文件系统就格式化创建创建文件系统 */
    if(f_res == FR_NO_FILESYSTEM)
    {
      printf("》SD卡还没有文件系统,即将进行格式化...\n");
      /* 格式化 */
      f_res=f_mkfs((TCHAR const*)SDPath,FM_ANY,0,work,512);		//					
      
      if(f_res == FR_OK)
      {
        printf("》SD卡已成功格式化文件系统。\n");
        /* 格式化后,先取消挂载 */
        f_res = f_mount(NULL,(TCHAR const*)SDPath,1);			
        /* 重新挂载	*/			
        f_res = f_mount(&SDFatFS,(TCHAR const*)SDPath,1);
      }
      else
      {
        printf("《《格式化失败。》》\n");
        while(1);
      }
    }
    else if(f_res!=FR_OK)
    {
      printf("!!SD卡挂载文件系统失败。(%d)\n",f_res);
      while(1);
    }
    else
    {
      printf("》文件系统挂载成功,可以进行读写测试\n");
    }
    
    /*----------------------- 文件系统测试:写测试 -----------------------------*/
    /* 打开文件,如果文件不存在则创建它 */
    printf("****** 即将进行文件写入测试... ******\n");	
    f_res = f_open(&file, "FatFs读写测试文件.txt",FA_CREATE_ALWAYS | FA_WRITE );
    if ( f_res == FR_OK )
    {
      printf("》打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。\n");
      /* 将指定存储区内容写入到文件内 */
      f_res=f_write(&file,WriteBuffer,sizeof(WriteBuffer),&fnum);
      if(f_res==FR_OK)
      {
        printf("》文件写入成功,写入字节数据:%d\n",fnum);
        printf("》向文件写入的数据为:\n%s\n",WriteBuffer);
      }
      else
      {
        printf("!!文件写入失败:(%d)\n",f_res);
      }    
      /* 不再读写,关闭文件 */
      f_close(&file);
    }
    else
    {	
      printf("!!打开/创建文件失败。\n");
    }
    
    /*------------------- 文件系统测试:读测试 ------------------------------------*/
    printf("****** 即将进行文件读取测试... ******\n");
    f_res = f_open(&file, "FatFs读写测试文件.txt", FA_OPEN_EXISTING | FA_READ); 	 
    if(f_res == FR_OK)
    {
      printf("》打开文件成功。\n");
      f_res = f_read(&file, ReadBuffer, sizeof(ReadBuffer), &fnum); 
      if(f_res==FR_OK)
      {
        printf("》文件读取成功,读到字节数据:%d\n",fnum);
        printf("》读取得的文件数据为:\n%s \n", ReadBuffer);	
      }
      else
      {
        printf("!!文件读取失败:(%d)\n",f_res);
      }		
    }
    else
    {
      printf("!!打开文件失败。\n");
    }
    /* 不再读写,关闭文件 */
    f_close(&file);
    
    /* 不再使用,取消挂载 */
    f_res = f_mount(NULL,(TCHAR const*)SDPath,1);	
  
  
  
  /* 注销一个FatFS设备:SD卡 */
  FATFS_UnLinkDriver(SDPath);

}

剩下的就是熟悉文件系统的函数了。得多用。

你可能感兴趣的:(STM32)