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/LP-MSP430FR2476:LP-MSP430FR2476

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/940502/ccs-lp-msp430fr2476-lp-msp430fr2476

器件型号:LP-MSP430FR2476
主题中讨论的其他器件:MSP430FR2476

工具/软件:Code Composer Studio

您好!

我有一个用过的 MPS430可以使用、它运行良好、但在某些时候它放弃了、UART 功能不能正常工作、这是没有明显原因的。 我猜可能是短路了(但其他功能都可以正常工作)、所以我给了它并换了一个。

但我对该板也有完全相同的问题。 当我想使用它通过 USB 与我的笔记本电脑进行 UART 通信时、一切都正常。 我使用电路板提供的示例代码对其进行了测试、这些代码回传了我发送到电路板的字符、但我没有得到任何结果。 我用另一台 PC 尝试了它、但它在那里也不起作用。

我检查了寄存器的名称是否可能不同、但这似乎不是问题。 它只是 MSP430FR2476、它通过 USB 电缆和 UART 的基本代码连接到我的 PC、但它不起作用。 是否有任何技巧或想法、可能会出什么问题?

#include 

void Init_GPIO();
void Software_Trim (); //获取最佳 DCOFTRIM 值
#define MCLK_FREQ_MHz 的软件调整8. // MCLK = 8MHz

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

//配置 GPIO
Init_GPIO ();

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

__bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
__delay_cycles (3);
__BIC_SR_register (SCG0); //启用 FLL
Software_Trim (); //软件调整以获得最佳 DCOFTRIM 值

CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
//默认 DCODIV 作为 MCLK 和 SMCLK 源

//配置 UART 引脚
P5SEL0 |= BIT1 | BIT2; //将2-UART 引脚设置为第二功能
SYSCFG3|=USCIA0RMP; //设置重映射源
//配置 UART
UCA0CTLW0 |= UCSWRST;
UCA0CTLW0 |= UCSSEL_SMCLK;

//波特率计算
// 8000000 /(16*9600)= 52.083
//分数部分= 0.083
//用户指南表17-4:UCBx=052/
UCBx = 052/ int (UCA52 = 052)
// 8000000/16/9600
UCA0BR1 = 0x00;
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;

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

__bis_SR_register (LPM3_bits|GIE); //输入 LPM3,中断启用
__NO_OPERATION (); //对于调试
器}

void Software_Trim ()
{
unsigned int oldDcotTap = 0xFFFF;
unsigned int newDcoTap = 0xFFFF;
unsigned int newDcoDelta = 0xFFFF;
unsigned int bestDcoDelta = 0xFFFF;
unsigned int csCtl0Copy = 0;
unsigned int csCtl1Copy = 0;
无符号 int csCtl0Read = 0;
无符号 int csCtl1Read = 0;
unsigned int dcoFreqTrim = 3;
unsigned char endLoop = 0;

操作
{
CSCTL0 = 0x100; // DCO 抽头= 256
操作
{
CSCTL7 &=~DCOFFG; //清除 DCO 故障标志
} while (CSCTL7 & DCOFFG); //测试 DCO 故障标志

__DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
//建议等待24个经过分频的 FLL 参考时钟周期
while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))和&((CSCTL7 & DCOFFG)= 0));

CSCCtl0Read = CSCTL0; //读取 CSCTL0
CSCCtl1Read = CSCTL1; //读取 CSCTL1

oldDcoTap = newDcoTap; //记录上次的 DCOTAP 值
NewDcoTap = csCtl0Read & 0x01ff; //获取此次的 DCOTAP 值
dcoFreqTrim =(csCtl1Read & 0x0070)>>4;//获取 DCOFTRIM 值

if (newDcoTap < 256) // DCOTAP < 256
{
newDcoDelta = 256 - newDcoTap; // DCPTAP 和256之间的增量值
if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
endLoop = 1; //停止 while 循环
其他
{
dcoFreqTrim --;
CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim<4);
}
}
其他 // DCOTAP >= 256
{
newDcoDelta = newDcoTap - 256; // DCPTAP 和256之间的增量值
if (oldDcoTap < 256) // DCOTAP 交叉256
endLoop = 1; //停止 while 循环
其他
{
dcoFreqTrim++;
CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim<4);
}
}

if (newDcoDelta < bestDcoDelta) //记录最接近256的 DCOTAP
{
csCtl0Copy = csCtl0Read;
csCtl1Copy = csCtl1Read;
bestDcoDelta = newDcoDelta;
}

}while (endLoop =0); //轮询直至 endLoop = 1

CSCTL0 = csCtl0Copy; //重新加载锁定的 DCOTAP
CSCTL1 = csCtl1Copy; //重新加载锁定的 DCOFTRIM
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直至 FLL 锁定
}


#if defined (_TI_Compiler_version_)|| Defined (_IAR_systems_ICC_)
#pragma vector=USCI_A0_vector (
_ void USC_ISR_ISR (_ void

)(_ nvoid _translation_rupt_

)(_ void _if_if_ifor_ifor_ifor_transl_)(_ u_ifor_ifor_ifor_ifor_ifor_ifor_ifor_ifor_ifor_transl_)(_)
#endif
{
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
}{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = UCA0RXBUF;
__no_operation();
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;
默认值:break;
}
void

Init_gpio()
{
P1DIR = 0xFF;P2DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;
} 

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

    默认情况下、该 MCU 在 P1.4、P1.5上使用 eUSCI_A0。  要使用"重新映射"引脚 P5.1、P5.2请参阅脚注(2)。

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

    反向通道 UART 通过 P1.4/5连接到 UCA0 [参考 LP UG (SLAU802)图16 "目标连接器"、右中]。

    您可以将 P5.1/2引脚跳线连接到 RXD/TXD (USB 侧)、但仅使用 P1.4/5可能更容易(没有 USCIA0RMP)。

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

    如果我不使用 USB 线进行通信、这会对我的问题产生什么影响?

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

    我建议您更改:

    P5SEL0 |= BIT1 | BIT2; //将2-UART 引脚设置为第二功能
    SYSCFG3|=USCIA0RMP; //设置重映射源
    

    更改为  
    P1SEL0 |= BIT4 | BIT5; // UCA0引脚到反向通道 UART (未重新映射)