STM32H7+SD卡+RTOS+FATFS FATFS报错Debug

FATFS报错Debug

错误情景:
f_mount等等函数均报错,如:
f_mount(&fs," ", 0); 此时不报错, 但如果使用f_open等函数,则马上报错not_ready

f_mount(&fs," ", 1); 立刻报错fr_disk_err或者fr_not_ready

尝试过的方法:

1. 4bits改为1bits, 无效
2. 调节时钟频率, 无效
3. 设置上拉电阻, 无效
4. 修改栈区堆区大小, 无效(使用了RTOS)(但需要注意的是RTOS任务内存分配也不要太小, 我分配了4096, 不确定最小可以有多小)
5. 更换SD卡(没试过, 本人使用了32GB的SD卡)

解决方案:

虽然FATFS始终不能工作

但是! SD卡可以正常配置, 初始化, 以及读取信息.
sd卡读取情况

所以基本排除了SD卡以及SDMMC配置时出问题的可能性. 问题定位在FATFS的配置与RTOS的配置上.

但新的问题又来了, FATFS只是一个抽象层,它不应该出现自身的配置上的问题

继续定位问题, 定位在RTOS与FATFS的兼容上面.

仔细查阅CubeMX中的配置项, 发现问题:

FATFS中选项栏 "Advanced Setting"中有一个选项:“Use DMA Template”
在这里插入图片描述

这里被强制选择为"Enable", 但是我在配置的时候并没有设置相关的DMA选项, 这里设为ENABLE, 与实际配置不符
更新DMA配置(MDMA部分), 问题解决.
在这里插入图片描述

运行效果:

在这里插入图片描述

勘误:

  1. 网络上有尝试通过降低时钟频率的方法,实测不需要,100M时钟频率正常工作.

  2. 4bits改为1bits, 理由是CubeMX初始化时有bug, 实测不需要(cube版本6.8.1, FW_H7版本1.11)
    可以正常满速工作, 但是没有测试最高速率是多少, 以及100M时钟会不会数据出错.
    在这里插入图片描述

补录:

便于各位自行定位问题所在, 这里给出我的SD卡读取代码, 如果这部分可以正常工作, 就不要在SD卡上面浪费时间了, 不是SD卡的问题

    uint64_t CardCap;      	//SD卡容量
    HAL_SD_CardCIDTypeDef SDCard_CID;
    HAL_SD_CardInfoTypeDef  SDCardInfo;

    SD_Driver.disk_initialize(0);

    HAL_SD_GetCardCID(&hsd1,&SDCard_CID);	//获取CID
    HAL_SD_GetCardInfo(&hsd1,&SDCardInfo);                    //获取SD卡信息
    CardCap=(uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize);	//计算SD卡容量

    uart_printf("Card ManufacturerID: %d \r\n",SDCard_CID.ManufacturerID);				//制造商ID
    uart_printf("CardVersion:         %d \r\n",(uint32_t)(SDCardInfo.CardVersion));		//卡版本号
    uart_printf("Class:               %d \r\n",(uint32_t)(SDCardInfo.Class));		    //
    uart_printf("Card RCA(RelCardAdd):%d \r\n",SDCardInfo.RelCardAdd);					//卡相对地址
    uart_printf("Card BlockNbr:       %d \r\n",SDCardInfo.BlockNbr);						//块数量
    uart_printf("Card BlockSize:      %d \r\n",SDCardInfo.BlockSize);					//块大小
    uart_printf("LogBlockNbr:         %d \r\n",(uint32_t)(SDCardInfo.LogBlockNbr));		//逻辑块数量
    uart_printf("LogBlockSize:        %d \r\n",(uint32_t)(SDCardInfo.LogBlockSize));		//逻辑块大小
    uart_printf("Card Capacity:       %d MB\r\n",(uint32_t)(CardCap>>20));				//卡容量

工程代码git链接:
在master分支

Github仓库链接

维护开源环境, 减少积分下载.
有问题可以在评论区问, 不定时回复

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
抱歉,我作为AI语言模型无法提供代码。但是,你可以按照以下步骤初始化STM32 RTOS LWIP和LN8720: 1. 在STM32CubeMX配置MCU和LWIP库。 2. 配置LWIP的IP地址、子网掩码、默认网关和DNS服务器。 3. 配置LWIP的网络接口,包括使用的网卡类型和MAC地址。 4. 在LWIP初始化函数中添加以下代码: ``` /* Initialize the LwIP stack */ lwip_init(); /* Add the Ethernet interface for LWIP */ netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input); /* Set the default network interface */ netif_set_default(&netif); /* Bring the network interface up */ netif_set_up(&netif); ``` 5. 初始化LN8720硬件,包括SPI接口和片选引脚。 6. 在LWIP初始化函数中添加以下代码,以将LN8720添加到LWIP协议栈中: ``` /* Create a new netif for the LN8720 */ struct netif ln8720_netif; ip4_addr_t ln8720_ipaddr, ln8720_netmask, ln8720_gw; /* Set the IP address of the LN8720 */ IP4_ADDR(&ln8720_ipaddr, 192, 168, 1, 50); /* Set the subnet mask of the LN8720 */ IP4_ADDR(&ln8720_netmask, 255, 255, 255, 0); /* Set the default gateway of the LN8720 */ IP4_ADDR(&ln8720_gw, 192, 168, 1, 1); /* Add the LN8720 interface to LWIP */ netif_add(&ln8720_netif, &ln8720_ipaddr, &ln8720_netmask, &ln8720_gw, NULL, &ln8720if_init, &tcpip_input); /* Set the default network interface */ netif_set_default(&ln8720_netif); /* Bring the network interface up */ netif_set_up(&ln8720_netif); ``` 7. 在LWIP协议栈中添加LN8720的协议处理函数。 8. 在主循环中调用LWIP协议栈的处理函数。 注意:以上代码仅供参考,实际实现可能需要根据具体硬件和应用场景进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值