GD32F105RBT6调用f_mount返回FR_NO_FILESYSTEM故障排查求助
问题描述
- 芯片:GD32F105RBT6
- 需求:将文本文件保存至FAT32格式U盘
- 故障现象:调用
f_mount()返回FR_NO_FILESYSTEM错误;仅保留USB主机功能的项目可正常工作,集成RTC、定时器、DMA、ADC等外设后功能失效 - 排查情况:关闭除
TIMER2_IRQHandler和USBFS_IRQHandler外的所有中断后仍未改善;故障点锁定在调用链f_mount(...) -> find_volume(...) -> check_fs(...)中,具体为ld_word(fs->win + BS_55AA) != 0xAA55校验不通过 - 使用FatFs版本:R0.13c
- 相关代码:
int usbh_msc_usr_app(void) { FRESULT res; uint8_t WriteTextBuff[] = "Try to write text in"; uint32_t bytesWritten, bytesToWrite; // register work area for logical drives usb_mdelay(100); res = f_mount(&fatfs, "0:/", 1); if (res != FR_OK) { return 1; } res = f_open(&file, "0:test.TXT", FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK){ f_mount(NULL, "0:/", 1); return 1; } bytesWritten = 0; bytesToWrite = sizeof(WriteTextBuff); res = f_write(&file, WriteTextBuff, bytesToWrite, (void*)&bytesWritten); if ( (bytesToWrite != bytesWritten) || (res != FR_OK) ) { } usb_mdelay(1000); res = f_close(&file); if (res != FR_OK) { f_mount(NULL, "0:/", 1); return 1; } f_mount(NULL, "0:/", 1); return 0; }
可能的故障原因
- 内存访问异常:集成多外设后,栈空间不足或全局变量(如
fatfs结构体)被意外篡改。fs->win是FatFs的扇区读取缓冲区,若栈溢出或其他外设代码修改了该缓冲区,会导致读取的引导扇区末尾0xAA55校验位错误。可检查项目栈大小配置,或把fatfs结构体放在未被其他外设初始化覆盖的内存区域。 - USB MSC读写时序干扰:即使保留了
TIMER2_IRQHandler,若TIMER2的中断优先级高于USBFS或中断频率过高,会频繁打断USB主机的扇区读取操作,导致读取的引导扇区数据不完整或错误。可调整TIMER2的中断优先级,使其低于USBFS_IRQHandler的优先级,或降低TIMER2的中断频率测试。 - FatFs配置不一致:单外设项目与集成项目的
ffconf.h配置存在差异。比如_MIN_SS/_MAX_SS的扇区大小设置与U盘实际扇区不匹配,会导致引导扇区数据读取错位,0xAA55校验位位置错误;或误开启_USE_MULTI_PARTITION等配置,导致找不到正确的引导扇区。需对比两个项目的ffconf.h配置项。 - 时钟或总线冲突:GD32F105的USB外设需48MHz时钟,集成其他外设后若总线分频或时钟源配置错误,会导致USB时钟不稳定,数据传输出错。比如AHB/APB总线分频设置不当,或USB时钟未正确配置为48MHz,都会导致读取的扇区数据错误。
- 全局变量初始化问题:
fatfs或file结构体初始化顺序错误,或被其他外设的初始化代码覆盖。比如在USB主机初始化前,其他外设的初始化修改了fatfs的工作缓冲区,导致引导扇区读取数据异常。可调整初始化顺序,确保USB相关初始化在其他外设之后,或对fatfs结构体做显式初始化。
内容的提问来源于stack exchange,提问作者Natr
相关产品推荐
相关产品推荐

