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.
大家好、
我使用 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