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.

[参考译文] MSP430FR2311:使用 LaunchPad 的 CCS UART SIMPLE Echo 示例

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/821176/msp430fr2311-uart-simple-echo-example-with-ccs-using-launchpad

器件型号:MSP430FR2311

我遇到了将引脚1.6和1.7连接在一起的简单 UART 回波问题。 我从各种示例中将该代码组合在一起。 当我单步执行代码时、我可以通过调用发送中断(UCTXCPTIFG)来确认传输完成。 当我将中断配置为 UCRXIFG 并单步执行代码时、接收中断永远不会被调用。 我  仅使用 CCS 9.0.0.00004。 以下是我的代码:

#include 
#include 

#define ENABLE_PINS 0xFFFE //需要使用输入和输出



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

P1DIR = BIT0; //使 P1.0成为红色 LED 的输出
P1OUT = 0x00; //红色 LED 最初熄灭

//配置 UART 引脚
P1SEL0 |= BIT6 | BIT7; //将2个 UART 引脚设置为第二个功能

//解锁 GPIO
PM5CTL0 &=~LOCKLPM5;

//根据 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;

//配置 UART
//从用户指南波特率表中,BRCLK = 16000000时为9600波特
// UCBRx = 104;
// UCBRSx = 0xD6
// UCOS16 = 1
// UCBRFx = 2
//分数部分= 0.1667
//用户指南表21-5:UCBRSx = 0xD6
// UCBRFx = 2
UCA0CTLW0 |= UCSWRST;
UCA0CTLW0 |= UCSSEL_SMCLK;
UCA0BRW = 104;
UCA0MCTLW = 0xD600 | UCOS16_1 | UCBRF_2;
UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI

//源= ACLK = 32768Hz,除以16 (2048Hz)
SYSCFG2 |= RTCCKSEL; //选择 ACLK 作为 RTC 时钟
RTCCTL = RTCSS_1 | RTCSR | RTCPS__16;

UCA0IE = UCTXCPTIFG; //接收到 RX 时中断
UCA0TXBUF = 0x56;

_BIS_SR (GIE);

while (1);


}


#pragma vector=USCI_A0_vector
__interrupt void port1_ISR (void)
{
if (UCA0RXBUF > 0x25)
{
P1OUT = BIT0; //打开红色 LED
}
其他
{
P1OUT = 0x00;
}
UCA0IFG = UCA0IFG &(~UCTXCPTIFG); //清除 TX 完成中断标志
UCA0TXBUF = 0x56;
}

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

    您如何执行回送? 您是将 J1引脚还是 J101引脚绑定在一起(MCU 侧)? 如果您使用 J1:是否已从 J101上移除跳线(RXD、TXD)?

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

    我在这里要指出的是、您实际上不会看到 RXIFG "来自"的中断、而是根据稳定的 Tx 流进行轮询(使用 ISR)。 我不能说这是错的--可能有点不寻常--但是如果你想在 RXIFG 上实际触发,添加:

    > UCA0IE |= UCRXIE;  //启用 Rx 中断

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

    解决了这个问题、感谢您的帮助和快速响应!!