创作灵感:
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条)