STM32H5+Freerots+U盘(HOST)+Fatfs无法正确读取U盘列表以及找不到对应的文件问题

创作灵感:1、问题备忘录。2、搜索了很多相关的解决办法,但是没有找到合适的以及可以解决本问题的文章,所以给遇到相似问题的小伙伴提供个思路。工程配置:STM32H523XXFr

创作灵感:

1、问题备忘录。

2、搜索了很多相关的解决办法,但是没有找到合适的以及可以解决本问题的文章,所以给遇到相似问题的小伙伴提供个思路。

工程配置:

STM32H523XX

Freertos

Fatfs

U盘(HOST)

主要问题

  我是在调用f_opendir函数中填写了正确路径,但是打印出来错误的目录,每次打印出的都是0:/USBSCBSU. 

如图

          起初我在测试的时候将USB检测任务和读写U盘的操作放在了同一个任务中。

void UsbDisk_task(void *pvParameters)
{

		while(1)
    {	
			
			 // f_open() 类似这样对文件系统的操作
 		    ux_system_tasks_run();          
        vTaskDelay(5);     	 			  
    }
}

解决办法:

     将读写U盘的操作放在另一个任务中,并且它的vTaskDelay();延时时间大于USB系统任务的时间 。这样就可以正确读写U盘以及查找到正确的目录文件。

本人见解:

        我不确定我对问题解决的原因思考的是否正确,我的想法是因为USB底层读取的速度比FatFS文件系统执行速度慢一些,相当于对U盘的读取还没有完全结束,但是对文件系统的操作已经结束。所以每次返回的都是错误的文件名称。

问题概述: 可跳过阅读

        因为是头一次移植STM32H5系列的U盘做主机+文件管理系统源代码(以前也没有移植过F系列),所以在整个过程中也是参考的挣点元子的例程,但是目前能搜索到的对H5系列资料不多,所以起初在移植过程中比较困难,比如说发生问题了无法定位是哪里的问题。但是最终解决问题后,发现整体问题不是因为移植USB驱动和文件系统导致的。整个过程按照挣点元子的移植不会出现太大问题。起初我也打算使用CUBEMX去配置,但是H5系列CUBEMX没办法将其配置成MSC,所以只好手动移植。

遗留问题:

        这里还有两个遗留的问题希望各位大佬可以观望一下。小白真挚的感谢🙏        

1、如果想获取一个长的文件名的话 ,FF_USE_LFN=3 ,导致我在调用f_open后,编译完的程序会比原来增加170K左右。我不知道这是正常情况还是错误的情况。我的芯片是512K的内部flash但是已经使用了300k左右编译后直接将FLASH拉满了。

// 在ffconf.h中

#define FF_USE_LFN	  0
#define FF_MAX_LFN		255
/* The FF_USE_LFN switches the support for LFN (long file name).
/
/   0: Disable LFN. FF_MAX_LFN has no effect.
/   1: Enable LFN with static  working buffer on the BSS. Always NOT thread-safe.
/   2: Enable LFN with dynamic working buffer on the STACK.
/   3: Enable LFN with dynamic working buffer on the HEAP.
/
/  To enable the LFN, ffunicode.c needs to be added to the project. The LFN function
/  requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and
/  additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.
/  The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can
/  be in range of 12 to 255. It is recommended to be set it 255 to fully support LFN
/  specification.
/  When use stack for the working buffer, take care on stack overflow. When use heap
/  memory for the working buffer, memory management functions, ff_memalloc() and
/  ff_memfree() exemplified in ffsystem.c, need to be added to the project. */

2、     我是将U盘的检测函数    ux_system_tasks_run();单独放在了一个任务中,挣点元子的将此函数放在了定时器中断中。 我起初也是将其放在了 定时器中断中,但是会进入HardFault_Handler,具体原因不清楚,希望大佬可以给解释一下

最后:

      感谢您对本文档的阅读、批评和指正。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754718882a5195615.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信