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