PIC24FJ 第一个 运行 期间的错误中断触发

PIC24FJ False interrupt trigger during first run

我正在 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;
}
}

[/code]

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;

嗨,Doynax,感谢您的回复。初始化代码是由 MCC 生成的,有错误! 我在另一个论坛上收到回复:

你好, UART 的初始化代码看起来可能是由 MCC 生成的。 尽管如此,它还是证明了糟糕的编程习惯,因为它在其他设置操作之前启用了模块。

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

此外,在生成的代码中,写入TXREG = 0000; 这不仅会清除寄存器,还会对发送器 FIFO 寄存器中第一个字节的发送进行排队。

此致, 麦斯尔

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