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.

[参考译文] MSP-EXP430FR2433:UART 标准收发器的 UART P2.5和 P2.6故障示例

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/857908/msp-exp430fr2433-trouble-using-uart-p2-5-and-p2-6-for-uart-standard-transceiver-example

器件型号:MSP-EXP430FR2433
主题中讨论的其他器件:MSP430FR2433

您好!

我尝试在 TI Resource Explorer 上配置标准收发器示例、使其在 P2.5/P2.6上工作、而不是在 P1.4/P1.5上工作。 我让它与端口1配置一起工作、但使用 P2时遇到问题。 这是我要使用的代码。  

#include "driverlib.h"
#include


//
// UART 初始化
//

#define LED_OUT P1OUT
#define LED_DIR P1DIR
#define LED_PIN BIT0

#define SMCLK_115200 0
#define SMCLK_9600 1.

#define UART_MODE SMCLK_9600//

空 initUART()

//将 USCI_A0配置为 UART 模式
UCA1CTLW0 |= UCSWRST;//将 eUSCI 置于复位状态
#if UART_MODE = SMCLK_115200

UCA1CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
//波特率设置
//使用表21-5
UCA1BRW = 8;
UCA1MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700为 UCBRSx = 0xF7

#elif UART_MODE = SMCLK_9600

UCA1CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
//波特率设置
//使用表21-5
UCA1BRW = 104;
UCA1MCTLW |= UCOS16 | UCBRF_2 | 0xD600;//0xD600为 UCBRSx = 0xD6
其他
#错误"请将波特率指定为115200或9600 "
#endif

UCA1CTLW0 &=~UCSWRST;//初始化 eUSCI
UCA1IE |= UCRXIE;//启用 USCI_A1 RX 中断

//
//设备初始化
//

空 initGPIO()

LED_DIR |= LED_PIN;
LED_OUT &=~LED_PIN;

//配置 GPIO
P2SEL1 &=~Ω(BIT6 | BIT5);// USCI_A1 UART 操作
P2SEL0 |= BIT6 | BIT5;

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

空 initClockTo16MHz()

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

_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7);//首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_5;//设置 DCO = 16MHz
CSCTL2 = FLLD_0 + 487;//设置为 fDCOCLKDIV =(FLLN + 1)*(fFLLREFCLK/n)
//=(487 + 1)*(32.768 kHz/1)
//= 16MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0);//启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定

CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;

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

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗

initGPIO();
initClockTo16MHz();
inituart();

#if UART_MODE = SMCLK_9600
_bis_SR_register (LPM3_bits + GIE);//由于 ACLK 是源代码、请进入 LPM3、中断被启用
其他
_bis_SR_register (LPM0_bits + GIE);//由于 SMCLK 是源代码、请进入 LPM0、中断被启用
#endif
__no_operation();//用于调试器

//
// UART 中断
//

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_A1_vector
_interrupt void USCI_A1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_A1_vector)) USCI_A1_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))

USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = UCA1RXBUF;
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;

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

    您好、Kirushigan、

    /*-版权所有-、BSD_EX
    *版权所有(c) 2014、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430FR243x 演示-使用 BRCLK = 16MHz 时、eUSCI_A1 UART 以9600波特回显
    //
    说明:此演示回显通过 PC 串行端口接收的字符。
    // SMCLK/DCO 被用作时钟源并且器
    
    件被置于 LPM3中// eUSCI 使用自动时钟使能特性并且 SMCLK 被关闭//当 UART 空闲并且当检测到接收边沿时打开。
    //请注意、在 RS232和 MSP
    //电压电平之间切换需要电平转换器硬件。
    //
    //示例代码显示了寄存器
    //和中断的正确初始化以接收和发送数据。
    //要在 LPM3中测试代码,请断开调试器的连接。
    //
    // ACLK = REFO = 32768Hz、MCLK = DCODIV = SMCLK = 16MHz。
    //
    // MSP430FR2433
    // --------
    // /|\| |
    // || |
    // -|RST |
    // | |
    // | |
    // | P2.6/UCA1TXD|---> PC (回波)
    // | P2.5/UCA1RXD|<-- PC
    // | |
    //
    Zing Zhu
    // Texas Instruments Inc.
    // 2019年11月
    //使用 IAR 嵌入式工作平台 v7.10和 Code Composer Studio v7.3构建
    //*********
    
    #include 
    
    void Init_gpio();
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗定时器
    
    //配置 GPIO
    Init_GPIO ();
    PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
    //激活1个先前配置的端口设置
    
    //根据器件数据表的要求为 MCLK 配置一个 FRAM 等待状态
    //在8MHz 之前配置时钟系统。
    FRCTL0 = FRCTLPW | NWAITS_1;
    
    _ bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
    CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
    CSCTL1 &=~(DCORSEL_7); //清除 DCO 频率选择位第一
    个 CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz
    CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
    __delay_cycles (3);
    __BIC_SR_register (SCG0); //启用 FLL
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定
    
    CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; //将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
    //默认 DCOCLKDIV 作为 MCLK 和 SMCLK 源
    
    //配置 UART 引脚
    P2SEL0 |= BIT5 | BIT6; //将2-UART 引脚设置为第二功能
    
    //配置 UART
    UCA1CTLW0 |= UCSWRST;
    UCA1CTLW0 |= UCSSEL_SMCLK;
    
    //波特率计算
    // 16000000 /(16*9600)= 104.167
    //分数部分= 0.167
    //用户指南表14-4://
    UCBx = 0x10104
    (UCBx = UCB0X16) // 16000000 / 16/9600
    UCA1BR1 = 0x00;
    UCA1MCTLW = 0x1100 | UCOS16 | UCBRF_2;
    
    UCA1CTLW0 &=~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 (__GNU_)
    void __attribute__(interrupt (USCI_A1_vector)#USCI_A1_ISR vector (void
    
    )#elt!#USCI_USCI_UIC_COMPLETE!
    #endif
    {
    switch (__even_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
    }{
    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = UCA1RXBUF;
    __no_operation();
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;
    默认值:break;
    }
    void
    
    Init_gpio()
    {
    P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;
    P1REN = 0xFF;P2REN = 0xFF;P3REN = 0xFF;
    P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;
    }