|
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再次生成代码会被覆盖掉。 |
L9663驱动开发
stm32cubemx 6.18.0 以太网lwip怎么配置
【速览】CubeMX2发布了,目前支持C5系列,支持MDK6
VSCODE编译stm32时一直显示正在配置
都是怎么学习TouchGFX的?
mmt 工具如何管理NAND和LCDinterface 设备
CubeMX再次生成代码时中文注释出现乱码,如何解决?
STM32G431 ADC只有软件触发,无法通过硬件触发
在stm32cubeAI上,打开Lanuch NeuralNet Studio提示打不开
能修改Cube MX 存放文档资料的文件夹吗?
微信公众号
手机版