我用的是
STM32L476,也看了最新的STM32F7的库,用的都是最新的库。SDMMC的DMA的TX和RX通道都配置好了,SD中断优先级5,DMA收发的优先级都是6。调用stm32xxxx_hal_sd.c文件中的HAL_SD_WriteBlocks_DMA和HAL_SD_ReadBlocks_DMA两个函数读写SD卡的某一个扇区。
问题如下:
问题1:HAL_SD_WriteBlocks_DMA()写1个扇区,用PC下的扇区读取工具看,发现前两个字节永远都是0xff,真实数据从第3个字节开始正常,所以只能写入512-2个正确字节,并且数据位置实际偏移了两个字节。而换成HAL_SD_WriteBlocks()正常。
问题2:用HAL_SD_ReadBlocks_DMA()读1个扇区,发现只能正确返回实际偏移两个字节位置的两个字节(比如实际数据:0x00,0x01, 0x02 0x03 只能读到0x02和0x03),配置的接收完成中断SD_DMAReceiveCplt()永远也不会被调用。而如果用HAL_SD_ReadBlocks()可以正常读取。
问题3:我用HAL_SD_WriteBlocks()连续给SD卡写数据,发现突然某个时候检查SD状态永远是busy,并且等多久都不会空闲。必须初始化才能恢复。
我查看了STM32F7的库,跟L4的库内容完全一样,所以怀疑F7也存在这个情况。
头和尾总会丢失一部分字节 轮训读写就没有问题 很奇怪
我用 __align(x) 设置了x字节对其以后依旧会出现这样的情况
但是不同的字节对齐丢失的数据多少会不一样... up你问题解决了么? 我设置四字节对齐依旧有丢失..
你DMA的配置能发出来我看看吗?
SD_Handle.hdmarx->Instance = DMA2_Stream3;
SD_Handle.hdmarx->Init.Channel = DMA_CHANNEL_4;
SD_Handle.hdmarx->Init.Direction = DMA_PERIPH_TO_MEMORY;
SD_Handle.hdmarx->Init.FIFOMode = DMA_FIFOMODE_ENABLE;
SD_Handle.hdmarx->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
SD_Handle.hdmarx->Init.Mode = DMA_PFCTRL;
SD_Handle.hdmarx->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
SD_Handle.hdmarx->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
SD_Handle.hdmarx->Init.PeriphBurst = DMA_PBURST_INC4;
SD_Handle.hdmarx->Init.MemBurst = DMA_MBURST_INC4;
SD_Handle.hdmarx->Init.PeriphInc = DMA_PINC_DISABLE;
SD_Handle.hdmarx->Init.MemInc = DMA_MINC_ENABLE;
SD_Handle.hdmarx->Init.Priority = DMA_PRIORITY_VERY_HIGH;
我的配置是这样的
SD_Handle.hdmarx->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
改成
SD_Handle.hdmarx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
你们有这样的情况么
一周热门 更多>