我现在将CubeMx 4.23.0和FW软件包用于STM32F7 1.8.0 MCU是Core746i板上的STM32F746。 一切都是由CubeMx自动生成的。
main.c:
SCB_EnableICache();
SCB_EnableDCache();
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SDMMC1_SD_Init();
MX_USB_DEVICE_Init();
MX_FATFS_Init();
HAL_Delay(3000);
DebugString("start OK");
uint8_t res = 0;
FATFS SDFatFs;
FIL MyFile; /* File object */
char SD_Path[4];
res = f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0);
sprintf(DebugStr, "f_mount = 0x%02X", res);
DebugString(DebugStr);
res = f_open(&MyFile, "test.txt", FA_READ);
sprintf(DebugStr, "f_open = 0x%02X", res);
DebugString(DebugStr);
sdmmc.c:
void MX_SDMMC1_SD_Init(void)
{
hsd1.Instance = SDMMC1;
hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
hsd1.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B;
hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
hsd1.Init.ClockDiv = 7;
//HAL_SD_Init(&hsd1);
// ^^^^^ I also tried this here
//HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B)
//^^^^ and this
}
对于f_mount(&SDFatFs,(TCHAR const *)SD_Path,0)<-此处为1(强制安装),输出为:
- f_mount = 0x03
- f_open = 0x01
具有0(现在不挂载)的输出是:
- f_mount = 0x00
- f_open = 0x03
0x03的值为FR_NOT_READY,但是官方信息对此却含糊不清
我尝试过的事情:
- 将HAL_SD_Init(&hsd1)添加到MX_SDMMC1_SD_Init(),因为我没有发现SD卡GPIO初始化发生在哪里。
- 2 GB noname SD卡,1 GB Transcend卡。
- hsd1.Init.ClockDiv 3到255不同。
- 完全解决所有问题。
- 使用HAL_SD_ConfigWideBusOperation(&hsd1,SDMMC_BUS_WIDE_4B)切换到4位宽总线;
- 打开和关闭上拉。
但是卡仍未安装。它以FAT格式格式化,可以在PC上运行,我尝试打开的文件存在,但为空。
如何安装它? 预先感谢!
答案 0 :(得分:0)
cubemx的确切版本存在问题。 更新stm32cubemx很有帮助。
答案 1 :(得分:0)
您可以尝试
在f_open调用后`f_mount(0,“ path”,0);
`。它可能会起作用。 如果强制安装的函数因FR_NOT_READY而失败,则表明文件系统对象已成功注册,但
该卷目前尚无法正常工作
。将在后续的文件/目录功能上尝试卷安装过程。
如果磁盘I / O层的实现缺少异步媒体更改检测,则应用程序需要在每次媒体更改后强制清除文件系统对象来执行f_mount功能。
答案 2 :(得分:0)
将{SD3_CK以外的所有SDIO引脚更改为This Topic上拉对我来说是有效的
答案 3 :(得分:-1)
尝试评论MX_USB_DEVICE_Init()
,看看会发生什么。