完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用的是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也存在这个情况。 |
|
相关推荐
14个回答
|
|
本帖最后由 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 rn"); } /** * @brief Rx Transfer completed callbacks */ void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd) { SD_RxCplt = 1; printf("SD Rx Completed rn"); } 但是貌似不能够作为发送或者接收完成标志使用 |
|
|
|
进入回调函数就说明DMA完成任务了 。你直接可以进入HAL_SD_RxCpltCallback?
|
|
|
|
另外我的HAL_SD_WriteBlocks_DMA可以了 原因是没有4字节对齐。
|
|
|
|
你猜对了! 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; 我的配置是这样的 |
|
|
|
我手上还有一块F429的板子 用F4的HAL库DMA读写就不会出现丢数据的情况... 愁死我了
|
|
|
|
吧 内存数据对齐
SD_Handle.hdmarx->Init.MemDataAlignment = DMA_MDATAALIGN_WORD; 改成 SD_Handle.hdmarx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; |
|
|
|
想问问你们使用的是哪个版本的库?我使用的是最新V1.7的,在使用SD 通信DMA方式,传送几个字节后hsd->State 就不等于HAL_SD_STATE_READY了,一直死锁,发现SDMMC 的中断后面就没响应了,导致没法继续发送其他数据,我也查了SDMMC的中断是高于DMA的中断优先级的
你们有这样的情况么 |
|
|
|
60user91 发表于 2019-3-18 20:28 我的没有出现你所说的问题的呀, 我使用stm32f2xx, f4xx, f7xx 都挺好的 |
|
|
|
哥们能否把你的F7的关于SDMMC的配置及驱动给我参考参考 |
|
|
|
A、优先级 SDMMC2_IRQn " bsp_drver_sd.c " 0xe DMA2_Stream0_IRQn " bsp_drver_sd.c " 0xf DMA2_Stream5_IRQn " bsp_drver_sd.c " 0xf SDMMC2_IRQn 这个的优先级必须比 DMA2_Stream0_IRQn, DMA2_Stream5_IRQn 高一个数量级,如上所设置的 |
|
|
|
7vyydyfwef 发表于 2019-3-18 20:54 非常感谢,按照你的配置方式,SDMMC的DMA方式调通了,但是发现,使用DMA和不使用DMA读写速度没多少变化,我是直接块读写操作,每次多块写入16K字节(512*n),速度也就2.7m/s 你有测试过么 |
|
|
|
60user91 发表于 2019-3-18 21:13 你是如何测试的啊 ??? |
|
|
|
本帖最后由 xiang90721 于 2017-9-19 21:33 编辑
具体测试方法: 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 |
|
|
|
非常感谢,下载学习!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 01:47 , Processed in 0.711707 second(s), Total 67, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号