找回密码
 立即注册
查看: 827|回复: 7

串口2仅使能超时功能和既使能超时又使能中断实验现象不一样

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:218
  • 最近打卡:2025-06-16 00:11:40

50

主题

168

回帖

1767

积分

金牌会员

积分
1767
发表于 2024-7-16 21:27:47 | 显示全部楼层 |阅读模式
本帖最后由 BeHappy 于 2024-7-16 21:34 编辑

环境:

MCU:STC32G8K64
问题描述:
使能了串口2的接收超时功能,用以判断来自串口的数据何时结束,串口2每隔几秒才发几个字节。
每当串口2产生一次中断,对指示灯的状态取反一次,并且给UR2TOCR寄存器赋值。不理解的点出在给这个寄存器的赋值上。进了中断后:
(1)如果给它赋值为80H(使能串口2接收超时功能,但没有使能这个功能的中断),那么实验现象是指示灯常亮(也或许是这个指示灯状态翻转太快,人眼分辨不了?应该不会,因为只有进了串口2的超时中断才会翻转指示灯状态,并且会关闭超时中断,只有串口收到数据才会使能串口2超时中断,串口2每次接收间隔有几秒,很显然,我这眼睛还是能观测得到的);
(2)如果给它赋值为00H(禁用串口2的接收超时功能,也禁用串口2的接收超时中断),那么实验现象是每次进入超时中断,指示灯翻转一次,达到预期。
串口2中断函数代码:
  1. UART2ISR:
  2.         PUSH        ACC
  3.         
  4.         MOV                WR18, #WORD0 UR2TOSR
  5.         MOV                WR16, #WORD2 UR2TOSR
  6.         MOV                R11, @DR16
  7.         JB                ACC.0, HANDLEUR2TO
  8.         
  9.         MOV                A, S2CON
  10.         JNB                ACC.0, HANDLETI
  11.         ; clean UART2 RI interrupt flag
  12.         ANL                S2CON, #NOT 01H
  13.         ; enable UR2 timeout func
  14.         CALL        ENABLEUR2TOINT
  15.         ; skip this interrupt request if CAN frame hasn't sent completed
  16.         JB                UR2FRAMEVERIFIED, UART2ISREND
  17.         
  18.         MOV                R0, UART2WRITEPTR
  19.         MOV                @R0, S2BUF
  20.         ; received bytes number
  21.         INC                UR2RECVCNT
  22.         ; UART2 receiver address increase by 1
  23.         INC                UART2WRITEPTR
  24.         JMP                UART2ISREND
  25.         HANDLETI:
  26.                 JNB                ACC.1, UART2ISREND
  27.                 ANL                S2CON, #NOT 02H
  28.                 JMP                UART2ISREND
  29.         HANDLEUR2TO:
  30.                 CPL                RX_LED
  31.                 ; clean TOIF flag & reset TM
  32.                 MOV                A, #00H
  33.                 MOV                WR18, #WORD0 UR2TOSR
  34.                 MOV                WR16, #WORD2 UR2TOSR
  35.                 MOV                @DR16, R11
  36.                 ; disable UART2 timeout interrupt
  37.                 MOV                A, #80H
  38.                 MOV                WR18, #WORD0 UR2TOCR
  39.                 MOV                WR16, #WORD2 UR2TOCR
  40.                 MOV                @DR16, R11
  41.                 CALL        VERIFYUR2FRAME
  42.         UART2ISREND:
  43.                 POP                ACC
  44.                 RETI
复制代码
这个是串口2每次RI中断开启接收超时中断的函数:
  1. ENABLEUR2TOINT:
  2.         MOV                WR18, #WORD0 UR2TOCR
  3.         MOV                WR16, #WORD2 UR2TOCR
  4.         MOV                R11, @DR16
  5.         JB                ACC.6, ENABLEUR2TOINTEND
  6.         ORL                A, #40H
  7.         MOV                @DR16, R11
  8.         ENABLEUR2TOINTEND:
  9.                 RET
复制代码
期望的现象是,在超时中断里不管给寄存器UR2TOCR赋值00H还是80H(肯定的,ENABLEUR2TOINT给寄存器的赋值也会跟随变化的),实验现象应该都一样的。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-06-15 22:44:24
已绑定手机

