MSPEXP430F5529LP上MSP430F5529的UART配置无误却无法发送
MSP430 UART 发送中断UCTXIFG标志无法清除问题
#include <msp430.h> static int next = 0; #pragma vector=USCI_A0_VECTOR interrupt void bc_uart_irq(void) { int transmit_flag = UCA0IFG & UCTXIFG; if (transmit_flag && next == 0) { next = 1; UCA0TXBUF = 0x01; // 理论上应清除UCTXIFG } else if (transmit_flag) { next = 0; UCA0TXBUF = 0x55; // 理论上应清除UCTXIFG(实际无效!) } } /** * main.c */ int main(void) { WDTCTL = WDTPW | WDTHOLD; // 停止看门狗 // 配置UART引脚 P3SEL |= 0x18; // 默认UCA0TXD/UCA0RXD对应P3.3/4 P3DIR |= BIT3 + BIT4; // 配置TA0使用SMCLK用于调试 TA0CTL = 0x0220; UCA0CTL1 |= UCSWRST; // 配置USCI_A0时钟源为SMCLK UCA0CTL1 |= UCSSEL__SMCLK; // 设置USCI为UART模式 UCA0CTL0 &= ~UCSYNC; // 配置UART参数 UCA0CTL0 &= ~UCPEN; // 无校验位 UCA0CTL0 &= ~UC7BIT; // 8位数据 UCA0CTL0 &= ~UCMSB; // 低位优先 UCA0CTL0 &= ~UCMODE0; // UART模式(00) UCA0CTL0 &= ~UCMODE1; // 设置波特率9600(br = 104, brs = 1, brf = 0) UCA0BR0 = 107; UCA0BR1 = 0; UCA0MCTL = 0x02; // UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; UCA0IE |= 0xFFFF; // 使能发送和接收中断 __bis_SR_register(GIE); while(1) {} return 0; }
已针对该问题调试许久,无论何种情况,向发送缓冲区写入数据都无法自动清除UCTXIFG标志(也尝试过在中断中手动清除),且UCBUSY位始终未置高。
已尝试的排查手段:
- 改用USCI_A1模块而非A0,将引脚切换至P4.4/5
- 更换时钟源(最初使用ACLK)
- 置高UCLISTEN位
当前代码与同类问题中的示例代码结构一致,但问题依旧。已通过调试器确认SMCLK正在运行(单步执行时计时器数值持续增长),目前推测最可能的原因是时钟未传输至USCI外设,但无法验证这一点,也不知道如何测试。
补充:使用CCS开发,唯一特殊情况是若数据内存模型设为非small(比如large),编译器会报错。
内容的提问来源于stack exchange,提问作者Pathless
相关产品推荐
相关产品推荐

