[STM32] - STM32F407VET6使用STM32CubeMX配置FatFs,以及挂载时返回03错误码问题的解决

这篇具有很好参考价值的文章主要介绍了[STM32] - STM32F407VET6使用STM32CubeMX配置FatFs,以及挂载时返回03错误码问题的解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.使用STM32CubeMX配置FatFs

为测试新买的开发板TF卡读写是否正常,使用STM32CubeMX(后简称CubeMX)进行代码构建。生成代码后烧录测试,发现在挂载TF卡时无法成功,返回值为错误3(FR_NOT_READY)。经排查后问题已解决,遂记录配置过程供大家参考,并讲解挂载时返回错误3的解决方式。

1.1 工程准备

①为了输出TF卡(或者SD卡)的读写测试结果,需要你的工程能实现串口打印。因此请准备好一个使用CubeMX生成的工程(我生成的为Keil工程),要求此工程能够使用printf函数打印信息到串口调试助手上。因为这个过程非常简单,并且教程极多,请自行搜索并准备工程。生成的工程根目录内容类似下图:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

②请确认你的TF卡槽连接的IO,不同的板卡IO不同,例如我的板卡上热拔插检测引脚没有连接,本教程以我的IO连接为例,原理图如下所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

1.2 配置CubeMX

双击工程文件夹根目录中“xxx.ioc”文件,此时会进入CubeMX的配置界面。

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

1.2.1 配置SDIO

①点击左侧“Connectivity”,Mode选择“SD 4 bits Wide bus”,将“SDIOCLK clock divide factor”设置为2(调试时先不要太快,试验成功后可以自行改),如下图所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

②勾选NVIC中的“SDIO global interruptSDIO”,如下所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

③配置GPIO,请参照你的板卡原理图进行配置。此处以我的原理图为例,配置如下图所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

④注意,如果你的板卡上有热拔插检测引脚,请根据板卡原理图,直接在右侧的“PinOut View”窗口点击对应的引脚,设置为“GPIO_Input”模式。这里假设我的板卡热拔插检测引脚连接到PE2,则设置如下所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

1.2.2 配置DMA(如果不想用DMA那么此步骤可省略)

①在SDIO配置下的“DMA Settings”栏目下点击ADD,添加RX与TX请求,添加后的配置无需修改,使用默认的参数即可:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

1.2.3 配置FatFs

①点击右侧的“Middleware and Software Packs”,选择“FATFS”,Mode勾选“SDCard”,并修改“Set Defines”中的“CODE_PAGE (Code page ontarget)”为“DBSC”,修改“USE_LFN (Use Long Filename)”为“Enabled with dynamicworking buffer on the STACK”。如下所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

②(此步骤使用DMA时才需要配置)如果使用了DMA,则需要在“Advanced Settings”栏目将“Use dma template”设置为“Enable”:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

③(当你的板卡连接了热拔插检测引脚时此步骤才需要配置)如果你的板卡SD卡热拔插引脚连接到了GPIO上,那么需要在“Platform Settings”中将“Detect_SDIO”项配置为你前面设置为输入的那个引脚。比如我在前面假设我的板子检测引脚连接到了PE2,则配置如下:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

!!!注意:如果你的板子上热拔插检测引脚未连接GPIO,那么这项可以不选,后面有警告直接忽略即可。当然你也可以随便选一个未使用的IO配置成输入模式,然后在这里选择该引脚,这样警告就消失了,但是要将此引脚接地,否则可能识别为卡没有插入导致TF读写测试不通过

1.2.4 配置NVIC

①打开“System Core”中的“NVIC”,修改DMA的两个通道的“Preemption Priority”值,只要大于SDIO global interrupt”的值就可以了:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

1.2.5 修改时钟配置

①点击“Clock Configuration”栏,将“48MHz clocks”的频率修改为48

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

1.2.6 修改工程设置并输出工程

①打开“Project Manager”栏目,将“Minimum Stack Size”设置为0x500(空间足够的话最好设置大一点,比如可以设置为0x1000),设置后点击“GENERATE CODE”生成代码:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

2 添加TF读写测试代码

①打开Keil工程,在“main.c”文件中的main()函数前添加TF卡测试代码,代码内容如下:

//需要修改MX_SDIO_SD_Init为1B

#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t

    FATFS fs;
    FIL fil;
    uint32_t total,mfree;                  // file objects
	uint32_t byteswritten;                /* File write counts */
	uint32_t bytesread;                   /* File read counts */
	uint8_t wtext[] = "SDTest File";      /* File write buffer */
	uint8_t rtext[100];                   /* File read buffers */
	char filename[] = "SDTest.txt";
  
