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 寄存器中第一个字节的发送进行排队。
此致,
麦斯尔
更改初始化顺序解决了问题!
我正在 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 寄存器中第一个字节的发送进行排队。
此致, 麦斯尔
更改初始化顺序解决了问题!