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

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 评论17 发布时间:2017-3-27 15:34

举报

17个回答
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: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;

我的配置是这样的
伪善者的罪罚 回答时间: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的配置及驱动给我参考参考
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版