STM32H7:解決DMA傳輸無效的問題

在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區域。

下面分別介紹兩種解決辦法:

  1.  

     

    修改項目配置。更改通用RAM起始地址爲AXI SRAM(0x24000000),修改後如下圖所示:

    修改通用RAM地址

  2. 使用__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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章