u8 exf_getfree(u8 *drv,u32 *total,u32 *free)
{
	FATFS *fs1;
	u8 res;
    u32 fre_clust=0, fre_sect=0, tot_sect=0;
    res =(u32)f_getfree((const TCHAR*)drv, (DWORD*)&fre_clust, &fs1);
    if(res==0)
	{											   
	    tot_sect=(fs1->n_fatent-2)*fs1->csize;	
	    fre_sect=fre_clust*fs1->csize;				   
#if _MAX_SS!=512				  				
		tot_sect*=fs1->ssize/512;
		fre_sect*=fs1->ssize/512;
#endif	  
		*total=tot_sect>>1;	
		*free=fre_sect>>1;	
 	}
	return res;
}

void Fatfs_RW_test(void)
{
	  printf("\r\n ****** FatFs Example ******\r\n\r\n");
 
    /*##-1- Register the file system object to the FatFs module ##############*/
		
    retSD = f_mount(&fs, "0", 1);
		
		
		//f_mkdir("0:dxc");
    if(retSD)
    {
        printf(" Mount error!!! Error Num : %d \r\n",retSD);
        Error_Handler();
    }
    else
    {
      printf(" Mount sucess :) \r\n");
    }
     
    /*##-2- Create and Open new text file objects with write access ######*/
		retSD=exf_getfree("0",&total,&mfree);
		if(retSD==0)
			printf(" total : %d MB,free : %d MB  \r\n\r\n",total>>10,mfree>>10);
		else
			 printf(" Getfree error!!! \r\n");
    retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE);
    if(retSD)
      printf(" Open file error!!! Error Num : %d\r\n",retSD);
    else
      printf(" Open file sucess :) \r\n");
     
    /*##-3- Write data to the text files ###############################*/
    retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten);
    if(retSD)
      printf(" Write file error!!! Error Num : %d\r\n",retSD);
    else
    {
      printf(" Write file sucess :) \r\n");
        printf(" Write Data : %s\r\n\r\n",wtext);
    }
     
    /*##-4- Close the open text files ################################*/
    retSD = f_close(&fil);
    if(retSD)
        printf(" Close error!!! Error Num : %d\r\n",retSD);
    else
      printf(" Close sucess :) \r\n");
     
    /*##-5- Open the text files object with read access ##############*/
    retSD = f_open(&fil, filename, FA_READ);
    if(retSD)
        printf(" Open file error!!! Error Num : %d\r\n",retSD);
    else
        printf(" Open file sucess :) \r\n");
     
    /*##-6- Read data from the text files ##########################*/
    retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread);
    if(retSD)
        printf(" Read error!!! Error Num : %d\r\n",retSD);
    else
    {
        printf(" Read sucess :) \r\n");
        printf(" Read Data : %s\r\n\r\n",rtext);
    }
     
    /*##-7- Close the open text files ############################*/
    retSD = f_close(&fil);
    if(retSD)  
        printf(" Close error!!! Error Num : %d\r\n",retSD);
    else
        printf(" Close sucess :) \r\n\r\n");
     
    /*##-8- Compare read data with the expected data ############*/
    if(bytesread == byteswritten)
    { 
        printf(" FatFs is working well!!!\r\n");
    }
}

②在main()函数中,MX_SDIO_SD_Init和MX_FATFS_Init执行完以后的地方调用TF测试代码:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

3 使用f_mount()函数挂载时返回错误3(FR_NOT_READY)问题的解决

经过上面的配置,如果你用的是旧版CubeMX软件,那么编译并烧录后便可以通过TF测试了(具体多旧的版本未知)。
如果此时你烧录运行发现输出了Mount Error的信息,Num值为3,如下图所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

则说明你需要进行以下修改:

3.1 修改代码以解决挂载时返回错误3

找到“void MX_SDIO_SD_Init(void)”函数,将“hsd.Init.BusWide”的值由“SDIO_BUS_WIDE_4B”修改为“SDIO_BUS_WIDE_1B”,修改后如下所示:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

此时重新编译并运行,问题便得以解决,以下是测试通过时的输出信息:

cube mx配置使用stm32f407vet6,stm32,嵌入式硬件,单片机

3.2 挂载时返回错误3的原因

在SDIO进行初始化时,使用的是1位宽模式进行配置的,在初始化完成后才会使用4位宽进行数据传输。新版的CubeMX软件生成代码时不知道为何会在初始化时直接配置成4位宽模式,从而导致初始化不过,返回错误3。因此只要将初始化代码中位宽进行修改即可。文章来源地址https://www.toymoban.com/news/detail-836893.html

