你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103RET6使用cubeMX生成FarFs挂载SD卡,并开启DMA

[复制链接]
Xinlll 提问时间:2026-10-16 22:44 / 未解决

STM32F103RET6使用cubeMX生成FarFs挂载SD卡,并开启DMA。1、直接使用4线配置初始化会报错,在sdio.c中只是将相关配置填在了结构体中,真正的初始化在bsp_driver_sd.c中的weak uint8_t BSP_SD_Init(void)函数中,调用了底层的HAL_SD_Init(&hsd)初始化函数,先使用1bit模式进行初始化,完成后自动切换为用户配置的sdio.c中的结构体句柄中的参数,也就是切换回了4bit模式,紧接着又调用HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)函数进行设置,此时就会报错,解决方式为在sdio.c中填写结构体参数时,在用户编辑区域将结构体中的hsd.Init.BusWide参数写为SDIO_BUS_WIDE_1B,这样在进行HAL_SD_Init(&hsd)初始化结束后还是为1bit,再使用HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)切换为4bit。2、生成的读写函数代码在sd_diskio.c中默认还是调用的阻塞式的读写函数DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count);在bsp_driver_sd.c中已经生成了DMA读写函数:weak uint8_t BSP_SD_ReadBlocks_DMA(uint32_t pData, uint32_t ReadAddr, uint32_t NumOfBlocks),但是在sd_diskio.c中没有调用,并且不是用户可编辑区域,不能修改。虽然__weak uint8_t BSP_SD_ReadBlocks(uint32_t pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout)函数定义为虚函数,可用户重定义将其中的HAL_SD_ReadBlocks(&hsd, (uint8_t )pData, ReadAddr, NumOfBlocks, Timeout)调用替换为HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t )pData, ReadAddr, NumOfBlocks),这样也能实现开启一个DMA请求。但是在读写SD卡时虽然调用了DMA相关函数来进行读写,但是没有使用等待DMA搬运数据完成就返回给了FatFs状态,FatFs再次验证的时候发现SD卡状态不对,FatFs就会报错。关键在于DMA的调用逻辑不是用户可编辑区域,添加等待之后如果使用cubeMX再次生成代码会被覆盖掉。

赞 收藏 评论0 发布时间:2026-10-16 22:44

举报

0个回答

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版