UART中断无限循环微芯片

时间:2018-01-11 10:42:02

标签: c microcontroller pic uart microchip

您好我正在使用PIC32MX370F512L并遇到“问题”,实际上,这不是一个真正的问题,因为我已经修复了它,但我无法理解为什么我的修复工作。我将向您展示一段代码然后解释:

void __ISR(_UART_4_VECTOR, ipl1) Uart4Handler(void) {
    putU4_string("Entered Interrupt\n\r"); //This command send to my terminal the Text entered
    int c = U4RXREG; // PAY ATTENTION TO THIS LINE <-------
    IFS2bits.U4RXIF = 0; //Clear the Uart4 interrupt flag.
    putU4_string("Exit Interrupt\n\r");
}

如果我不把线放入int c = U4RXREG;然后继续调用中断,我不能再清楚IFS2bits.U4RXIF

这些是我的UART设置:

void UART_Config_Interrupt() {
    INTEnableSystemMultiVectoredInt(); //from plib.h
    IPC9bits.U4IP = 1; //Priority
    IPC9bits.U4IS = 3; //Sub-priority

    IFS2bits.U4RXIF = 0; //Interrupt flag putted at zero
    IFS2bits.U4TXIF = 0;

    IEC2bits.U4RXIE = 1; //Enable RX interrupt
}

void UART_Config_Uart(int baud) {

    U4MODEbits.ON = 0;
    U4MODEbits.SIDL = 0;
    U4MODEbits.IREN = 0;
    U4MODEbits.RTSMD = 0;
    U4MODEbits.UEN0 = 0;
    U4MODEbits.UEN1 = 0;
    U4MODEbits.WAKE = 0;
    U4MODEbits.LPBACK = 0;
    U4MODEbits.ABAUD = 0;
    U4MODEbits.RXINV = 0;
    U4MODEbits.PDSEL1 = 0;
    U4MODEbits.PDSEL0 = 0; //8 bit data NO parity
    U4MODEbits.STSEL = 0; //1 stop bit
    U4MODEbits.BRGH = 0;

    /*Configure baudRate
     *Source: http://ww1.microchip.com/downloads/en/DeviceDoc/61107F.pdf
     */
    UartBrg = (int) (((float) PbusClock / (16 * baud) - 1) + 0.5);
    U4BRG = UartBrg;

    U4STAbits.UTXEN = 1;
    U4STAbits.URXEN = 1;
    U4MODEbits.ON = 1;
}

void UART_Config_Pins() {
    TRISFbits.TRISF12 = 0; //TX as digital output
    RPF12R = 2; // 0010 U4TX ? Mapping U4TX t o RPF12 ;

    TRISFbits.TRISF13 = 1; // RX as digital input
    U4RXR = 9; // 1001 RF13 ? Mapping U4RX t o RPF13
}

我真正的问题是我可以在哪里检索此信息?在清除标志之前,我怎么知道我必须int c = U4RXREG。

这是数据表http://ww1.microchip.com/downloads/en/DeviceDoc/61107F.pdf

我能找到的关于这个主题的唯一信息是在第21.13,26.1.1和21.6.3节中,但我真的无法通过我自己来理解。有人能告诉我如何阅读此数据表以检索此信息?例如:

您搜索的信息位于第Y行的第X行,他们通过这样说明了......

我个人认为它可以在第21页,因为他们说:

pg21第21.6.3节中的一段文字:

====

这意味着,要在清除相应的UxRXIF标志位之前清除这些模块的中断,用户应用程序必须确保 URXISEL控制位指定的中断条件不再成立。

====

如果是,有人可以解释原因吗?或者你怎么解释这个?

Thx:)

2 个答案:

答案 0 :(得分:3)

我认为您需要查看数据表的这一部分:

  

对于具有8级深FIFO的UART模块,中断时会产生中断   URXISEL控制位指定的条件为真。这意味着,清除这些中断   在清除相应的UxRXIF标志位之前,用户应用程序必须确保这一点   URXISEL控制位指定的中断条件不再为真

与此部分一起:

  

对于8级深FIFO UART模块:

     

11 =保留;不要使用

     

10 =中断标志位置位,而接收缓冲区满3/4或更多(即有6个或更多数据)   字符)

     

01 =中断标志位置位,而接收缓冲区为1/2或更高(即有4个或更多数据)   字符)

     

00 =中断标志位置位,而接收缓冲区不为空(即至少有1个数据字符)

这意味着您必须从接收缓冲区中读取一些数据才能清除中断条件。因此,您需要:

int c = U4RXREG;

答案 1 :(得分:0)

U4XREG定义为:

#define U4RXREG         PIC32_R (0x6230) /* Receive */
#define PIC32_R(a)      (0x1F800000 + (a))
<{1>}中的

(参见https://github.com/sergev/pic32sim/blob/master/pic32mx.h

这会读取一个寄存器。也许,由于读取寄存器,芯片会重置其中断状态。