找回密码
 立即注册
查看: 127|回复: 5

stc15F处理器UART2异常问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2026-07-03 08:39:59
已绑定手机

20

主题

13

回帖

274

积分

中级会员

积分
274
发表于 2026-5-27 08:14:43 | 显示全部楼层 |阅读模式
遇到一个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); // 上拉准双向口
}



回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-5-27 09:08:20 | 显示全部楼层
检查程序“在某个未知情况下”是不是修改了时钟相关的寄存器,或者关闭了总中断等影响到串口通信。
可将串口无关的代码一块块屏蔽,逐步排查是执行哪一块代码影响了串口通信。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2026-07-03 08:39:59
已绑定手机

20

主题

13

回帖

274

积分

中级会员

积分
274
发表于 2026-5-27 13:31:39 | 显示全部楼层
我想问得是:为什么在不断电的情况下,重新初始化串口,无法使串口正常
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2026-07-03 08:39:59
已绑定手机

20

主题

13

回帖

274

积分

中级会员

积分
274
发表于 2026-5-28 11:04:35 | 显示全部楼层
乘风*** 发表于 2026-5-27 09:08
检查程序“在某个未知情况下”是不是修改了时钟相关的寄存器,或者关闭了总中断等影响到串口通信。
可将串 ...

发现串口初始化函数中要加入IP2  |= 0x01;将串口2设置为高优先级,串口2异常的问题就解决,有点不理解这是为什么?而且上电时串口初始化不加IP2  |= 0x01,一旦异常后,通过按键重新初始化串口,并加入IP2  |= 0x01,串口依旧异常。只是有上电时候串口初始化加入IP2  |= 0x01,串口就不会异常。帮分析下这是为什么,有点不理解
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-5-29 09:03:58 | 显示全部楼层
DSL*** 发表于 2026-5-28 11:04
发现串口初始化函数中要加入IP2  |= 0x01;将串口2设置为高优先级,串口2异常的问题就解决,有点不理解这 ...

是不是在其它中断里面调用了串口2发送函数?并且发送函数还使用串口2中断设置的标志位进行判断是否发送完成?
中断优先级相同情况下,在中断(A)里面发送串口数据,如果串口发送完成标志是在串口中断(B)里面修改的话,就会出现互锁情况。A中断需要等待B中断执行完才能继续往下执行,B中断需要A中断完成后才能触发,这样就相互锁死了。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2026-07-03 08:39:59
已绑定手机

20

主题

13

回帖

274

积分

中级会员

积分
274
发表于 2026-5-30 10:31:47 | 显示全部楼层
乘风*** 发表于 2026-5-29 09:03
是不是在其它中断里面调用了串口2发送函数?并且发送函数还使用串口2中断设置的标志位进行判断是否发送完 ...

完全没在中断函数中调用串口2发送情况,而且115200复现概率要高于9600
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 14:04 , Processed in 0.070942 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表