stc15F处理器UART2异常问题
遇到一个uart2异常问题:12M晶振,波特率115200,在某个未知情况下,uart2会异常,无法通信,
即使重新初始化串口也不行,必须设备断电重启,
请帮分析下是什么原因。
uart2初始化函数如下:
void vIotUartInit(void)
{
/*********** 波特率固定使用定时器2 *****************/
u16 dat = 65536UL - (MAIN_FOSC / 4) / BAUDRATE;
AUXR &= ~(1 << 4); // Timer stop
AUXR &= ~(1 << 3); // Timer2 set As Timer
AUXR |= (1 << 2);// Timer2 set as 1T mode
T2H = dat / 256;
T2L = dat % 256;
IE2 &= ~(1 << 2); // 禁止中断
AUXR |= (1 << 4); // Timer run enable
S2CON &= ~(1 << 7); // 8位数据, 1位起始位, 1位停止位, 无校验
IE2 |= 1; // 允许中断
S2CON |= (1 << 4);// 允许接收
P_SW2 &= ~0x01;
P_SW2 |= 0; // UART2 switch to: 0: P1.0 P1.1,1: P4.6 P4.7
/* 管脚P1.0 P1.1 */
P1M1 &= ~(0x03);
P1M0 &= ~(0x03); // 上拉准双向口
}
检查程序“在某个未知情况下”是不是修改了时钟相关的寄存器,或者关闭了总中断等影响到串口通信。
可将串口无关的代码一块块屏蔽,逐步排查是执行哪一块代码影响了串口通信。 我想问得是:为什么在不断电的情况下,重新初始化串口,无法使串口正常 乘风飞扬 发表于 2026-5-27 09:08
检查程序“在某个未知情况下”是不是修改了时钟相关的寄存器,或者关闭了总中断等影响到串口通信。
可将串 ...
发现串口初始化函数中要加入IP2|= 0x01;将串口2设置为高优先级,串口2异常的问题就解决,有点不理解这是为什么?而且上电时串口初始化不加IP2|= 0x01,一旦异常后,通过按键重新初始化串口,并加入IP2|= 0x01,串口依旧异常。只是有上电时候串口初始化加入IP2|= 0x01,串口就不会异常。帮分析下这是为什么,有点不理解 DSL88 发表于 2026-5-28 11:04
发现串口初始化函数中要加入IP2|= 0x01;将串口2设置为高优先级,串口2异常的问题就解决,有点不理解这 ...
是不是在其它中断里面调用了串口2发送函数?并且发送函数还使用串口2中断设置的标志位进行判断是否发送完成?
中断优先级相同情况下,在中断(A)里面发送串口数据,如果串口发送完成标志是在串口中断(B)里面修改的话,就会出现互锁情况。A中断需要等待B中断执行完才能继续往下执行,B中断需要A中断完成后才能触发,这样就相互锁死了。 乘风飞扬 发表于 2026-5-29 09:03
是不是在其它中断里面调用了串口2发送函数?并且发送函数还使用串口2中断设置的标志位进行判断是否发送完 ...
完全没在中断函数中调用串口2发送情况,而且115200复现概率要高于9600
页:
[1]