我有RX中断工作正常,但我想添加TX中断 . 我通过UART响应长命令,并且不希望在发送下一个字节之前浪费等待TX完成的周期 . 我试图启用中断,传输需要传输的数据,然后禁用中断,直到下一个TX数据包出现 .
这适用于我发出的FIRST有效负载 . 我看到它出来就好了 . 但是,一旦我禁用TX中断一次,我就无法再次进入ISR . 如何在MSP430上启用UART上的TX中断并让它再次进入ISR?
在您看到EUSCI_A_UART_enableInterrupt调用的下方,每次中断启用时,此行是否应该触发我的ISR?如果没有,我如何重新回到ISR?
这是传输代码:
void UartSendChar(uint8_t tx_char)
{
ring_buffer_put(_rbdTx, &tx_char);
EUSCI_A_UART_enableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT); // Enable interrupt
}
这是我的ISR:
void EUSCI_A1_ISR(void)
{
int c=-1;
switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
{
case USCI_NONE: break;
case USCI_UART_UCRXIFG:
...
case USCI_UART_UCTXIFG:
// If there's something in the Ring Buffer, transmit it
// If not, then disable TX interrupts until new data gets written.
if (ring_buffer_get(_rbdTx, &c) == 0)
{
EUSCI_A_UART_transmitData(EUSCI_A1_BASE, (uint8_t)c);
}
else
{
EUSCI_A_UART_disableInterrupt(EUSCI_A1_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT);
}
1 回答
我解决了这个问题 . 在这个特定的MSP430中,当读取中断向量并且它显示TX中断时,TXIFG位会自动被micro清零 . (多好啊)
为了在重新启用TX中断后再次触发此ISR,必须再次手动将TXIFG位设置为1,这表示中断挂起 . 这样,当数据被推入队列后启用中断时,TXIFG位置1,因此ISR执行并关闭数据 .
现在我的ISR看起来像这样: