PIC24FJ首次运行时出现假中断触发

时间:2017-01-21 02:14:07

标签: embedded interrupt uart microchip

我正在研究PIC24FJ256GB606器件上的中断驱动UART。我的代码工作得很好,除了UART接收中断第一次被错误触发:例如 主要程序是: [代码]

int main(){

System_init();
uart_init();

// UART2_PPS
  RPINR19bits.U2RXR= 21;
  RPOR13bits.RP26R = 5;

  TRISGbits.TRISG6 = 1;
  TRISGbits.TRISG7 = 0;

        uart_puts("\n**********************************************");
        uart_puts("\nMy project ");
        uart_puts("\n x");
        uart_puts("\n x");
        uart_puts("\n"__DATE__);
        uart_puts("\n**********************************************");
return -1;
}
}

[/代码]

ISR是:

[code]void __attribute__ ( ( interrupt, no_auto_psv ) ) _U2RXInterrupt( void )
{

        IFS1bits.U2RXIF = 0;
        uart_puts("False Trigger");
        __delay_ms(1000);
}[/code]

初始化是:

[![\[code\]int uart_init()
{
    int status = -1;
        size_t i;


   // STSEL 1; IREN disabled; PDSEL 8N; UARTEN enabled; RTSMD disabled; USIDL disabled; WAKE disabled; ABAUD disabled; LPBACK disabled; BRGH enabled; URXINV disabled; UEN TX_RX; 
   U2MODE = 0x8008;
   // OERR NO_ERROR_cleared; URXISEL RX_ONE_CHAR; UTXBRK COMPLETED; UTXEN disabled; ADDEN disabled; UTXISEL0 TX_ONE_CHAR; UTXINV disabled; 
   U2STA = 0x0000;
   // U2TXREG 0; 
   U2TXREG = 0x0000;
   // BaudRate = 9600; Frequency = 4000000 Hz; U2BRG 103; 
   U2BRG = 0x0067;
   // ADMADDR 0; ADMMASK 0; 
   U2ADMD = 0x0000;

            rb_attr_t attr = {sizeof(_rbmem\[0\]), ARRAY_SIZE(_rbmem), _rbmem};
            if (ring_buffer_init(&_rbd, &attr) == 0) { 
            U2MODEbits.UARTEN = 1; // And turn the peripheral on
            U2STAbits.UTXEN = 1; //UART2 Transmit Enable 
            IFS1bits.U2RXIF = 0; //_U2RXIF = 0;
            IEC1bits.U2RXIE = 1; //_U2RXIE = 1;
                status = 0;
            }

    return status;
}\[/code\]][1]][1]

请参阅附图并考虑以下内容, 1)此时微控制器不会收到任何东西。我试图运行相同的代码让rx线打开我得到了相同的结果。 2)如果我禁用接收中断IEC1bits.U2RXIE = 0;

,此代码工作正常

UART

1 个答案:

答案 0 :(得分:0)

嗨Doynax谢谢你的回复。初始化代码由MCC生成并且是错误的! 我在另一个论坛上收到了回复:

您好, UART的初始化代码看起来可能是由MCC生成的。 尽管如此,它表明编程实践不好,因为它在其他设置操作之前启用了模块。

做了什么,与此设备的数据表中推荐的相反, 以及我所看过的所有其他设备。 数据手册第19.2节以8位数据模式传输和第19.3节以8位或9位数据接收 模式: 1.设置UARTx:     a)为数据,奇偶校验和停止位写入适当的值。     b)将适当的波特率值写入UxBRG寄存器。     c)设置发送和接收中断使能和优先级位。 2.启用UARTx。 2.通过将URXEN位(UxSTA< 12>)置1来使能UARTx。

此外,在生成的代码中,写入TXREG = 0000; 这不仅可以清除寄存器,还可以将发送器FIFO寄存器中第一个字节的传输队列化。

此致    Mysil

更改初始化顺序解决了问题!