OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4136|回复: 1

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

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2017-3-28 21:17:50 | 显示全部楼层 |阅读模式
2金钱
请教下 ,关于最新版本的库 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 \r\n");

}

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

}




现在就是想请教下,当使用 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);





















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-3-28 22:47:10 | 显示全部楼层
没用过SD卡的DMA传输,但是DMA有自己的传输中断,比如传输过半,传输完成等等。去查查中文参考手册
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 09:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表