到了这里,关于[STM32] - STM32F407VET6使用STM32CubeMX配置FatFs,以及挂载时返回03错误码问题的解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX生成C代码及时钟树配置(基于stm32f407)

    近来对于stm32单片机编程中,HAL库逐渐取代标准库成为主流的库。标准库支持的芯片型号有限,而且目前已经停止支持,而HAL库支持所有类型的芯片,可移植性也很高,再加上有神器STM32Cube可以生成工程模板,越来越多的编程开始从使用标准库转到使用HAL库。 新建工程后,在

    2024年02月15日
    浏览(30)
  • 搭建STM32F407的Freertos系统(基于STM32CubeMX)

           本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。         本次demo目标立下:         1. 搭建或移植FreeRTOS到STM32上,毕竟对于长期在Linux环境

    2024年02月10日
    浏览(32)
  • STM32F407高级定时器-死区时间研究-STM32CubeMX

    距离上次写笔记,已经过去好长时间了 中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写。 从去年10月份开始想要学习FOC,10月份研究了一个月,到11月初,实现了SVPWM驱动BLDC电机,使用串口实现开环下转速和力矩调

    2023年04月23日
    浏览(19)
  • 基于STM32CubeMX和keil采用STM32F407的基本定时器中断实现LED闪烁

    定时器有三种,基本定时器,通用定时器,以及高级定时器。 这篇博客以最简单的基本定时器为例,实现LED的闪烁。 后面两种定时器的用法后面再写。 实现功能: TIM6控制LED每隔0.5s变一次状态。 TIM7控制LED1常量2s后熄灭。 因为都是用到LED,所以和上一篇基于STM32CubeMX与keil采

    2024年02月04日
    浏览(28)
  • STM32的入门——CM3芯片STM32F103VET6的使用和相关外设

    根据《STM32库开发实战指南——基于野火指南者开发板》整理, https://gitee.com/Embedfire-stm32f103-zhinanzhe/ebf_stm32f103_zhinanzhe_ std_tutorial 在整理的过程中,还参考了其他的一些STM32资料 使用了“幕布”这款软件,添加了一些思维导图 整理框架目的: 1.梳理知识脉络 2.复习知识 被动单

    2024年02月03日
    浏览(21)
  • STM32F103xx / STM32F429VET6最小系统原理图

    STM32F429VET6核心板原理图 2023.12.09修改内容:打板后由于更换学习方向并未进行测试,所给原理图仅供参考,给出PDF下载链接,未设置积分和会员下载:https://download.csdn.net/download/m0_51294753/88611702。 一、前言 先前使用过的是STM32F1系列,只使用和绘制过STM32F103C8T6和STM32F103ZET6的板

    2023年04月24日
    浏览(18)
  • STM32F407 GPIO口输出配置配置步骤

    STM32F407ZGT6 是意法半导体(STMicroelectronics)公司推出的一款高性能ARM Cortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一员,具备强大的处理能力和丰富的外设功能,适用于各种应用领域。 说明:STM32F4 的主频最高是 168Mhz,所以我们一般设置 PLLCLK 为 168Mhz(M=8,N=336,P=2),通

    2024年02月12日
    浏览(24)
  • STM32F407 --USART使用

    目录 1. 串口配置--普通模式 2. 实现数据的传输主函数 1)单引号双引号的应用数组传输 2)将调试信息用串口打印传送到电脑上 1. 串口配置--普通模式 F407使用的M4内核与F103使用的M3内核不一样,导致在使用配置上有区别。需要在F103配置的基础上专门将GPIO的PIN配置成复用功能

    2024年02月16日
    浏览(19)
  • stm32第一节:认识寄存器(野火指南者——STM32F103VET6)

            STM32芯片架构                 Cortex-M3内核(arm)——(I,S,D)——总线矩阵——外设, Flash,SRAM                 外设—— GPIO,USART,12C,SPI ……         Flash及SRAM储存                 Flash——常量                 SRAM——变量         DMA作用   

    2024年02月21日
    浏览(26)
  • stm32f103VET6和stm32f103c8t6有什么区别?

    我来终结下这个问题。 这两款单片机我都用过,其中无际单片机特训营其中一款wifi报警主机项目就是用了stm32f103c8t6。  stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3内核的单片机。 它们在硬件规格和性能上存在一些差异,下面我详细讲解下它们的差异之处

    2024年02月15日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包