您好我正在使用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:)
答案 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)
这会读取一个寄存器。也许,由于读取寄存器,芯片会重置其中断状态。