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/MSP430FR2000:无法在 P1.2中接收 UART 数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/726804/ccs-msp430fr2000-unable-to-receive-uart-data-in-p1-2

器件型号:MSP430FR2000

工具/软件:Code Composer Studio

您好!

我编写了一个代码、其中 FR2000从 UART 接收数据、并根据在 UART 中接收到的数据启动 RTC。 完全相同的代码适用于 P1.6、但不适用于 P1.2、但数据表显示了 UCA0RXD。  

#include 

/*全局变量*/
#if defined (__IAR_systems_icc__)
__persistent volatile unsigned char timeIncrement = 0;//软件计数变量
#Elif defined (__TI_Compiler_version__)
#pragma PERSISTENT (TIMEINING)
volatile unsigned char timeIncrement = 0; //软件计数变量
#endif

//常数定义*/
#define Increment 0 //软件计数间隔,将其更改为增加
//唤醒时间。

#define SMCLK_115200 0
#define SMCLK_9600 1

#define UART_MODE SMCLK_9600//SMCLK_9600//

void initGpio (void);
void initUART (void);
void initClockTo16MHz (void);

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

//配置 GPIO
initGpio(); //配置 GPIO

inituart();

initClockTo16MHz();

P1OUT ^= BIT4;

操作
{
CSCTL7 = 0; //清除 XT1故障标志
SFRIFG1 = 0; //清除故障标志
} while (SFRIFG1和 OFIFG);//测试振荡器故障标志


CSCTL4 = SELA_XT1CLK; //设置 ACLK = XT1CLK = 32768Hz……更改:初始使用内部时钟 REFO
P1IFG = 0x00; //清除 P1.3 IFG

_bis_SR_register (LPM3_bits | GIE); //输入 LPM3,启用中断
}


void initGpio (void)
{
P1DIR = 0xFF;P2DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;

P2SEL1 = BIT6 | BIT7; // P2.6~P2.7:晶振引脚
SYSCFG0 = FRWPPW; //启用 FRAM 写入访问

P1SEL0 |= BIT6 | BIT7; //将2-UART 引脚设置为第二功能
// P1SEL1 &=~(BIT2 | BIT3); // USCI_A0 UART 操作
//P1SEL0 |= BIT2 | BIT3;

PM5CTL0 &=~LOCKLPM5;
}

void initClockTo16MHz ()
{
FRCTL0 = FRCTLPW | NWAITS_1;

_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_XT1CLK; //将 XT1设置为 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 锁定

操作
{
CSCTL7 = 0; //清除 XT1故障标志
SFRIFG1 = 0; //清除故障标志
} while (SFRIFG1 & OFIFG);//测试振荡器故障标志
}

void initUART()
{
UCA0CTLW0 |= UCSWRST; //将 eUSCI 置于复位
#if UART_MODE = SMCLK_115200

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

#Elif UART_MODE = SMCLK_9600

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

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


//*********
// 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_A1_vector))#USCI_A0

Compiler #a0_aid!
#endif
{
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
}{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA0IFG&UCTXIFG));

P1OUT ^= BIT4;

RTCMOD = UCA0RXBUF;

RTCCTL = RTCSS_XT1CLK | RTCSR | RTCPS__1024 | RTCIE;
//RTCCTL = RTCSS_2 | RTCSR | RTCPS__1024 | RTCIE;//启动 RTC

_bis_SR_register_ON_EXIT (LPM3_BITS | GIE);
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
实例 USCI_UART_UCTXCPTIFG:break;
}
}}

//**
* RTC 中断服务例程
*/
//更改:保持开关打开并无限期等待 UNIT GPIO 中断
#pragma vector=RTC_vector
__interrupt void RTC_ISR (void)
{
开关(__evo_in_range (RTCIV、RTCIV__RTCIFG))
{
案例 RTCIV_none:中断; //无中断
案例 RTCIV_RTCIFG: // RTC 溢出
if (时间增量>=增量)
{
P1OUT ^= BIT4;

时间增量= 0; //清除软件计数器

RTCCTL = RTCSS_2 | RTCSR | RTCPS__1024;//停止 RTC
P1IFG = 0x00;
}
其他
{
时间增量++;
}

_bis_SR_register_ON_EXIT (LPM3_BITS | GIE);
__no_operation();
中断;
默认值:break;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您需要设置 SYSCFG3:USCIARMP=1 [数据表(SLASE78B)第6.11.7]秒。