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.

[参考译文] MSP430FR6047:MSP430FR6047 UART 功耗

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1315623/msp430fr6047-msp430fr6047-uart-power-consumption

器件型号:MSP430FR6047

我将通过 UART 从 MSP430FR6047发送数据、测得的20mA 功耗

当没有通过 UART 发送任何数据时、我已经测量了0.4mA 的功耗

 通过 UART 传输数据时、我需要实现低功耗、给我建议  

为了便于参考、我附上了我的 UART 代码

#包含
#define ENABLE_PINS 0xFFFE

void uart_init (void);
void uart_sendData (unsigned char data);
char uart_receiveData (void);

int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 = ENABLE_PINS;//准备引脚以供 I/O 使用
PM5CTL0 &=~μ A LOCKLPM5;

P2SEL0 = 0x00;
P2SEL1 = 0x00;

P8SEL0 = BIT2 | BIT3;//为 UART RX 选择 P8.2、为 UART TX 选择 P8.3
P8SEL1 &=~(BIT2 | BIT3);

uart_init ();//初始化 UART 模块

while (1)
{
char receivedChar = uart_receiveData ();//通过 UART 接收字符
if (receivedChar !='\0'){
//将接收到的数据发送到 PuTTY
while (!(UCA3IFG 和 UCTXIFG));//等待 UART 缓冲区就绪
UCA3TXBUF = receivedChar;//发送接收到的字符

//用于传输数据的代码(更改或添加传输数据逻辑)
uart_sendData ('H');//发送字符"H"
uart_sendData ('e');//发送字符'e'
uart_sendData ('l');//发送字符'l'
uart_sendData ('l');//发送字符'l'
uart_sendData ('o');//发送字符'o'
uart_sendData ('\n');
__delay_cycles (1000000);//出于演示目的延迟

返回0;

void uart_init (void)
{
//配置 UART 引脚
UCA3CTLW0 |= UCSWRST;//将 UART 模块置于复位状态
UCA3CTLW0 |= UCSSEL_SMCLK;//选择 SMCLK 作为时钟源
UCA3BR0 = 104;//将波特率设置为9600 (根据您的设置进行调整)
UCA3MCTLW = 0x2000;
UCA3BR1=0;
UCA3CTLW0 &=μ~UCSWRST;//初始化 UART 模块

void uart_sendData (unsigned char 数据)
{
while (!(UCA3IFG & UCTXIFG));
UCA3TXBUF = DATA;//通过 UART 发送数据

char uart_receiveData (void)
{
IF (UCA3IFG & UCRXIFG){
//_delay_cycles (1000000);
返回 UCA3RXBUF;//返回接收到的数据
}其他{
返回"\0";//未接收到数据

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

    发送时的高电流表明串行输出引脚上有负载。

    由于功耗低、您的发送数据代码会缺失。 它花费了大量的时间来等待 TXIFG 位被置位。 使用中断和低功耗模式。

    哦、我不知道您期望 PM5CTL0 = ENABLE_PINS;能 做什么。 该寄存器中恰好有一个有意义的位、因此它会执行下一行代码的操作。

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

    尊敬的 David:

    当然、我将 使用中断。  

    您能否分享上 UART 的电流消耗数据?

    Br.

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

    它在产品说明书中。 第8.11节。

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

    #包含

    int main (空)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗

    //配置 GPIO
    P2SEL0 &=~(BIT0 | BIT1);
    P2SEL1 |= BIT0 | BIT1;// USCI_A0 UART 操作

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~μ A LOCKLPM5;

    //启动最大 DCO 设置的时钟系统~8MHz
    CSCTL0_H = CSKEY_H;//解锁 CS 寄存器
    CSCTL1 = DCOFSEL_3 | DCORSEL;//将 DCO 设置为8MHz
    CSCTL2 = SELM__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;//设置所有分频器
    CSCTL0_H = 0;//锁定 CS 寄存器

    //针对 UART 模式配置 USCI_A0
    UCA0CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
    UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
    //波特率计算
    // 8000000/(16*9600)= 52.083
    //分数部分= 0.083
    //用户指南表24-4:UCBRSx=0x04
    // UCBRFx= int ((52.083-52)*16)= 1
    UCA0BRW = 52;// 800000/16/9600
    UCA0MCTLW |= UCOS16| UCBRF_1 | 0x4900;
    UCA0CTLW0 &=μ~UCSWRST;//初始化 eUSCI
    UCA0IE |= UCTXIE;//启用 USCI_A0 TX 中断

    while (1)
    {
    //通过 UART 传输"hello"
    UCA0TXBUF ="H";
    while (!(UCA0IFG 和 UCTXIFG));
    UCA0TXBUF ="E";
    while (!(UCA0IFG 和 UCTXIFG));
    UCA0TXBUF ="L";
    while (!(UCA0IFG 和 UCTXIFG));
    UCA0TXBUF ="L";
    while (!(UCA0IFG 和 UCTXIFG));
    UCA0TXBUF ="O";
    while (!(UCA0IFG 和 UCTXIFG));

    __delay_cycles (1000000);//出于演示目的延迟

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma vector=EUSCI_A0_vector
    __interrupt void USCI_A0_ISR (void)
    #Elif 已定义(_ GNU _)
    void __attribute_((interrupt (EUSCI_A0_vector)) USCI_A0_ISR (void)
    #else
    #错误编译器不受支持!
    #endif
    {
    开关(__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG)
    {
    USCI_NONE:中止;
    案例 USCI_UART_UCRXIFG:
    while (!(UCA0IFG 和 UCTXIFG));
    UCA0TXBUF = UCA0RXBUF;
    ___ no_operation();
    中断;
    USCI_UART_UCTXIFG 情况:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;
    默认值:中断;

    在此代码中、我降低了 UART 数据传输功耗至1.6mA。 您能给我一些建议、以减少这方面的功耗吗?

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

    TX 引脚上有什么类型的负载? 3300欧姆足以在3.3V 下消耗1 mA 的电流。

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

    我已将 UART 连接到 USB 转换器

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

    请尝试在未连接转换器的情况下运行它。

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

    未测量转换器0.6mA

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

    该计划几乎花费了所有时间(运转)在  

    __delay_cycles (1000000);//出于演示目的延迟

    即它始终处于激活模式、对于这种模式、0.6mA 非常好。 要进一步提高、您需要使用低功耗模式(LPM)。

    在最简单的情况下、将"__delay_cycles ();"更改为"LPM0;"(即"__bis_SR_register (LPM0_bits)"、但更容易键入)、这将暂停 CPU、直到出现任何情况。 在 ISR 中、添加"LPM0_EXIT;"("__BIC_SR_register_on_exit (LPM0_BITS)")、将其唤醒。

    您还应该将"UCTXIE"更改为"UCRXIE"、并在 while (1)循环之前的某个位置添加"__enable_interrupt ();"。

    根据您的当前代码、当您在终端仿真器中键入内容时会发生唤醒。 根据时间执行此操作需要更多/不同的代码、具体取决于您希望使用此代码执行的(长期)操作。  

    TI 示例 msp430fr60x7_euscia0_uart_03.c 说明:

    https://dev.ti.com/tirex/explore/node?node=A__AG6U47Gs2xP-4tSVJKT3eg__msp430ware__IOGqZri__LATEST

    [编辑:固定宏名称]

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

    您添加了一个回传接收到的数据的中断服务例程。 没有更多了。 您仍然没有使用中断进行发送、这意味着 CPU 处于活动状态。