请教下STM32Cube_FW_F7_V1.6.0 sd dma的使用 ?

2019-07-14 15:21发布



请教下 ,关于最新版本的库 STM32Cube_FW_F7_V1.6.0 版本的 sd dma 的使用 ?

目前使用sd dma 读写总是失败,如果不使用dma读写则完全没有问题

现在就是想请教下,当使用 dma 读写时,需要调用什么函数来判断这个dma 的读写是否完成 ???????????

使用dma 相关函数如下:
uint8_t     SD_RxCplt , SD_TxCplt ;

uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint64_t ReadAddr, uint32_t NumOfBlocks)
{
  uint8_t sd_state = MSD_OK;
  if(HAL_SD_ReadBlocks_DMA(&_HSD, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)  
  {
    sd_state = MSD_ERROR;
  }
  return sd_state;
}

uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint64_t WriteAddr, uint32_t NumOfBlocks)
{
  uint8_t sd_state = MSD_OK;

  if(HAL_SD_WriteBlocks_DMA(&_HSD, (uint8_t *)pData, WriteAddr,  NumOfBlocks) != HAL_OK)  
  {
    sd_state = MSD_ERROR;
  }

  return sd_state;
}




DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
  DRESULT res = RES_OK;
  uint32_t timeout = 100000;

  if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
                       (uint64_t) (sector ),
                       count) == MSD_OK)
  {
    while(SD_RxCplt == 0)
    {
      if (timeout-- == 0)
      {
        SD_RxCplt = 0;
        sd_state =  MSD_ERROR;
      }
    }

    SD_RxCplt = 0;
    res = RES_OK;
  }
  return res;
}


DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
  DRESULT res = RES_OK;
  uint32_t timeout = 100000;
  if(BSP_SD_WriteBlocks_DMA((uint32_t*)buff,
                        (uint64_t)(sector ),
                        count) == MSD_OK)
  {
    while(SD_TxCplt == 0)
    {
      if (timeout-- == 0)
      {
        SD_TxCplt = 0;
        sd_state =  MSD_ERROR;
      }
    }

    SD_TxCplt = 0;   
    res = RES_OK;
  }
  return res;
}


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

}

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

}




现在就是想请教下,当使用 dma 读写时,需要调用什么函数来判断这个dma 的读写是否完成 ???????????
// **********************************************************************************
在以前的老版本里面有个 如下函数,但是在目前的 这个 f7 v1.6的库里面已经找不到了
  /* Wait until  Tx  Rx  complete */
    HAL_SD_CheckWriteOperation(&_HSD, (uint32_t)SD_DATATIMEOUT) ;
    HAL_SD_CheckReadOperation(&_HSD, (uint32_t)SD_DATATIMEOUT);
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
肥肥飞飞
1楼-- · 2019-07-15 00:41
好像这块不用更改吧,你试试降低时钟频率看看
7vyydyfwef
2楼-- · 2019-07-15 02:12
子虚道人 发表于 2018-12-10 17:13
楼主先试试HAL_SD_WriteBlocks_DMA和HAL_SD_ReadBlocks_DMA正常不正常再说,我在STM32L476上也遇到你说的问题,你可以看我刚发的帖子。

你好,你刚刚发布的帖子能否提供一下 网址啊 ??
7vyydyfwef
3楼-- · 2019-07-15 05:25
 精彩回答 2  元偷偷看……
肥肥飞飞
4楼-- · 2019-07-15 06:23
7vyydyfwef 发表于 2018-12-10 17:48
估计跟时钟没有关系的,

因为我是从我以前的工程里面移植过来的,现在 的这个新版本的库 不老版本的 库 有很大差别

哦,我前久使用SD+fatfs,开始老是读写失败,就是把SD的时钟改小点好的。
子虚道人
5楼-- · 2019-07-15 10:52
我也觉得直接改成HAL_SD_ReadBlocks_DMA不合适,因为调用之后直接返回后不见得已经读完了
7vyydyfwef
6楼-- · 2019-07-15 16:52
子虚道人 发表于 2018-12-10 18:13
我也觉得直接改成HAL_SD_ReadBlocks_DMA不合适,因为调用之后直接返回后不见得已经读完了

你好,你的意思还是使用查询就可以了,是吧 ??

一周热门 更多>