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

ST的hal库有问题手头有STM32L4或STM32F7的帮忙测试DMA SD卡

[复制链接]
maisheng 提问时间:2017-3-27 15:34 /
本帖最后由 maisheng 于 2017-3-27 15:38 编辑

我用的是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也存在这个情况。


收藏 1 评论18 发布时间:2017-3-27 15:34

举报

18个回答
伪善者的罪罚 回答时间:2017-5-16 17:24:00
你猜对了! F7也有这种情况... F746的Discovery板...  我用dma读取SD卡情况一样
头和尾总会丢失一部分字节 轮训读写就没有问题 很奇怪
我用 __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;

我的配置是这样的
xiang90721 回答时间:2017-9-19 21:31:57
本帖最后由 xiang90721 于 2017-9-19 21:33 编辑
hpdell 发表于 2017-9-19 20:03
你是如何测试的啊 ???

具体测试方法:
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
hpdell 回答时间:2017-9-14 20:15:03
xiang90721 发表于 2017-9-13 19:18
哥们能否把你的F7的关于SDMMC的配置及驱动给我参考参考

bsp_sd.rar (8.04 KB, 下载次数: 157)
hpdell 回答时间:2017-3-28 15:12:38
本帖最后由 hpdell 于 2017-3-28 15:24 编辑

终于找到了,我现在遇到的问题与你基本一样,估计这个sd卡的 dma 功能 他们都没有测试就放出来,哎,stm太不负责了啊
说说我的问题,目前我的可以进入到下面的两个函数中,

回调函数/**
  * @brief Tx Transfer completed callbacks
  */
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
  SD_TxCplt = 1;
  printf("SD Tx Completed \r\n");

}

/**
  * @brief Rx Transfer completed callbacks
  */
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{
  SD_RxCplt = 1;
  printf("SD Rx Completed \r\n");

}


但是貌似不能够作为发送或者接收完成标志使用




maisheng 回答时间:2017-3-29 09:20:38
hpdell 发表于 2017-3-28 15:12
终于找到了,我现在遇到的问题与你基本一样,估计这个sd卡的 dma 功能 他们都没有测试就放出来,哎,stm太 ...

进入回调函数就说明DMA完成任务了 。你直接可以进入HAL_SD_RxCpltCallback?
maisheng 回答时间:2017-3-29 09:21:20
另外我的HAL_SD_WriteBlocks_DMA可以了 原因是没有4字节对齐。
伪善者的罪罚 回答时间:2017-5-16 17:25:57
我手上还有一块F429的板子  用F4的HAL库DMA读写就不会出现丢数据的情况...   愁死我了  
hpdell 回答时间:2017-6-5 10:23:50
伪善者的罪罚 发表于 2017-5-16 17:25
我手上还有一块F429的板子  用F4的HAL库DMA读写就不会出现丢数据的情况...   愁死我了   ...

吧 内存数据对齐

SD_Handle.hdmarx->Init.MemDataAlignment     = DMA_MDATAALIGN_WORD;

改成

SD_Handle.hdmarx->Init.MemDataAlignment     = DMA_MDATAALIGN_BYTE;
xiang90721 回答时间:2017-9-13 17:02:59
hpdell 发表于 2017-6-5 10:23
吧 内存数据对齐

SD_Handle.hdmarx->Init.MemDataAlignment     = DMA_MDATAALIGN_WORD;

想问问你们使用的是哪个版本的库?我使用的是最新V1.7的,在使用SD 通信DMA方式,传送几个字节后hsd->State 就不等于HAL_SD_STATE_READY了,一直死锁,发现SDMMC 的中断后面就没响应了,导致没法继续发送其他数据,我也查了SDMMC的中断是高于DMA的中断优先级的

你们有这样的情况么
hpdell 回答时间:2017-9-13 17:14:36
xiang90721 发表于 2017-9-13 17:02
想问问你们使用的是哪个版本的库?我使用的是最新V1.7的,在使用SD 通信DMA方式,传送几个字节后hsd->Sta ...

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

我使用stm32f2xx,  f4xx,  f7xx 都挺好的
xiang90721 回答时间:2017-9-13 19:18:18
hpdell 发表于 2017-9-13 17:14
我的没有出现你所说的问题的呀,

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

哥们能否把你的F7的关于SDMMC的配置及驱动给我参考参考
xiang90721 回答时间:2017-9-15 09:55:02
hpdell 发表于 2017-9-14 20:15
A、优先级
   SDMMC2_IRQn           " bsp_drver_sd.c "             0xe
   DMA2_Stream0_IRQn    ...

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

你有测试过么
hpdell 回答时间:2017-9-19 20:03:17
xiang90721 发表于 2017-9-15 09:55
非常感谢,按照你的配置方式,SDMMC的DMA方式调通了,但是发现,使用DMA和不使用DMA读写速度没多少变化, ...

你是如何测试的啊 ???
nihaoshijie5188 回答时间:2018-2-25 13:45:51
非常感谢,下载学习!
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版