串口1无法触发接收超时中断
<h2>实验环境</h2><p>mcu: 8051U</p>
<h2>实验目的</h2>
<p>串口1用DMA功能接收数据,同时使能串口1的接收超时功能。确认超时发生后,再对UART1的DMA接收缓冲区进行读操作。</p>
<h2>问题描述</h2>
<p>能触发串口1的DMA中断(达到指定的数量),但是无法进入串口1的超时中断</p>
<p>串口1接收超时中断配置和中断响应函数如下:</p>
<pre><code>UR1RTOCONF:
CLR UR1RTO
/*
enable UART1 receive tomeout func
enable UART1 receive timeout interrupt
*/
MOV A, #0E0H
MOVH DR28, #WORD2 UR1TOCR
MOV WR30, #WORD0 UR1TOCR
MOV @DR28, R11
; clean UART1 receive timeout flag
MOVH DR28, #WORD2 UR1TOSR
MOV WR30, #WORD0 UR1TOSR
MOV R11, @DR28
ORL A, #80H
MOV @DR28, R11
; set timeout time: 5ms
MOV A, #BYTE2(12 * 1000 * 5)
MOVH DR28, #WORD2 UR1TOTE
MOV WR30, #WORD0 UR1TOTE
MOV @DR28, R11
MOV A, #HIGH(12 * 1000 * 5)
MOVH DR28, #WORD2 UR1TOTH
MOV WR30, #WORD0 UR1TOTH
MOV @DR28, R11
INC DR28, #1D
MOV A, #LOW(12 * 1000 * 5)
MOV @DR28, R11
RET
</code></pre>
<p>串口1中断响应:</p>
<pre><code>UART1ISR:
PUSH ACC
PUSH DR28
JB RI, HANDLERI
JB TI, HANDLETI
MOV A, #'1'
CALL UART4SENDBYTE
MOVH DR28, #WORD2 UR1TOSR
MOV WR30, #WORD0 UR1TOSR
MOV R11, @DR28
JB ACC.0, HANDLEUR1RTO
JMP UART1ISREND
HANDLERI:
CLR RI
JMP UART1ISREND
HANDLETI:
CLR TI
JMP UART1ISREND
HANDLEUR1RTO:
; clean UART1 receive timeout flag
MOVH DR28, #WORD2 UR1TOSR
MOV WR30, #WORD0 UR1TOSR
MOV R11, @DR28
ORL A, #80H
MOV @DR28, R11
SETB UR1RTO
UART1ISREND:
POP DR28
POP ACC
RETI
</code></pre>
搞清楚了,原来是给超时计数器赋值有顺序
页:
[1]