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
相关产品推荐
相关产品推荐

