BeHappy 发表于 2025-1-24 00:08:18

串口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>

BeHappy 发表于 2025-1-24 10:19:46

搞清楚了,原来是给超时计数器赋值有顺序
页: [1]
查看完整版本: 串口1无法触发接收超时中断