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.

[参考译文] CCS/MSP430F5529:UART和休眠模式

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430F5529, ENERGYTRACE, MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/632398/ccs-msp430f5529-uart-and-sleep-mode

部件号:MSP430F5529
主题中讨论的其他部件: ENERGYTRACEMSP430G2553

工具/软件:Code Composer Studio

您好!

我尝试在f5529启动板上运行UART。 示例代码正常工作,直到我尝试更改它们。 我想转至LPM3或LPM4,但示例代码仅适用于LPM0。 如果我将其置于任何深度睡眠模式,它会发回错误的字符。 我缺少什么?

#include <MSP4S.h>

内部主(无效)

WDTCTL = WDTPW + WDTHOLD;//停止WDT

P3SEL = BIT3+BIT4;// WFP 3.4 ,5= USI_A0 TXD/RXD

UCA0CTL1 |= UCSWRST;//**将状态机置于复位**
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 9;// 1MHz 11.52万 (请参阅用户指南)
UCA0BR1 = 0;//
UCA0MCTL = UCBRS_1+UCBRF_0;//调制UCBRSx=1,UCBRFx=0
UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
UCA0IE |= UCRXIE;//启用USI_A0 RX中断

__bis_sr_register(LPM0_bits + GIE);//输入LPM0,中断已启用
__no_operation();//用于调试器
}

//回显RXed字符,请先确认TX缓冲区已就绪
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_A0_vector
__interrupt void USI_A0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_A0_vector))) USI_A0_ISR (void)
#否则
错误编译器不受支持!
#endif

Switch(__偶 数_in_range(UCA0IV,4))

案例0:中断;//矢量0 -无中断
案例2://矢量2 - RXIFG
同时(!(UCA0IFG&UCTXIFG);// USI_A0 TX缓冲器就绪?
UCA0TXBUF = UCA0RXBUF;// TX -> RXed字符
中断;
案例4:中断;//矢量4 - TXIFG
默认值:中断;
}
}

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

    您好,

    SMCLK在LPM3中关闭,因此UART无法响应RXIFG。 您需要获取ALCK以访问LPM2中的UART接收中断。

    此致,
    Ryan

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

    #include <MSP4S.h>

    内部主(无效)

    WDTCTL = WDTPW + WDTHOLD; //停止WDT
    IF (CALBC1_1MHz=0xFF) // If calibration constant erased

    同时(1); //不加载,捕获CPU!!
    }
    DCOCTL = 0; //选择最低DCOx和MODx设置
    BCSCTL1 = CALC1_1MHz; //设置DCO
    DCOCTL = CALDCO_1MHz;
    P1DIR = 0xFF; //所有P1.x输出
    P1OUT = 0; //所有P1.x重置
    P1SEL = BIT1 + BIT2 + BIT4; // WFP 1.1 = RXD,WFP 1.2 = TXD
    P1SEL2 = BIT1 + BIT2; // WFP 1.4 = SMCLK,其它GPIO
    P2DIR = 0xFF; //所有P2.x输出
    P2OUT = 0; //所有P2.x重置
    P3DIR = 0xFF; //所有P3.x输出
    P3OUT = 0; //所有P3.x重置
    UCA0CTL1 || UCSSEL_2; // SMCLK
    UCA0BR0 = 8; // 1MHz 11.52万
    UCA0BR1 = 0; // 1MHz 11.52万
    UCA0MCTL = UCBRS2 + UCBRS0; //调制UCBRSx = 5
    UCA0CTL1 &=~UCSWRST; //**初始化USCI状态机**
    IE2 |= UCA0RXIE; //启用USI_A0 RX中断

    __bis_sr_register (LPM4_bits + GIE); //输入LPM4,中断已启用
    }

    //回显RXed字符,请先确认TX缓冲区已就绪
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=USCIAB0RX_vector
    __interrupt void USCI0RX_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (USICAB0RX_vector))) USCI0RX_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    while (!(IFG2&UCA0TXIFG)); // USI_A0 TX缓冲器就绪?
    UCA0TXBUF = UCA0RXBUF; // TX -> RXed字符
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    G2设备可能实际上不会进入LPM3以继续维修UART时钟。 但是,与MSP430G2553相比,这与MSP430F5529器件上存在的UCS6勘误表类似。 您可以测量电流消耗或使用ENERGYTRACE获取有关实际访问的LPM的更多详细信息。

    此致,
    Ryan