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.

[参考译文] MSP430FR2433:UART 传输、无输出

Guru**** 2553930 points
Other Parts Discussed in Thread: MSP430FR2433

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/753941/msp430fr2433-uart-transmission-no-output

器件型号:MSP430FR2433

大家好、

目前使用 MSP430FR2433、我的目标是使用 UART 传输消息。 我处于该项目的开始阶段、因此我的当前目标是在同一 Launchpad 上的两个 UART 之间仅发送一条消息。 您将在代码下方找到、它包含硬件初始化(时钟、UART 等)。 但是、没有结果、Putty 似乎配置正确(波特、端口、流控制)在被置入串行模式时不会观察到任何内容。 很抱歉、代码的长度... 希望能得到一些帮助、非常感谢。

#include 
#include "driverlib/MSP430FR2xx_4xx/driverlib.h"
#include 
#include "C:/ti/ccsv8/tools/compiler/ti-cgt-msp430_18.1.3.LTS/include/string.h
#include "C:/ti/ccsv8/tools/compiler/ti-cgt-msp430_18.1.3.LTS/include/time.h
#include "C:/ti/ccsv8/tools/compiler/ti-cgt-msp430_18.1.3.LTS/include/stdio.h


#define DCOFREQ 8000000 //8MHz

#define TXLED BIT0
#define RXLED BIT6
#define MAX_STRBUF_SIZE 1024

void systemInit (void);
void initc (void);
void initEusci (void);void
eUSCI (void)
;void eUSCI (void);void eUSCI (void)

















void UART_rxeString1 (char*);void UART_transmiteString (char*);bool rxStringReady;char transmitString[MAX_STRBUF_SIZE];char txString1[MAX_STRBUF_SIZE]={"ok"};// 0110 1111 01101011 volatile UINT32_t;char txString1



(main_trunt)=系统初始化1