19

主题

3231

回帖

5281

积分

论坛元老

积分
5281
发表于 2024-7-16 22:40:54 | 显示全部楼层
能用汇编的都是牛人啊。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9128

积分

超级版主

DebugLab

积分
9128
发表于 2024-7-17 16:51:15 | 显示全部楼层
串口中断和串口超时中断入口地址相同,使用串口中断,每接收一个字节进入一次中断,串口超时再进入一次,如果在中断内反相某IO,进中断次数为偶数次则数据包发送前后IO状态一致,速度快无法分辨

点评

关闭串口超时中断,中断次数-1,变为奇数,人眼观察LED才有变化,可以尝试打开串口超时中断的同时,数据包增加或减少1个字节,再观察LED  详情 回复 发表于 2024-7-17 16:53
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9128

积分

超级版主

DebugLab

积分
9128
发表于 2024-7-17 16:53:56 | 显示全部楼层
Debu*** 发表于 2024-7-17 16:51
串口中断和串口超时中断入口地址相同,使用串口中断,每接收一个字节进入一次中断,串口超时再进入一次,如 ...

关闭串口超时中断,中断次数-1,变为奇数,人眼观察LED才有变化,可以尝试打开串口超时中断的同时,数据包增加或减少1个字节,再观察LED
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:218
  • 最近打卡:2025-06-16 00:11:40

50

主题

168

回帖

1767

积分

金牌会员

积分
1767
发表于 2024-7-17 22:54:58 | 显示全部楼层
本帖最后由 BeHappy 于 2024-7-17 23:05 编辑
Debu*** 发表于 2024-7-17 16:53
关闭串口超时中断,中断次数-1,变为奇数,人眼观察LED才有变化,可以尝试打开串口超时中断的同时,数据 ...

感谢指导 :-)
按说,我只在串口2的接收超时中断处理中,翻转IO状态,如果未使能接收超时中断(即,bit位ENTOI置零),那么位于超时中断处理中翻转IO状态的语句定然不会起作用。但,实际并非如此,除非把bit位ENTO也置零,才能阻止串口2中断函数翻转IO状态,实在不理解这种现象。明明未使能接收超时中断(bit位ENTO置位,ENTOI置零的情况下),为啥还会进入到接收超时中断的处理函数中去?

点评

如果是因为串口接收或发送一个字节完毕进入中断,就不要翻转吧  详情 回复 发表于 2024-7-17 23:08
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9128

积分

超级版主

DebugLab

积分
9128
发表于 2024-7-17 23:08:08 | 显示全部楼层
BeHa*** 发表于 2024-7-17 22:54
感谢指导 :-)
按说,我只在串口2的接收超时中断处理中,翻转IO状态,如果未使能接收超时中断(即,bit位EN ...

如果是因为串口接收或发送一个字节完毕进入中断,就不要翻转吧
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 2024-7-18 14:09:40 | 显示全部楼层
BeHa*** 发表于 2024-7-17 22:54
感谢指导 :-)
按说,我只在串口2的接收超时中断处理中,翻转IO状态,如果未使能接收超时中断(即,bit位EN ...

串口超时中断跟串口接收RI中断、发送TI中断使用同一个中断地址。
如果你开启了接收超时功能ENTO,即便你没有开启接收超时中断ENTOI,在产生接收超时情况下,TOIF中断标志位也会置位。
虽然不会因此触发中断,但是如果是TI或者RI中断触发进入了中断函数,此时在中断函数里面判断TOIF是1而执行对应的中断函数,就会进入到接收超时中断的处理函数中去。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:218
  • 最近打卡:2025-06-16 00:11:40

50

主题

168

回帖

1767

积分

金牌会员

积分
1767
发表于 2024-7-18 22:02:21 | 显示全部楼层
乘风*** 发表于 2024-7-18 14:09
串口超时中断跟串口接收RI中断、发送TI中断使用同一个中断地址。
如果你开启了接收超时功能ENTO,即便你 ...

非常感谢!
实验现象也是这么个情况。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 19:47 , Processed in 0.233749 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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