我正在研究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;
,此代码工作正常答案 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
更改初始化顺序解决了问题!