(while trunt);/trunt (while trunt) 1 (intrunit/trunit/trunt) intrunch/trunt (intrunion 1)(intrunt
{
UART_transmitString1 (txString1);

for (i=100000;i>0; i--);

}



















~void systemInit (void){//停止看门狗计时器 WDT_A_HOLD (WDT_A_base);printf ("系统初始化中的 Hello \n");//初始化时钟初始化();// LED 输出 P1DIR |= RXLED + TXLED;P1OUT &= 0x00;//禁用先前配置的 GPIO 电源阻抗 LPM5LPM0 =默认设置/ LPM0

//初始化 UART。
initEusci();
initEusci1();

//启用 gobal 中断
__enable_interrupt ();
}


void incs (void)
{
//初始化时钟
CS_initClockSignal (CS_SMCLK、CS_DCOCLKDIV_select、CS_clock_divider 1);

//出于演示目的,








将 initCs_initCockSignal (CS_SMCLK、CS_DCOCLKDIV0|配置为0
;void 1MxC1MHZ (0| UCC1MHZ) 0| UCC1 (0)
P1SEL1 &=~(BIT4 | BIT5);

//配置 UART
// software-dl.ti.com/.../index.html
// 115 200bps 该值取决于使用的发送器
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockReg Prescalar = 4;
param=1.85;
param.secondModReg = param.modalam;
param.param.param.param_a_uart_no_param.msborLsbartst
= eUSCI_A_uart_lSB_first;
param.numberofStopBits = eUSCI_A_uart_one_stop_bit;
param.uartMode = eUSCI_a_uart_mode;
param.oversam采样= eUSCI_uart_uart_uart_uart_uart_mode;param.oversam_uart_uart_uart_generation

if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)
){
返回;


#EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);

//中断
EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_RECEIVE_INTERRUPT);

//启用 USCI_A0 RX 中断 EUSCI_A_ENTI_RATI_ERSIR_



(USC_A_A1_ENTRIBRATE_ERSI_END_ENTRUCI_ERSION_ERSION_IN_ERSION_ERSION_ERSION_ERSION_ERSION_ERSION_ERSIR_






(#US_ENTRIP_A_)#US_A0)#US_ERSIR_ USC_A_A_A_ERSION_ERSIR_ER_ERSION_ERSION_ERSION_ERSION_ERSION_ERSION_ERSION_ERSION_ER_ERSION_ERSION_ERSI
#endif
{
printf ("i m before the switch\n");
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
printf ("i m in the switch\n");

USCI_NONE 案例:中断;

//运行 halt 的函数
USCI_UART_UCRXIFG 案例:

//读取缓冲区
UART_receiveString (UCA0RXBUF);

//写入缓冲区
UART_transmiteString (rxString);
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;
默认值:break;
}


}void UART_receiveString (char data)
{
printf ("%c\n"、data);
bool rxInProgress = false;
unsigned int charCnt = 0;

if (!rxInProgress)//如果错误、则使用此条件启动中断
{
如果((data!='\n'))//如果它是一条新的线,定时器的值将更改为0。
{
rxInProgress = true;
charCnt = 0;
rxString[charCnt]=数据;
}
}
否则
{//进行中
charCnt++;
if ((数据!='\n'))
{
if (charCnt >= MAX_STRBUF_SIZE)//如果它要发送大于 MAX_STRBUF_SIZE 的长度来读取数据。
{
rxInProgress = false;
}
其他
{
rxString[charCnt]= data;//读取数据并将其写入表中

。}
}
其他
{
rxInProgress = false;
rxString[charCnt]='\0';
//字符串接收完成
rxStringReady = true;
}
}



void UART_transmitString (char *str)
{
int ii = 0;
for (ii = 0;ii < strlen (str);i++)
{
如果(str[i]!=0)
{
//发送字符
while (EUSCI_A_UART_queryStatusFlags (EUSCI_A0_BASE、EUSCI_A_UART_BUSY));
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、str[i]);
}
}





// EUSCI 1
void initEusci1 (void){

//配置 UCA1TXD 和 UCA1RXD
P2SEL0 |= BIT6 | BIT5;
P2SEL1 &=~(BIT6 | BIT4);

//配置 UART
// software-dl.ti.com/.../index.html
EUSCI_A_UART_PARARAM initCLAM ={1}
param.selectClockSource


= param.secondModReg;EUSCI_param 4 =;UCC_param.param
param.param.param.param_a_uart_no_param.msborLsbartst
= eUSCI_A_uart_lSB_first;
param.numberofStopBits = eUSCI_A_uart_one_stop_bit;
param.uartMode = eUSCI_a_uart_mode;
param.oversam采样= eUSCI_uart_uart_uart_uart_uart_mode;param.oversam_uart_uart_uart_generation

if (STATUS_FAIL = EUSCI_A_UART_INIT (EUSCI_A1_BASE、&param)
){
return;
}

eUSCI_A_UART_ENABLE (eUSCI_A1_base);
//不需要启用中断
}


void UART_transmiteString1 (char *str1)
{
int i1 = 0;
printf ("%d\n"、strlen (str1));
for (i1 = 0;i1 < strlen (str1); I1++)
{
if (str1[i1]!= 0)
{
//发送字符
while (EUSCI_A_UART_queryStatusFlags (EUSCI_A1_BASE、EUSCI_A_UART_BUSY));
EUSCI_A_UART_transmitData (EUSCI_A1_base、str1[i1]);
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我理解(?) UCA1TXD 跳线至 UCA0RXD、UCA0TXD 通过 USB 输出。

    是否已从 J3 ("桥接器")接头上移除 RXD 跳线? 否则、UCA1TXD 和 ezFET 将驱动 UCA0RXD (P1.5)线路。

    我建议您首先将 UCA1TXD 直接跳线到 J3 (USB 侧)上的 TXD 引脚、然后使用 PuTTY 查看是否正常。 这将确保您获得了时钟、就这样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce、您好!

    感谢您的回答、我承认、我不理解您的所有建议、对我来说、初始化很复杂。 不过,我会尽量减轻守则的影响,并按照你的建议行事,非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议只移动一些导线。 首先、从 Launchpad 上的 J3上移除 RXD 跳线(黑色小塑料)。

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

    下面是该卡的布线方式  

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

    当我用这种方式连接 Launchpad 并在其上放置您的代码(我必须稍微弄乱 include)时、PuTTY (115200-8-N-1)会反复打印"正常"。

    需要注意的一点是:当调试器处于活动状态时、UART 数据以突发的方式输出(由于 USB 的原因、数据大约为64字节/3秒)、因此您需要保持一定的耐心。 当我断开调试器时、我得到"正常"、可能每秒4次。

    我不确定你和我的表现有何不同。

    [编辑:当 J101是"桥接"接头时、我错误地提到 J3。 我认为 J3是附近具有5V/GND 的双引脚器件。 你似乎已经解决了这个问题,但我要为未来的考古学家提到这个问题。]

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

    它在我设法使该代码工作并发送消息的仿真器出现多个错误后工作。 我现在想用2个 MSP 来实现这一目的、对代码进行一些调整、但我需要两台计算机。 (实际上、我没有成功地在每个 MSP 上并行启动此代码)。 您是否认为可以在同一代码中调用2个不同的 MSP? 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可以使用(两)个不同的目标(Launchpad)同时进行两个调试会话、但这有点难。

    如果可以的话、我尽量避免使用它、方法是选择一个目标作为"已知良好"(或者至少"可能更好")、并对另一个目标运行调试器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、非常感谢您提出的所有建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 PA、

    听起来不错、它现在可以为您提供帮助。 如有进一步的问题、请随时返回 E2E。