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/MSP430FR5994:将 UART 转移到不同的端口

Guru**** 2589300 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/699986/ccs-msp430fr5994-shift-uart-to-different-port

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

您好!

我正在研究 MSP430FR5994 Launchpad 的标准 UART 收发器示例。 我正在尝试将端口从6更改为2。 我已经完成了所有需要的更改,但它不像原来那样工作。 我是否遗漏了任何东西

#include 

无符号字符数= 0;

//*********
//引脚配置
//

#define LED_OUT P1OUT
#define LED_DIR P1DIR
#define LED0_PIN BIT0
#define LED1_PIN BIT1


//*********
// UART 初始化
//

#define SMCLK_115200 0
#define SMCLK_9600 1
#define ACLK_9600 2

#define UART_MODE SMCLK_115200

void initUART()
{
//将 USCI_A3配置为 UART 模式
UCA0CTLW0 = UCSWRST; //将 eUSCI 置于复位

#if UART_MODE = SMCLK_115200

UCA0CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK

//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 8;
UCA0BR1=0;
UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700为 UCBRSx = 0xF7

#Elif UART_MODE = SMCLK_9600

UCA3CTLW0 |= UCSSEL_SMCLK; // CLK = SMCLK

//波特率设置
//使用系列用户指南中的表30-5
UCA3BR0 = 104;
UCA3BR1=0;
UCA3MCTLW |= UCOS16 | UCBRF_2 | 0xD600;//0xD600为 UCBRSx = 0xD6

#Elif UART_MODE = ACLK_9600

UCA3CTLW0 |= UCSSEL_ACLK; // CLK = ACLK
//波特率计算
// 32768/(9600)= 3.4133
//分数部分= 0.4133
//使用系列用户指南中的表24-5
UCA3BR0=3; // 32768/9600
UCA3BR1=0;
UCA3MCTLW |= 0x9200;//0x9200为 UCBRSx = 0x92

#else
#错误"请将波特率指定为115200或9600 "
#endif

UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
UCA0IE |= UCRXIE; //启用 USCI_A3 RX 中断
}

//*********
//设备初始化
//

void initGPIO()
{
//LED
LED_DIR |= LED0_PIN | LED1_PIN;
LED_OUT &=~(LED0_PIN | LED1_PIN); //关闭 LED

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

//为外部晶体振荡器配置 PJ.5 PJ.4
PJSEL0 |= BIT4 | BIT5; //表示 XT1

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

void initClockTo16MHz ()
{
//根据 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 寄存器
}

//*********
//主要内容
如果使用 SMCLK、//进入 LPM0并等待 UART 中断。 如果使用 ACLK *
//、则器件将改为进入 LPM3模式。 UART RX 中断处理*
//接收到的字符并进行回波。 *
//*********

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

initGPIO();
initClockTo16MHz ();
initUART();
//_enable_interrupts ();
#if UART_MODE = ACLK_9600
_bis_SR_register (LPM3_bits + GIE); //由于 ACLK 是源,所以进入 LPM3,中断被使能
#else
_bis_SR_register (LPM0_bits + GIE); //由于 SMCLK 是源,因此进入 LPM0,中断被启用
#endif
__no_operation(); //调试
器}

//*********
// UART 中断
//

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_A3_vector)))(不

支持 USCI_A3编译器#void!
#endif
{
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
}{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = UCA0RXBUF;
//UCA3TXBUF =计数;
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
}

此致、

Prudhvi Sagar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > P2SEL1 &=~(BIT0 | BIT1); // USCI_A3 UART 操作
    > P2SEL0 |= BIT0 | BIT1;

    根据 SLASE54B 表6-23、这看起来是向后的:SEL1位应该为1和 SEL0位0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    为什么同时使用 UCA0CTLW0和 UCA3CTLW0?

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

    大家好、我已经改变了以下内容、但确实如此

    void initGPIO()
    {
    //LED
    LED_DIR |= LED0_PIN | LED1_PIN;
    LED_OUT &=~(LED0_PIN | LED1_PIN); //关闭 LED
    
    //配置 UART
    //P2SEL1 &=~(BIT0 | BIT1); // USCI_A3 UART 操作
    //P2SEL0 |= BIT0 | BIT1;
    
    P2SEL1 |=~(BIT0 | BIT1); // USCI_A3 UART 操作
    P2SEL0 &= BIT0 | BIT1;
    
    //为外部晶体振荡器配置 PJ.5 PJ.4
    PJSEL0 |= BIT4 | BIT5; //表示 XT1
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    }
    

    此致、

    Prudhvi Sagar

    Esnt 工作、

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

    我的错误、我应该补充一下

    P2SEL1 |= BIT0 | BIT1; //1 USCI_A3 UART 操作
    P2SEL0 &=~(BIT0 | BIT1); //0
    

    此致、

    Prudhvi Sagar