ST的hal库HAL_SD_WriteBlocks_DMA()写1个扇区前两个字节永远都是0xff

2019-07-14 13:37发布


我用的是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也存在这个情况。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
7vyydyfwef
1楼-- · 2019-07-15 13:59
60user91 发表于 2019-3-18 20:28
想问问你们使用的是哪个版本的库?我使用的是最新V1.7的,在使用SD 通信DMA方式,传送几个字节后hsd->State 就不等于HAL_SD_STATE_READY了,一直死锁,发现SDMMC 的中断后面就没响应了,导致没法继续发送其他数据,我也查了SDMMC的中断是高于DMA的中断优先级的

你们有这样的情况么 ...

我的没有出现你所说的问题的呀,

我使用stm32f2xx,  f4xx,  f7xx 都挺好的
60user91
2楼-- · 2019-07-15 17:25
7vyydyfwef 发表于 2019-3-18 20:39
我的没有出现你所说的问题的呀,

我使用stm32f2xx,  f4xx,  f7xx 都挺好的

哥们能否把你的F7的关于SDMMC的配置及驱动给我参考参考
7vyydyfwef
3楼-- · 2019-07-15 21:36
 精彩回答 2  元偷偷看……
60user91
4楼-- · 2019-07-15 21:46
7vyydyfwef 发表于 2019-3-18 20:54
A、优先级
   SDMMC2_IRQn           " bsp_drver_sd.c "             0xe
   DMA2_Stream0_IRQn      " bsp_drver_sd.c "            0xf

非常感谢,按照你的配置方式,SDMMC的DMA方式调通了,但是发现,使用DMA和不使用DMA读写速度没多少变化,我是直接块读写操作,每次多块写入16K字节(512*n),速度也就2.7m/s

你有测试过么
7vyydyfwef
5楼-- · 2019-07-16 03:30
60user91 发表于 2019-3-18 21:13
非常感谢,按照你的配置方式,SDMMC的DMA方式调通了,但是发现,使用DMA和不使用DMA读写速度没多少变化,我是直接块读写操作,每次多块写入16K字节(512*n),速度也就2.7m/s

你有测试过么

你是如何测试的啊 ???
60user91
6楼-- · 2019-07-16 05:38
本帖最后由 xiang90721 于 2017-9-19 21:33 编辑

具体测试方法:
tick_start = HAL_GetTick();//获取开始测量前的时钟计数
for(i=0;i<5000;i++)
{
     ret = BSP_SDMMC_Write(buf,i*n,n);//BSP_SDMMC_Write为使用库函数HAL_SD_WriteBlocks_DMA()封装的块写入函数而已
      if(ret != MSD_OK)
      {
          //do something
           while(1);
      }
}
tick_end = HAL_GetTick();
write_speed = buf_len*5000*1000/(tick_end - tick_start);//buf_len为数组buf数据长度,为512*n字节,系统滴答时钟配置的为1ms一次
通过如上的方式计算得出的写入速度测试,读出速度也是同样的方式计算得出。
SD卡为class 4,且供给SD的时钟为24M

一周热门 更多>