You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:23:26