你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
查看全部评分
STM32隐藏
5.18活动板子会不会是STM32L4呢
STM32 CUBE软件中找不到STM32L4系列单片机
Your UAT Feedback is needed within today.
应用
AAA
tiwen
BBBB
aaa
2222
是不是FIFO不够大
2s, DMA能传输不少东西了。
评分
查看全部评分
V1.01 20171227
1.通过Show Caller Code功能查找在开DMA传输SD数据时,偶发进入HardFault_Handler中断的异常,发现以下情况:
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。
f.调试发现,操作过程中会出现两次TIMEOUT中断,随后HFIFO置位,下个超时中断进来后会进入HFIFO处理流程,SD_Read_IT
g.自编写SD的中断函数,不对FIFOHF进行判断,出现错误时,只清标志位,关中断,然后退出
2.HAL2.9.0库的SD中断函数有BUG,
BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0
BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET)
if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出,
最终导致FIFO数据超出8个,置位,导致BUG1产生。
评分
查看全部评分