这次公布一个HAL库的BUG,关于F4、F7的,版本是目前最新的CUBEF41.18.0和F7的DFP包里的,版本号是2.9.0,应该对应目前最新的CUBEF7库。2 Y; S# W% D! L5 H! K$ O+ z 这个BUG是在DFPF7 2.9.0版本发现的。查看了其他系统的HAL代码几乎一致,因此也应该存在BUG。+ `; _0 X6 l5 W 希望给使用SDIO、SDMMC功能有异常的网友有所帮助。7 s1 r( r' X: m p1 h3 w 环境:WIN7 64bit + MDK5.22 硬件:stm32F7 DISCO (F746), j* n$ ?( s; m: d' b, g 使用HAL库对TF进行读取操作, 方式MA. w; }" e( p6 G8 s) h, Z 中断函数:直接调用HAL库的处理函数。 * O$ q, Q+ D. U6 D8 c BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0 - K9 C& m4 [3 o% @1 F BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET) 3 e4 H! O/ [) A( W% A% Y/ j if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出, 5 n) k% I) c2 E; c 最终导致FIFO数据超出8个,置位,导致BUG1产生。 7 @: p! f; d: o4 q: I0 x5 g. E: b5 K 具体发现问题过程如下:- a6 g$ M& X4 I+ H4 i; G ' p+ Y" E& s3 ^/ T( j7 w4 ~ V1.01 20171227 1.通过Show Caller Code功能查找在开DMA传输SD数据时,偶发进入HardFault_Handler中断的异常,发现以下情况: - k; f Z% K9 C a.HAL_NVIC_EnableIRQ(SDMMC1_IRQn)开中断后,SDMMC产生的中断调用库函数HAL_SD_IRQHandler。 b.HAL_SD_IRQHandler函数会判断SDMMC_IT_RXFIFOHF标志位,如有效则执行SD_Read_IT(hsd)。 c.当传输数据开始时,SDMMC_FIFO数据大于8个时,且有其它错误中断产生时,如超时,进入SDMMC1_IRQn。 d.进入中断后,执行SD_Read_IT(hsd),其中的tmp = (uint32_t*)hsd->pRxBuffPtr;(因为代码没有使用IT方式读取数据,所以该指针没有初始化) e.hsd->pRxBuffPtr在之前并没有初始化,在调试时发现值为0,在读取数据时就会改写地址为0数据,最终会出现HardFault_Handler。 % \. ?; M# s: B4 Y f.调试发现,操作过程中会出现两次TIMEOUT中断,随后HFIFO置位,下个超时中断进来后会进入HFIFO处理流程,SD_Read_IT g.自编写SD的中断函数,不对FIFOHF进行判断,出现错误时,只清标志位,关中断,然后退出 % F3 V7 V% x- c5 S2.HAL2.9.0库的SD中断函数有BUG, BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0 - p4 ]# }7 h% \+ } BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET) & N) k- x" W+ H if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出, 最终导致FIFO数据超出8个,置位,导致BUG1产生。 ) x$ }" ?0 X7 J% } |
谢谢支持,稍后再发一个FW_F7_V1.9.0的USB鼠标的小小BUG
这个官方提供的SDIO驱动我也在用,不过只简单的用到了DMA中断读,写只是测试了下没发现问题。
我测试比较简单都没注意到你说的这些bug。
上次的回复了,确认了第一个是笔误,第二个是代码还有不完善的地方。 B5 r/ r' r! ^( |
这次的这个BUG,可能只对一些TF存在,我用的是1G的TF卡。
如果产生超时中断就会激这两个BUG,如果不产生超时中断就没事。
嗯,我测试的是闪迪的16G和Netac的8G的TF卡,目前还没有发现bug。
https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html