一、问题现象
我使用 HC32L196 芯片,配置了2个串口(UART0/UART2) ,在应用上使用中断进行收发数据,单测试接收时没有遇到问题,但是在测试中断发送时遇到了奇怪情况,同时开启 UART0/2 的中断发送时总是 UART0 会多发送一些字节出来,而 UART2 就正常,而且单独开启发送时2个串口发送数据功能都是正常的。下面2张图分别为 UART0 发出的数据以及 UART2 发出的数据,本应该都是 256 个字节的,从 0x00 - 0xFF :
二、问题分析
1、UART0 和 UART2 共用了一个中断向量号 UART0_2_IRQn ,是不是同时开启时内部中断互相干扰了?
2、尽管共用的中断号,但是中断服务函数入口不是同一个,应该不至于互相影响了吧?可能是另一个只影响到了处理时序。
3、要如何确认定位?是不是直接 debug 分析一下呢?
……………………
相信都会有类似上述疑问吧。
三、问题解决
UART0 的发送逻辑同时使用了发送寄存器空以及发送完成中断,而 UART2 的发送只用到了发送完成中断。debug 能够看到,UART0 在发完 256 个字节后,由于开启了发送完成中断,加上 UART2 中断的影响,从而会在这个时候再次触发进入 UART0 中断服务函数,由于发送处理代码中没有判定发送完成标志位或者没有判定该次中断的进入是否来自发送空(即没有判断发送空中断使能位),从而造成了继续填充发送数据寄存器对外发出了字节的问题。经过修改发送逻辑,可以解决该问题,下图为2个串口发送的数据,正常为 512个字节:
四、参考代码
main_l9x_uart0_uart2_tx_it2.zip
(2.85 KB)
|