完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下 ,关于最新版本的库 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 rn"); } /** * @brief Rx Transfer completed callbacks */ void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd) { SD_RxCplt = 1; printf("SD Rx Completed rn"); } 现在就是想请教下,当使用 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); |
|
相关推荐
19个回答
|
|
楼主先试试HAL_SD_WriteBlocks_DMA和HAL_SD_ReadBlocks_DMA正常不正常再说,我在STM32L476上也遇到你说的问题,你可以看我刚发的帖子。
|
|
|
|
好像这块不用更改吧,你试试降低时钟频率看看
|
|
|
|
子虚道人 发表于 2018-12-10 17:13 你好,你刚刚发布的帖子能否提供一下 网址啊 ?? |
|
|
|
估计跟时钟没有关系的, 因为我是从我以前的工程里面移植过来的,现在 的这个新版本的库 不老版本的 库 有很大差别 |
|
|
|
哦,我前久使用SD+fatfs,开始老是读写失败,就是把SD的时钟改小点好的。 |
|
|
|
我也觉得直接改成HAL_SD_ReadBlocks_DMA不合适,因为调用之后直接返回后不见得已经读完了
|
|
|
|
你好,你的意思还是使用查询就可以了,是吧 ?? |
|
|
|
不太好确定 你测试试试 反正我的read_dma只能读4个字节 |
|
|
|
你看看这两个下面两个函数:
HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); |
|
|
|
huazhe 发表于 2018-12-10 18:39 你好,这个最新的固件库 v1.6版本里面已经木有你所说的那两个函数了, 在 v1.6 版本之前是有的,但是在 v1.6 版本里面已经找不到了 |
|
|
|
这两天也是遇到同样的问题,我在想用DMA的中断是否可以呢?
|
|
|
|
/**
* @brief Reads block(s) from a specified address in a card. The Data transfer * is managed by DMA mode. * @note This API should be followed by a check on the card state through * HAL_SD_GetCardState(). * @note You could also check the DMA transfer process through the SD Rx * interrupt event. * @param hsd: Pointer SD handle * @param pData: Pointer to the buffer that will contain the received data * @param BlockAdd: Block Address from where data is to be read * @param NumberOfBlocks: Number of blocks to read. * @retval HAL status */ HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) 这个是在库文件找到的,当用HAL_SD_GetCardState().返回的结果总是4 HAL_SD_CARD_TRANSFER = 0x00000004U, /*!< Card is in transfer state */ |
|
|
|
sulidudu 发表于 2018-12-10 19:22 我目前使用的查询貌似,dma 模式还没有去研究,除非把他替换为 v1.6 之前的版本就可以使用 dma 模式了, |
|
|
|
刚才试了下查询的方法,速度能够达到1M每秒,但是拷贝进去以后会出现乱码的现象,再次拷贝出来说是文件损坏。 /* Write block(s) in DMA transfer mode */ if(HAL_SD_WriteBlocks(&hsd,buf, blk_addr , blk_len,0xffff) == HAL_OK){ ret = USBD_OK; } |
|
|
|
我这边使用F411的芯片,也发生了同样的现象,850K到1M的速度,但是会乱码,请问这个问题有解决吗?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
帮助后来的人:判读是否读写完成是这两个函数
void BSP_SD_ReadCpltCallback(void) void BSP_SD_WriteCpltCallback(void) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1763 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
917 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1304 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1769 浏览 1 评论
559 浏览 0 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-14 17:32 , Processed in 1.133711 second(s), Total 80, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号