本帖最后由 huaimengzi 于 2025-7-3 21:00 编辑
单片机为GD32E230C8T6, 利用IDLE空闲中断+DMA接收,利用DMA发送完成后产生中断,在中断中将RS485切换方向。但程序一上电,就直接进入到了DMA中断去了,问题一直无法解决。
/************************************************************************************************
**文 件 名:DMA_Channel1_2_IRQHandler
**说 明:DMA发送完成中断服务函数
**作 用:主要用来给RS485切换方向:发送完成后,切换成接收模式
************************************************************************************************/
void DMA_Channel1_2_IRQHandler(void)
{
if (dma_interrupt_flag_get(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF)) /*如果DMA发送完成标志置位*/
{
while (!usart_flag_get(Uart0_Info.UartNumber, USART_FLAG_TC) ); // 等待USART发送移位寄存器空(确保最后一字节已发出)
DIR_RX0(); /* 发送完成后,切换RS485为接收模式*/
dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF); // 清除DMA中断标志
}
}
2025/6/16 解决办法:
1. 感谢众网友的热心围观与帮助。也感谢ROBOT的乱发一通扩大人气
2. DMA发送完成中断换向这一方案,我一直没有尝试成功,同时也没有相同的方案例程可供参考,所以我放弃了这一方案
3. 换向解决方案:我思考了一下,在DMA开启发送后,查询USART的TC标志位是否置位,置位后,这时切换方向即可,还省去了中断的麻烦,结果传输流畅度非常高
4. 也希望后面有高人继续尝试实现DMA接收不中断,仅DMA发送完成中断这一方案。成功后,请记得@我
|
串口初始化时不允许使能 : usart_transmit_config(Uart0_Info.UartNumber, USART_TRANSMIT_ENABLE); //使能发送 。允许了发送就会申请DMA 喂它数据