【发布时间】:2012-04-12 02:19:35
【问题描述】:
我已经使用这段代码好几天了,无法弄清楚为什么我的中断没有被触发。我知道数据正在成功通过,因为我在逻辑分析仪上使用了探头,而且我的波特率是正确的,因为我可以通过 UART 成功传输。
此时我迷路了,我一遍又一遍地阅读数据表,无法弄清楚我的问题。我将尝试仅包含相关代码,但足以让您了解我的项目中的工作方式。
如果您发现此代码有问题,请告诉我。
谢谢!
main.c 中的代码 sn-ps:
// USART RX interrupt priority
IPR1bits.RCIP = 0;
IPR1bits.TXIP = 0;
// configure the hardware USART device
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT &
USART_CONT_RX & USART_BRGH_LOW, 14);
来自 interrupts.c 的代码 sn-ps
//----------------------------------------------------------------------------
// Low priority interrupt routine
// this parcels out interrupts to individual handlers
#pragma code
#pragma interruptlow InterruptHandlerLow
// This works the same way as the "High" interrupt handler
void InterruptHandlerLow() {
// check to see if we have an interrupt on USART RX
if (PIR1bits.RCIF) {
PIR1bits.RCIF = 0; //clear interrupt flag
uart_recv_int_handler();
}
// check to see if we have an interrupt on USART TX
if (PIR1bits.TXIF && PIE1bits.TXIE) {
// cannot clear TXIF, this is unique to USART TX
// so just call the handler
uart_tx_int_handler();
}
}
UART RX 中断处理程序 sn-p:
void uart_recv_int_handler() {
int msgLen;
//if (DataRdyUSART()) {
uc_ptr->buffer[uc_ptr->buflen] = RCREG;
//uc_ptr->buffer[uc_ptr->buflen] = ReadUSART();
uc_ptr->buflen++;
}
}
【问题讨论】:
-
您是否尝试过“轮询”UART?会发生什么,它接收字符好吗?
-
这个我还没试过,明天下午我可以测试一下,告诉你结果如何。
-
你没有显示也没有提到全局中断启用标志。数据表第 9 节指出,对于默认中断策略,“
INTCON<6>是PEIE位,它启用/禁用所有外设中断源。INTCON<7>是GIE位,它启用/禁用所有中断源。 "如果您为中断启用了优先级 (IPEN),那么您需要设置GIEH和GIEL.
标签: embedded interrupt pic microchip uart