This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F1611:UART 空 ISR 问题

Guru**** 2039090 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/569681/msp430f1611-uart-empty-isr-problem

器件型号:MSP430F1611

大家好、

我使用 UART 将大量数据从1 MSP 发送到另一 MSP。 我运行的是4MHz 时钟、波特率为115200。 但是、在发送第一个字节后、当我检查 Txbuf 是否就绪时、UART 会卡住。 I、e、

TXBUF0 = 0x00;//随机数据

while (!(IFG1 & UTXIFG0));//代码卡在此处

这是因为 UTXIFG0在数据传输后永远不会置位、或者它被空的 UART0 ISR 置位并立即清零。

#pragma vector=USART0TX_Vector
__interrupt void usart0_TX (void)
{
__no_operation ();
} 

MSP430强制我提供此 ISR、即使它不包含指令。 如果未提供 ISR、则会发出 NMI。

作为权变措施、 我改用了__delay_cycles (1200)。  在这里、任何小于1200的值都会导致丢失位、并且无论波特率如何、这些周期数都保持恒定(对于较低的波特率、我希望周期数更少)。 由于我要发送大量数据、这对我来说已成为瓶颈。

 下面是配置 UART 的方法:

UCTL0 |= char;
UTCTL0 |= SSEL1;

UBR00 = 0x22; // 115200波特率
UBR10 = 0x00;
UMCTL0 = 0xDD;

ME1 |= URXE0+UTXE0; //启用 USART0 TXD/RXD
P3SEL |= 0x30;
P3DIR |= BIT4;
P3DIR &=~BIT5;

UCTL0 &=~SWRST; //初始化 USART 状态机
IE1 |= UTXIE0 + URXIE0; //启用 USART0 RX 中断 

为什么会发生这样的情况、如何克服这种情况?

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅 《MSP430x1xx 系列用户指南》 中"USART 发送中断操作"部分下的第13.2.7节:

    如果中断请求被服务或者一个字符被写入 UxTXBUF、UTXIFG 会自动复位"

    因此、即使您没有在中断内部执行任何操作并且 UTXIFG 正在被清除、也会为中断请求提供服务。 我认为您有两个选择:

    1.在 ISR 内部执行 while (!(IFG1 & UTXIFG0);并在那里重新填充 TXBUF

    2.在 ISR 内部设置一个标志、以知道它已被处理、然后在主循环中对此做出反应

    我认为第一个选项更好、强烈建议在 ISR 内部移动 while (!(IFG1 & UTXIFG0))。

    此致、  
    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我在将数据放入缓冲区之前启动 SWRST、现在它可以正常工作