GD32E230一上电,就进入DMA中断,求高人指导

[复制链接]
 楼主| huaimengzi 发表于 2025-6-10 22:02 | 显示全部楼层 |阅读模式
本帖最后由 huaimengzi 于 2025-7-3 21:00 编辑

       单片机为GD32E230C8T6, 利用IDLE空闲中断+DMA接收,利用DMA发送完成后产生中断,在中断中将RS485切换方向。但程序一上电,就直接进入到了DMA中断去了,问题一直无法解决。

  1. /************************************************************************************************
  2. **文  件  名:DMA_Channel1_2_IRQHandler
  3. **说      明:DMA发送完成中断服务函数
  4. **作      用:主要用来给RS485切换方向:发送完成后,切换成接收模式
  5. ************************************************************************************************/
  6. void DMA_Channel1_2_IRQHandler(void)
  7. {
  8.     if (dma_interrupt_flag_get(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF))          /*如果DMA发送完成标志置位*/
  9.     {
  10.         while (!usart_flag_get(Uart0_Info.UartNumber, USART_FLAG_TC) );                // 等待USART发送移位寄存器空(确保最后一字节已发出)
  11.         DIR_RX0();                                                                                                       /* 发送完成后,切换RS485为接收模式*/
  12.         dma_interrupt_flag_clear(Uart0_Info.DMA_CH_TX, DMA_INT_FLAG_FTF);       // 清除DMA中断标志
  13.     }
  14. }

2025/6/16    解决办法:
1. 感谢众网友的热心围观与帮助。也感谢ROBOT的乱发一通扩大人气
2. DMA发送完成中断换向这一方案,我一直没有尝试成功,同时也没有相同的方案例程可供参考,所以我放弃了这一方案
3. 换向解决方案:我思考了一下,在DMA开启发送后,查询USART的TC标志位是否置位,置位后,这时切换方向即可,还省去了中断的麻烦,结果传输流畅度非常高
4. 也希望后面有高人继续尝试实现DMA接收不中断,仅DMA发送完成中断这一方案。成功后,请记得@我





  

评论

xch
串口初始化时不允许使能 : usart_transmit_config(Uart0_Info.UartNumber, USART_TRANSMIT_ENABLE); //使能发送 。允许了发送就会申请DMA 喂它数据  发表于 2025-6-11 11:13
jobszheng 发表于 2025-6-10 22:48 来自手机 | 显示全部楼层
我看着代码挺像是 就是发送完成了。人家进入的! 在init函数里面,只配置。等到在要发送的时候再enable DMA
guijial511 发表于 2025-6-11 08:07 来自手机 | 显示全部楼层
接收空闲中断开启情况下,就是一运行就会进入DMA中断把。
zjsx8192 发表于 2025-6-11 08:07 | 显示全部楼层
要不就是芯片挂了
 楼主| huaimengzi 发表于 2025-6-11 09:41 来自手机 | 显示全部楼层
guijial511 发表于 2025-6-11 08:07
接收空闲中断开启情况下,就是一运行就会进入DMA中断把。

接受空闲中断指的是UART中断,跟DMA没关系吧。
 楼主| huaimengzi 发表于 2025-6-11 09:45 来自手机 | 显示全部楼层
zjsx8192 发表于 2025-6-11 08:07
要不就是芯片挂了

没有挂,不开启DMA发送完成NIVC中断,程序只能原路回传一次数据给串口助手,我猜测进入不了中断,485没切换方向,导致串口助手再发送,单片机无法接收。
 楼主| huaimengzi 发表于 2025-6-11 09:46 来自手机 | 显示全部楼层
jobszheng 发表于 2025-6-10 22:48
我看着代码挺像是 就是发送完成了。人家进入的! 在init函数里面,只配置。等到在要发送的时候再enable DMA ...

串口助手收不到单片机数据
qinlu123 发表于 2025-6-11 11:09 | 显示全部楼层
guijial511 发表于 2025-6-11 08:07
接收空闲中断开启情况下,就是一运行就会进入DMA中断把。

接收空闲中断只有在串口收着收着突然收不到了才会触发,如果一开始就收不到是不会触发的。
qinlu123 发表于 2025-6-11 11:11 | 显示全部楼层
本帖最后由 qinlu123 于 2025-6-11 11:18 编辑

你的485切换方向要放到串口发送完成中断里去,而不是放到DMA中断里去。DMA中断里什么东西都不放。
qinlu123 发表于 2025-6-11 11:17 | 显示全部楼层
qinlu123 发表于 2025-6-11 11:26 | 显示全部楼层
看stm32的代码,串口空闲中断、发送完成中断、DMA发送Harf完成中断、接收中断都是在USARTx_IRQHandler()里处理的,和DMA中断没关系。

评论

是我搞错了,HAL库是在DMA发送完成后在DMA中断里操作了串口寄存器继而触发串口中断。  发表于 2025-6-11 13:11
dffzh 发表于 2025-6-11 15:19 | 显示全部楼层
本帖最后由 dffzh 于 2025-6-11 15:21 编辑

1、软件仿真,在main初始化代码位置打个断点后,单步调试,同时打开寄存器查看窗口,看DMA的中断标志寄存器的FTF位是什么时候变成1的。因为标志位缺省值是0,肯定是运行了哪里的代码后标志位变成1了,就进入DMA发送完成中断了,尝试往回分析的方法。
1574568492e850cf5a.png
7034568492cf17c8f4.png
2、与你提的问题倒是无关;
全局标志位Uart0_Comm.Frame_Rec_Flag别忘记加volatile关键字声明一下,否则后面可能会出现偶发性Bug。

评论

[url=home.php?mod=space&uid=2728380]@dffzh[/url] :根本发不过来,页面审核会删除VX  发表于 2025-6-16 09:42
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :感觉发不过来,系统直接屏蔽了  发表于 2025-6-14 01:09
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :@dffzh :太感谢了,苇:smartonly  发表于 2025-6-14 01:05
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :太感谢了,V:smartonly  发表于 2025-6-14 01:04
[url=home.php?mod=space&uid=1087813]@huaimengzi[/url] :方便的话,发个V信,我帮你一起看下。  发表于 2025-6-13 08:44
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :好无奈,网上也找不到相关资料  发表于 2025-6-12 20:20
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :仍没有找到原因  发表于 2025-6-12 20:15
[url=home.php?mod=space&uid=1087813]@huaimengzi[/url] :怎么样了?找到原因没?  发表于 2025-6-12 13:24
[url=home.php?mod=space&uid=1087813]@huaimengzi[/url] :不客气,有进展或者还需要帮忙,直接回复。  发表于 2025-6-11 16:35
好的,我试一下,非常感谢  发表于 2025-6-11 16:29
怀揣少年梦 发表于 2025-6-11 16:50 | 显示全部楼层
中断使能放在所有外设初始化之后
 楼主| huaimengzi 发表于 2025-6-14 01:11 | 显示全部楼层
jobszheng 发表于 2025-6-10 22:48
我看着代码挺像是 就是发送完成了。人家进入的! 在init函数里面,只配置。等到在要发送的时候再enable DMA ...

主要是发送完成中断,开启这个出问题
Pretext 发表于 2025-6-16 23:09 | 显示全部楼层
GD32E230上电后进入DMA中断可能是因为配置不当。检查DMA初始化代码,确保不触发未预期的中断。

评论

顺序也是按官方例程顺序来的, 不明白到底什么情况  发表于 2025-6-17 17:59
tonykuai 发表于 2025-6-24 20:41 | 显示全部楼层
问句跑题的话,为什么你要自己控制RS485的R/T脚?E230的UART有RS485驱动使能功能,直接用USART0_RTS/USART0_DE控制就可以啦!
单芯多芯 发表于 2025-7-2 10:21 | 显示全部楼层
接收中断开启后,系统运行时遇到数据传输就会触发DMA中断。
软核硬核 发表于 2025-7-4 09:20 | 显示全部楼层
中断确实要在外设初始化后开启,确保所有外设都能正确响应。
星闪动力 发表于 2025-7-7 10:59 | 显示全部楼层
中断使能要等外设都初始化完毕再放,确保外设工作正常。
MintMilk 发表于 2025-7-11 09:59 | 显示全部楼层
中断触发DMA传输,确保数据及时处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

40

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

40

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部