在STM32H743芯片上使用DMA傳輸數據時,如果出現收不到數據,並且不進入回調函數,基本上是RAM地址映射錯誤,DMA無法訪問目標地址導致的。
問題分析:
通常使用STM32CubeMX生成項目時,程序默認執行地址是從RAM1: 0x20000000
處開始執行,而0x20000000
是DTCM段,DMA無法進行訪問,這就導致使用DMA傳輸時無法讀寫數據,也無法進入回調。
STM32H7總線
從上圖可以看出,ITCM和 DTCM 是不支持 DMA1、DMA2 和 BDMA訪問的,而AXI SRAM支持,所以把數據讀寫地址指定到AXI SRAM(0x24000000)區域內即可。
解決辦法:
- 方法一:修改項目配置,選擇支持DMA訪問的AXI SRAM區域作爲通用RAM起始地址。
- 方法二:使用
__attribute__((section(".ARM.__at_address")))
指定DMA訪問的目標地址爲AXI SRAM區域。
下面分別介紹兩種解決辦法:
-
修改通用RAM地址
- 使用
__attribute__((section( )))
指定DMA訪問的目標地址。
在定義數組時,通過__attribute__((section(".ARM.__at_address")))
指令把數組地址分配到AXI SRAM區域內即可(此時不需要修改項目配置)。
下面以SAI外設爲例:
// 指定數組地址
uint8_t SAI_Buffer_A[2 * 4] __attribute__((section(".ARM.__at_0x24000000")));
...
// 開始DMA傳輸
HAL_SAI_Receive_DMA(&hsai_BlockA1, SAI_Buffer_A, 2)
...
// SAI接收完成回調
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
{
...
}
通過以上兩種方案,就可以解決STM32H7芯片使用DMA無效的問題。
作者:txfly
鏈接:https://www.jianshu.com/p/ba1034136ae8
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。