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.

[参考译文] MSP430FR6989:UART (UCA1)和 LPM

Guru**** 2782445 points

Other Parts Discussed in Thread: MSP430FR6989

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/896821/msp430fr6989-uart-uca1-and-lpm

器件型号:MSP430FR6989

尊敬的:  

对于一个项目、我将通过 UCA1使用 UART (在我的 MSP430FR6989上)。 我将 UART 与 ACLK 配合使用、我将使用/将使用 SMCLK 进行16MHz 的时序。  
对于 UART、我使用了示例代码并进行了相应的更改。 但是、它包含以下行: __bis_SR_register (LPM3_bits | GIE);、这会进入 LPM3模式。 但是、我不想进入 LP 模式、因为我需要处理器以16MHz 的频率运行来执行任务(以及 SMCLK)。 每当我从该行中擦除"LPM3_BITS l"(因此不允许它进入 LP 模式)时、我仍然通过 UART 获取某个内容、但它是不可读的。 这是为什么?

还有一个 main.c 代码、按时间顺序调用下面的所有这些函数。

void init_gpio (void){
//WDTCTL = WDTPW | WDTHOLD; //停止看门狗

//配置 GPIO
P3SEL0 |= BIT4 + BIT5; // eUSCI_A1 UART
P3SEL1 &=~(BIT4 + BIT5); // eUSCI_A1 UART
PJSEL0 |= BIT4 | BIT5; //为 ACLK 配置 XT1引脚

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

void init_clocks (void){


//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;

// XT1设置
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz
CSCTL2 = SELA_LFXTCLK | SEL__DCOCLK | SELM_DCOCLK;//ACLK 为 LFXTCLK、SLCK 为 DCO、MCLK 为 DCO
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //设置所有分频器
CSCTL4 &=~LFXTOFF;
操作
{
CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存







器} void init_communication (void){//根据器件数据表的要求配置一个 FRAM 等待状态,以实现 MCLK //操作超过8MHz _Befor_配置时钟系统。
FRCTL0 = FRCTLPW | NWAITS_1;

// XT1设置
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz
CSCTL2 = SELA_LFXTCLK | SELM_DCOCLK | SELM_DCOCLK;//带 LFXTCLK 的 ACLK、带 DCO 的 SLCK、带 DCO
的 MCLK CSCTL3 = DIVA_1 | DIVM_1 | DIVM_1; //设置所有分频
器 CSCTL4 &=~LFXTOFF;
执行
{
CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器

//为 UART 模式配置 USCI_A1
UCA1CTLW0 = UCSWRST; //将 eUSCI 置于复位
UCA1CTLW0 |= UCSSEL_ACLK; // CLK = ACLK
UCA1BR0 = 3; // 9600波特
UCA1MCTLW |= 0x5300; // 32768/9600 - INT (32768/9600)=0.41
// UCBRSx 值= 0x53 (请参阅 UG)
UCA1BR1 = 0;
UCA1CTL1 &=~UCSWRST; //初始化 eUSCI
UCA1IE |= UCRXIE; //启用 USCI_A0 RX 中断

__bis_SR_register (LPM3_bits | GIE); //输入 LPM3、中断启用
__NO_OPERATION ();
}

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_A1_vector
__interrupt void USCI_A1_ISR (void)
#Elif defined (__GNUCI_)


(void USCI_A1_ISR (void)(void)(void USCI_USCI_A1_ISR)(void)(void)(void USCI_AULT_A1)(void USCI_AULT_I_)(void
#endif
{
switch (__even_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
}{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0x55;//出于调试原因
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
} 

并提前感谢您、
Yannick

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

    您好、Yannick、

    如果您使用16MHz、系统时钟设置过程中会有一个约束。 请参见 http://dev.ti.com/tirex/explore/node?node=AMrEoz4vamU2IFWu3UQ7VA__IOGqZri__LATEST 上的示例,请参见函数 initClockTo16MHz()。 有关意见如下:

    //每个器件勘误表在将频率更改为之前将分频器设置为4
    //防止因过冲瞬态而超出规格运行

    代码位于函数中链接的示例中。 系统时钟设置可能未根据系统时钟配置中的注释正确设置。

    您还将在 init_clocks()和 init_communication()中配置系统时钟。 在不同的地方执行此操作的需要是什么? 仅在一个位置配置它是否不够?

    Srinivas

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

    您好 Srinivas、  

    感谢您指出将时钟设置为16MHz 并设置时钟两次的错误。 这一点现已得到处理。 (请参阅下面的新代码)。
    但是、我的初始误差仍然存在。 当我删除 LPM 模式时、Putty 打印出来的唯一内容是"jibberish" A.K.无法读取的点、而不是"U"。  
    对此有任何建议吗?  

    此致、
    Yannick

    PS:新代码:

    void init_gpio (void){
    //WDTCTL = WDTPW | WDTHOLD; //停止看门狗
    
    //配置 GPIO
    P3SEL0 |= BIT4 + BIT5; // eUSCI_A1 UART
    P3SEL1 &=~(BIT4 + BIT5); // eUSCI_A1 UART
    PJSEL0 |= BIT4 | BIT5; //为 ACLK 配置 XT1引脚
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    }
    
    void init_clocks (void){
    
    //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
    //在配置时钟系统之前在8MHz 以上运行。
    FRCTL0 = FRCTLPW | NWAITS_1;
    
    //时钟系统设置
    CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
    CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
    //设置 SMCLK = MCLK = DCO、ACLK = LFXTCLK (如果 VLOCLK 不可用)
    CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
    //每个器件勘误表在将频率更改为之前将分频器设置为4
    //防止因过冲瞬态而超出规格运行
    CSCTL3 = DIVA__4 | DIVM_4;//针对勘误表将所有相应的时钟源设置为4分频
    CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz
    //延迟~10us 以使 DCO 稳定。 60个周期= 20个周期缓冲器+(10us /(1/4MHz))
    _DELAY_CYCLLES (60);
    CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//针对16MHz 运行将所有分频器设置为1
    
    CSCTL4 &=~LFXTOFF;
    操作
    {
    CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1&OFIFG); //测试振荡器故障标志
    
    CSCTL0_H = 0; //锁定 CS 寄存
    器}
    
    void init_communication (void)
    {
    //为 UART 模式配置 USCI_A1
    UCA1CTLW0 = UCSWRST; //将 eUSCI 置于复位
    UCA1CTLW0 |= UCSSEL_ACLK; // CLK = ACLK
    UCA1BR0 = 3; // 9600波特
    UCA1MCTLW |= 0x5300; // 32768/9600 - INT (32768/9600)=0.41
    // UCBRSx 值= 0x53 (请参阅 UG)
    UCA1BR1 = 0;
    UCA1CTL1 &=~UCSWRST; //初始化 eUSCI
    UCA1IE |= UCRXIE; //启用 USCI_A0 RX 中断
    
    __bis_SR_register (LPM3_bits | GIE); //输入 LPM3,启用中断-->删除 LPM3-mode
    __NO_OPERATION ();
    }
    
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A1_vector
    __interrupt void USCI_A1_ISR (void)
    (#USCI_COMPILE_COMPLEILE_AULT_ERSIR_
    (void)(#USCI_A1_COUT_USC_A1_NOT_VERSIR_)(void)(#USCI_NOT_USC_NOT_USC_NOT_UCONVERSIR_)
    
    (不支持)(#
    #endif
    {
    switch (__even_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
    }{
    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = 0x55;//出于调试原因
    __no_operation();
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:break;
    }
    } 

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

    您好、Yannick、

    我认为此设置有问题:

    ----------------------------------------

       UCA1MCTLW |= 0x5300;                      // 32768/9600 - INT(32768/9600)=0.41
       // UCBRSx value = 0x53 (See UG)

    ----------------------------------------

    UG 显示如下:"(1)一行中的 UCBRSx 设置从该行给出的小数部分有效、直到下一行中的小数部分有效"。

    对于0.41、应将其设置为0x92。 0x92对0.4003到0.4286之间的小数部分有效。

    Srinivas