You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32H723VE中SAI1 DMA回调失效及其他DMA停滞问题问询

STM32H723VE SAI1 DMA启动后SAI4与I2S1 DMA停滞问题

我基于STM32H723VE开展项目,遇到SAI1外设相关问题:此前配置为从机发送模式的SAI4、从机接收模式的I2S1均正常工作,SAI4使用RAM D3,SAI1与I2S1通过DMA使用RAM D2。但添加从机发送模式的SAI1后,SAI4与I2S1的所有DMA操作均停止,禁用SAI1的DMA则恢复正常。所有DMA的数据宽度配置为word,模式设为circular。

调试观察到以下现象:

  • 仅在SAI1 DMA未运行时,SAI4与I2S1可正常工作;
  • SAI4与I2S1可对缓冲区进行读写操作;
  • SAI1初始化无错误;
  • HAL_SAI_Transmit_DMA(&hsai_BlockA1...)始终返回HAL_OK,无错误码;
  • SAI1从未触发HAL_SAI_TxHalfCpltCallback()或HAL_SAI_TxCpltCallback()回调函数;
  • SAI1 DMA启动后,I2S1缓冲区数据不再变化。

问题发生的精确时机为HAL_SAI_Transmit_DMA(&hsai_BlockA1...)执行到解锁后返回HAL_OK的时刻。


链接脚本中DMA的RAM分配

.dma_d2_buffer : /* Space before ':' is critical */
  {
    *(.dma_d2_buffer)
  } >RAM_D2
  
  .dma_d3_buffer : /* Space before ':' is critical */
  {
    *(.dma_d3_buffer)
  } >RAM_D3

main.c中关键代码

#if defined( __ICCARM__ )
  #define DMA_D2_BUFFER \
      _Pragma("location=\".dma_d2_buffer\"")
#else
  #define DMA_D2_BUFFER \
      __attribute__((section(".dma_d2_buffer"), used, aligned (4)))
#endif

#if defined( __ICCARM__ )
  #define DMA_D3_BUFFER \
      _Pragma("location=\".dma_d3_buffer\"")
#else
  #define DMA_D3_BUFFER \
      __attribute__((section(".dma_d3_buffer"), used, aligned (4)))
#endif


DMA_D2_BUFFER int32_t inDataI2s[BUFFER_SIZE];
DMA_D2_BUFFER int32_t outDataSai1[BUFFER_SIZE/2];
DMA_D3_BUFFER int32_t outDataSai4[BUFFER_SIZE/2];



int main(void)
{...

...
  status = HAL_I2S_Receive_DMA(&hi2s1, (uint16_t *) inDataI2s, BUFFER_SIZE);
  status = HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t *) outDataSai1, BUFFER_SIZE/2);
  status = HAL_SAI_Transmit_DMA(&hsai_BlockB1, (uint8_t *) outDataSai1, BUFFER_SIZE/2);
  status = HAL_SAI_Transmit_DMA(&hsai_BlockA4, (uint8_t *) outDataSai4, BUFFER_SIZE/2);
  status = HAL_SAI_Transmit_DMA(&hsai_BlockB4, (uint8_t *) outDataSai4, BUFFER_SIZE/2);

while (1)
  {
  }
}

void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s) {
    bufferIndex = 0;
    processData();
}

void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s) {
    bufferIndex = BUFFER_SIZE/2;
    processData();
}

void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai) {
    saiCallback=1;
}

void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai) {
    saiCallback=2;
}

内容的提问来源于stack exchange,提问作者Semmelrinde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:20:11