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/MSP430F5419A:将 UART1与 XT2配合使用

Guru**** 2591310 points
Other Parts Discussed in Thread: MSP430F5419A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/918256/ccs-msp430f5419a-use-uart1-with-xt2

器件型号:MSP430F5419A

工具/软件:Code Composer Studio

尊敬的团队

我的客户使用  具有 XT2的 MSP430F5419A UART 作为时钟源。

 仅使用 UART0.UART2 UART3 (115200bps)时、通信正常。


启用 UART1后、所有 UART 均被禁用、P11.2输出从8MHZ 更改为1MHz。

请帮助。

//
// MSP430F543xA 演示- USCI_A0、115200 UART Echo ISR、DCO SMCLK
//
说明:回显接收到的字符、使用 RX ISR。 正常模式为 LPM0。
// USCI_A0 RX 中断触发 TX 回波。
//带有1048576hz 的波特率分频器= 1048576/115200 =~9.1 (009h|01h)
// ACLK = REFO =~32768Hz,MCLK = SMCLK =默认 DCO = 32 x ACLK = 1048576Hz
//请参阅用户指南了解波特率分频器表
//
MSP430F5438A
// --------
// /|\| |
// || |
// -|RST |
// | |
// | P3.4/UCA0TXD|--- >//
| | 115200 - 8N1
// | P3.5/UCA0RXD|<---
//
// M. Morales
// Texas Instruments Inc.
// 2009年6月
//使用 CCE 版本:3.2.2和 IAR Embedded Workbench 版本:4.11b
//*********





#include 
#define pump P1OUT ^= 0x01

unsigned int Ki;
void SetVcoreUp (unsigned int level);

int main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT

P11DIR |= 0x07; // ACLK、MCLK、SMCLK 设置为引脚
P11SEL |= 0x07; // P11.0,1,2=8MHZ


//======================================== 步骤2 ========================================
SetVcoreUp (PMMCOREV_1);
SetVcoreUp (PMMCOREV_2); //将20MHz
P5SEL 的 VCORE 设置为1.8MHz |= 0x0C; //###### 端口选择 XT2
UCSCTL6 &=~XT2OFF; //###### 启用 XT2 ##########
UCSCTL3 |= SELREF_2; // FLLref = REFO、因为 LFXT1未使用、
//通过 LFXT1提供 FLL 可能导致 XT1OFFG 标志置位
UCSCTL4 |= SELA_2; // ACLK=REFO、SMCLK=DCO、MCLK=DCO
//循环直到 XT1、XT2和 DCO 稳定


UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志

//UCSCTL6 &=~XT2DRIVE0; //根据



泵减少 XT2驱动; //

(Ki=0;Ki<50000;Ki++){的预期频率
泵;
PUMP;

}

UCSCTL4 |= SELS _5;

PUMP;


for (Ki=0;Ki<50000;Ki++){
泵;
泵;

}



//
P3SEL = 0x30; // P3.4、5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; //**将状态机复位**
UCA0CTL1 |= UCSSEL_2; // SMCLK

UCA0BR0 = 69; // 1MHz 115200 (请参阅用户指南)
UCA0BR1 = 0; // 1MHz 115200

UCA0MCTL |= UCBRS_1 + UCBRF_0; //调制 UCBRSx=1、UCBRFx=0
UCA0CTL1 &=~Ω UCSWRST; //**初始化 USCI 状态机**//


P5SEL = 0xC0; // P5 = USCI_A1 TXD/RXD
UCA1CTL1 |= UCSWRST; //**将状态机复位**
UCA1CTL1 |= UCSSEL_2; // SMCLK

UCA1BR0 = 69; // 1MHz 115200 (请参阅用户指南)
UCA1BR1 = 0; // 1MHz 115200

UCA1MCTL |= UCBRS_1 + UCBRF_0; //调制 UCBRSx=1、UCBRFx=0
UCA1CTL1 &=~Ω UCSWRST; //**初始化 USCI 状态机**
*/

//
P9SEL = 0x30; // P9 = USCI_A2 TXD/RXD
UCA2CTL1 |= UCSWRST; //**将状态机复位**
UCA2CTL1 |= UCSSEL_2; // SMCLK

UCA2BR0 = 69; // 1MHz 115200 (请参阅用户指南)
UCA2BR1 = 0; // 1MHz 115200

UCA2MCTL |= UCBRS_1 + UCBRF_0; //调制 UCBRSx=1、UCBRFx=0
UCA2CTL1 &=~UCSWRST; //**初始化 USCI 状态机**

//
P10SEL = 0x30; // P10 = USCI_A3 TXD/RXD
UCA3CTL1 |= UCSWRST; //**将状态机复位**
UCA3CTL1 |= UCSSEL_2; // SMCLK

UCA3BR0 = 69; // 1MHz 115200 (请参阅用户指南)
UCA3BR1 = 0; // 1MHz 115200

UCA3MCTL |= UCBRS_1 + UCBRF_0; //调制 UCBRSx=1、UCBRFx=0
UCA3CTL1 &=~UCSWRST; //**初始化 USCI 状态机**


while (1){
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF=0x41;

while (!(UCA1IFG & UCTXIFG));
UCA1TXBUF=0x42;

while (!(UCA2IFG & UCTXIFG));
UCA2TXBUF=0x43;

while (!(UCA3IFG & UCTXIFG));
UCA3TXBUF=0x44;

__DELAY_CYCLES (1000000);
}



void SetVcoreUp (无符号整型){
//打开 PMM 寄存器进行写入
PMMCTL0_H = PMMPW_H;
//将 SVS/SVM 高电平设置为新的电平
SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
//将 SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
while ((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLIFG);
//将 VCORE 设置为新的电平
PMMCTL0_L = PMMCOREV0 *电平;
//等待达到新级别
IF (((PMMIFG 和 SVMLIFG))
while ((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平侧设定为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;
}




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

    您好 Susan、

    有必要更详细地了解时钟从8MHz 变为1MHz SMCLK 的特定指令执行。 基本上、通过单步执行代码可以很容易地确定这一点。

    此外、这意味着禁用了 UART? 控制寄存器设置? 我猜不是。

    我也觉得用于 DCO 的基准是 REFO 振荡器、因此也是用于 SMCLK 的基准。 SMCLK 再次用于 UART 通信。 请记住、REFO 通常不够准确、无法进行 UART 通信、因为其最大容差超出了 UART 精度。

    此致

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >  P5SEL |= 0x0C;                            // ###### Port select XT2
    [...]
    >  P5SEL = 0xC0;                             // P5 = USCI_A1 TXD/RXD

    The second operation un-does the first, effectively disabling XT2. Try:

    >  P5SEL |= 0xC0;                             // P5 = USCI_A1 TXD/RXD
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Susan、

    请告诉我们、我们是否还能为您做些什么。 非常感谢。

    此致

    Peter