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.

[参考译文] 编译器/MSP432P401R:MSP432中的 UART

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/690756/compiler-msp432p401r-uart-in-msp432

器件型号:MSP432P401R

工具/软件:TI C/C++编译器

我创建了一个程序、在该程序中使用 MSP432设置 UART、但无法使 UART 正常工作、能否有人帮助我配置 UART。 或者向我展示一个示例、其中它使用中断、而不使用中断

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

    UART.c

    /*UART 配置*/
    void UART_init (void){
    /*配置 UART*/
    EUSCI_A2->CTLW0 |= EUSCI_A_CTLW0_SWRST; /*将 EUSCI 置于复位状态*/
    EUSCI_A2->CTLW0 = EUSCI_A_CTLW0_SWRST | /*在复位时保持 EUSCI */
    EUSCI_B_CTLW0_ssel_SMCLK; /*配置 EUSCI 时钟 SMCLK*/
    /*波特率计算
    *12000000/(16*9600)=78.125
    *分数部分= 0.125
    *用户指南表21-4:UCBRSx = 0x10
    *UCBRFx=int (78.125-78)*16)=2.
    *
    EUSCI_A2->BRW = 78; /*12000000/16/9600*/
    EUSCI_A2->MCTLW =(2 << EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;
    EUSCI_A2->CTLW0 &=~(EUSCI_A_CTLW0_SWRST); /*初始化 EUSCI*/
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG);
    EUSCI_A2->IE |= EUSCI_A_IE_RXIE; /*启用 UART RX 中断*/
    
    
    /*启用全局中断*/
    __ENABLE_IRQ();
    /*在 EUSCI_A2中断中启用 NVIC */
    NVIC->ISER[0]= 1 <<((EUSCIA2_IRQn)& 31);
    
    }
    /* UART 端口*/
    void confg_UART_wired (void){
    P3->SEL0 |= UART_TX | UART_RX; /*将2个 UART 引脚设置为第二功能*/
    }/*UART
    时钟系统*/
    void UART_cs (void){
    CS->KEY = CS_KEY_VAL; /*解锁 CS 模块寄存器访问*/
    CS->CTL0 = 0; /*重置调整参数*/
    CS->CTL0 = CS_CTL0_DCORSEL_3; /*将 DCO 设置为12MHz (标称值,8-16MHz 范围的中心)*/
    CS->CTL1 = CS_CTL1_SERA_2 | /*选择 ACLK = REFO*/
    CS_CTL1_SELS _3 | /*SMCLK = DCO*/
    CS_CTL1_SELM_3; /*MCLK = DCO*/
    CS->KEY = 0;
    }
    
    
    空 EUSCIA2_IRQHandler (空){
    if (EUSCI_A2->IFG & EUSCI_A_IFG_RXIFG){
    LED_PyOUT (G_LED);
    
    }
    if (EUSCI_A2->IFG & EUSCI_A_IFG_TXIFG){
    LED_PyOUT (R_LED); /*点亮 RX*/
    }上的 P2.x LED
    }
    

    main.c

    void main (void){
    /*清除所有 LED RGB/
    LED_PxCLR (R_LED_G_LED_B_LED);
    LED_PyDIR (R_LED|G_LED|B_LED);
    
    看门狗狗犬;
    UART_CS();
    confg_UART_wired();
    UART_INIT();
    while (1){
    
    }
    }
    
    void WatchDogHold (void){WDTCTL
    = WDTPW | WDTHOLD;/*停止看门狗计时器*/
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    产品页面上提供了示例程序("工具和软件")、但我认为您的程序几乎是正确的。

    > if (EUSCI_A2->IFG & EUSCI_A_IFG_RXIFG){
    > LED_PyOUT (G_LED);

    您需要清除 RXIFG、否则它将持续发生。 执行此操作的最安全方法(如果您不关心字节是什么)是:

    >(void) EUSCI_A2->RXBUF;//读取 Rx 字符并将其丢弃(清除 RXIFG)
    ----
    > if (EUSCI_A2->IFG & EUSCI_A_IFG_TXIFG){
    > LED_PyOUT (R_LED); /*点亮 RX*/上的 P2.x LED

    我要在这里指出,在这个程序中,TXIFG 将一直被置位。 没关系、但:R_LED 和 G_LED 是否相互排斥?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce McKenney 首先 感谢您的帮助。

    我正在尝试安装一个程序、该程序通过 UART 向蓝牙模块发送数据(文本)。  R_LED 和 G_LED 分配给 MSP432卡、仅用于调试。 验证这个发送或接收、但是我不理解 RXIFG 和 TXIFG 的操作、如果我已经很清楚中断的部分可以按如下方式完成:

    void EUSCIA2_IRQHandler (void){
    if (EUSCI_A2->IFG & EUSCI_A_IFG_RXIFG){
    LED_PyOUT (G_LED); /*点亮 RX*/上的 P2.1 LED
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG);
    }
    if (EUSCI_A2->IFG & EUSCI_A_IFG_TXIFG){
    LED_PyOUT (R_LED); /*在 TX*/上点亮 P2.0 LED
    while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG));
    
    }
    } 

    这可能是许多其他用户的疑问、在解决此问题后、我将提供资源、以便能够帮助遇到相同问题的每个人。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG);
    我不建议这样清除 RXIFG。 相反、您应该通过读取 RXBUF 来清除它(正如我在上面所描述的那样)。 在一个完整的应用中、你无论如何都要读取 RXBUF、然后对结果执行一些操作、所以如果你愿意、你可以将它编码为:
    >无符号字符 c = EUSCI_A2->RXBUF;//读取 Rx 字符(清除 RXIFG)
    并添加代码以使用"c"执行某项操作。
    ----
    > while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG));
    这是无害的、因为您已经确定 TXIFG 已置1。 我提到它、因为在 ISR 中使用 TXIFG (或其他任何东西、就这一点而言)通常是一种不良习惯。 这里的代码也取决于您的应用程序的其余部分是如何开发的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我根据您告诉我的内容进行了一些修改和实施

    UART.c

    char RX_Buffer[];
    int buffer_count = 0;
    
    /*UART 配置*/
    void UART_init (void){
    /*配置 UART*/
    EUSCI_A2->CTLW0 |= EUSCI_A_CTLW0_SWRST; /*将 EUSCI 置于复位状态*/
    EUSCI_A2->CTLW0 = EUSCI_A_CTLW0_SWRST | /*在复位时保持 EUSCI */
    EUSCI_B_CTLW0_ssel_SMCLK; /*配置 EUSCI 时钟 SMCLK*/
    /*波特率计算
    *12000000/(16*9600)=78.125
    *分数部分= 0.125
    *用户指南表21-4:UCBRSx = 0x10
    *UCBRFx=int (78.125-78)*16)=2.
    *
    EUSCI_A2->BRW = 78; /*12000000/16/9600*/
    EUSCI_A2->MCTLW =(2 << EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;
    EUSCI_A2->CTLW0 &=~(EUSCI_A_CTLW0_SWRST); /*初始化 EUSCI*/
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG);
    EUSCI_A2->IE |= EUSCI_A_IE_RXIE; /*启用 UART RX 中断*/
    
    
    /*启用全局中断*/
    __ENABLE_IRQ();
    /*在 EUSCI_A2中断中启用 NVIC */
    NVIC->ISER[0]= 1 <<((EUSCIA2_IRQn)& 31);
    
    }
    /* UART 端口*/
    void confg_UART_wired (void){
    P3->SEL0 |= UART_TX | UART_RX; /*将2个 UART 引脚设置为第二功能*/
    }/*UART
    时钟系统*/
    void UART_cs (void){
    CS->KEY = CS_KEY_VAL; /*解锁 CS 模块寄存器访问*/
    CS->CTL0 = 0; /*重置调整参数*/
    CS->CTL0 = CS_CTL0_DCORSEL_3; /*将 DCO 设置为12MHz (标称值,8-16MHz 范围的中心)*/
    CS->CTL1 = CS_CTL1_SERA_2 | /*选择 ACLK = REFO*/
    CS_CTL1_SELS _3 | /*SMCLK = DCO*/
    CS_CTL1_SELM_3; /*MCLK = DCO*/
    CS->KEY = 0;
    }/*
    
    系统时钟为3MHz*/
    
    void delayM(int n)时的延迟毫秒{
    int i、j;
    for (j=0;j < n;j++);
    for (i= 750;i>0;i--);
    }/*UART
    
    计数卡阻发送*/
    void UART_c_String (char *c){
    
    int i;
    for (i=0;c[i];i++){
    Buffer_count++;
    }
    UART_SEND (c、buffer_count);
    }
    
    
    /*UART 发送多个字节*/
    void UART_SEND (unsigned char * pucData、unsigned char ucLength){
    
    while (ucLength){
    /*等待 TX 缓冲区为新数据做好准备*/
    while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG)); /*检查是否未设置*/
    /*如果置位,则 TX 中断正暂挂*/
    EUSCI_A2->TXBUF =*数据; /*将数据推送到 TX 缓冲区*/
    ucLength ----; /*剩余数据长度*/
    pucData++; /*shift pointer */
    }
    /*等待最后一个字节完全发送*/
    while (EUSCI_A2->STATW 和 EUSCI_A_STATW_BUSY); /*这表示 EUSCI 是发送还是接收*/
    }/*UART
    
    获取多个字节*/
    void UART_GET (void){
    RX_Buffer[buffer_count]= EUSCI_A2->RXBUF;
    if (++buffer_count >= 2){
    Buffer_count = 0;
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG); /*重置 RX 标志*/
    }
    }
    
    
    空 EUSCIA2_IRQHandler (空){
    if (EUSCI_A2->IFG & EUSCI_A_IFG_RXIFG){
    UART_GET(); /*点亮 RX*/上的 P2.1 LED
    LED_PyOUT (G_LED);
    }
    if (EUSCI_A2->IFG & EUSCI_A_IFG_TXIFG){
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_TXIFG);
    LED_PyOUT (R_LED); /*点亮 RX*/
    }上的 P2.0 LED
    }
    

    main.c

    void main (void){
    /*清除所有 LED RGB/
    LED_PxCLR (R_LED_G_LED_B_LED);
    LED_PyDIR (R_LED|G_LED|B_LED);
    
    看门狗狗犬;
    UART_CS();
    confg_UART_wired();
    UART_INIT();
    
    UART_c_String ("Hello World!");
    while (1){
    
    }
    }
    
    void WatchDogHold (void){WDTCTL
    = WDTPW | WDTHOLD;/*停止看门狗计时器*/
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG); /*重置 RX 标志*/
    我(仍然)建议您不要这样清除 RXIFG。 读取 RXBUF 已经自动将其清除、这样做是危险的。
    > EUSCI_A2->IFG &=~(EUSCI_A_IFG_TXIFG);
    您不应执行此操作(永远)、因为它会使您的传输停止。 更一般的说:由于你没有使用中断来处理 TX,你的 ISR 根本不应该查看 TXIFG --你应该删除整个 IF()块。

    > char RX_Buffer[];
    如果这是唯一的声明、则声明0字节缓冲区、并且您在其中使用2字节。 (编译器没有就此向您发出警告、我对此感到有点惊讶。) 尝试:
    > char RX_Buffer[2];//另请参阅:UART_GET()中的常量2
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、Bruce、
    我已经完成了您告诉我的操作、但我已经声明 char RX_Buffer[]、因为在 main 中调用函数"uart_c_String()"、在这里我传递我想要发送的整个文本、因此该函数会对字符进行计数并将它们传递到"UART_SEND ()"函数、在这里动态地重新填充缓冲区。 这是否是一种不良做法?

    UART.c

    #include "MSP.h"
    #include "UART.h"
    #include "main.h"
    #include 
    #include 
    
    char RX_Buffer[2];
    int buffer_count = 0;
    
    /*UART 配置*/
    void UART_init (void){
    /*配置 UART*/
    EUSCI_A2->CTLW0 |= EUSCI_A_CTLW0_SWRST; /*将 EUSCI 置于复位状态*/
    EUSCI_A2->CTLW0 = EUSCI_A_CTLW0_SWRST | /*在复位时保持 EUSCI */
    EUSCI_B_CTLW0_ssel_SMCLK; /*配置 EUSCI 时钟 SMCLK*/
    /*波特率计算
    *12000000/(16*9600)=78.125
    *分数部分= 0.125
    *用户指南表21-4:UCBRSx = 0x10
    *UCBRFx=int (78.125-78)*16)=2.
    *
    EUSCI_A2->BRW = 78; /*12000000/16/9600*/
    EUSCI_A2->MCTLW =(2 << EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;
    EUSCI_A2->CTLW0 &=~(EUSCI_A_CTLW0_SWRST); /*初始化 EUSCI*/
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG);
    EUSCI_A2->IE |= EUSCI_A_IE_RXIE; /*启用 UART RX 中断*/
    
    
    /*启用全局中断*/
    __ENABLE_IRQ();
    /*在 EUSCI_A2中断中启用 NVIC */
    NVIC->ISER[0]= 1 <<((EUSCIA2_IRQn)& 31);
    
    }
    /* UART 端口*/
    void confg_UART_wired (void){
    P3->SEL0 |= UART_TX | UART_RX; /*将2个 UART 引脚设置为第二功能*/
    }/*UART
    时钟系统*/
    void UART_cs (void){
    CS->KEY = CS_KEY_VAL; /*解锁 CS 模块寄存器访问*/
    CS->CTL0 = 0; /*重置调整参数*/
    CS->CTL0 = CS_CTL0_DCORSEL_3; /*将 DCO 设置为12MHz (标称值,8-16MHz 范围的中心)*/
    CS->CTL1 = CS_CTL1_SERA_2 | /*选择 ACLK = REFO*/
    CS_CTL1_SELS _3 | /*SMCLK = DCO*/
    CS_CTL1_SELM_3; /*MCLK = DCO*/
    CS->KEY = 0;
    }/*
    
    系统时钟为3MHz*/
    
    void delayM(int n)时的延迟毫秒{
    int i、j;
    for (j=0;j < n;j++);
    for (i= 750;i>0;i--);
    }/*UART
    
    计数卡阻发送*/
    void UART_c_String (char *c){
    int i;
    for (i=0;c[i];i++){
    Buffer_count++;
    }
    UART_SEND (c、buffer_count);
    }
    
    
    /*UART 发送多个字节*/
    void UART_SEND (unsigned char * pucData、unsigned char ucLength){
    
    while (ucLength){
    /*等待 TX 缓冲区为新数据做好准备*/
    while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG)); /*检查是否未设置*/
    /*如果置位,则 TX 中断正暂挂*/
    EUSCI_A2->TXBUF =*数据; /*将数据推送到 TX 缓冲区*/
    ucLength ----; /*剩余数据长度*/
    pucData++; /*shift pointer */
    }
    /*等待最后一个字节完全发送*/
    while (EUSCI_A2->STATW 和 EUSCI_A_STATW_BUSY); /*这表示 EUSCI 是发送还是接收*/
    }/*UART
    
    获取多个字节*/
    void UART_GET (void){
    RX_Buffer[buffer_count]= EUSCI_A2->RXBUF;
    if (++buffer_count >= 2){
    Buffer_count = 0;
    }
    }
    
    
    空 EUSCIA2_IRQHandler (空){
    if (EUSCI_A2->IFG & EUSCI_A_IFG_RXIFG){
    LED_PyOUT (G_LED);
    UART_GET();
    
    }
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有说不做声明、只是说"如果这是唯一的声明"、它需要提供一个大小(您已经做过)。

    那么、当您运行它时、它会做什么呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、  

    我做了一些更改、  串行发送的字符与蓝牙终端中计数的字符相同

    UART.c

    char input[100];
    unsigned int RXByteCtr = 0;
    /*UART 配置*/
    void UART_init (void){
    /*配置 UART*/
    EUSCI_A2->CTLW0 |= EUSCI_A_CTLW0_SWRST; /*将 EUSCI 置于复位状态*/
    EUSCI_A2->CTLW0 = EUSCI_A_CTLW0_SWRST | /*在复位时保持 EUSCI */
    EUSCI_A_CTLW0_MODE_0|
    EUSCI_A_CTLW0_ssel_SMCLK; /*配置 EUSCI 时钟 SMCLK*/
    /*波特率计算
    *12000000/(16*115200)=78.125
    *分数部分= 0.125
    *用户指南表21-4:UCBRSx = 0x10
    *UCBRFx=int (78.125-78)*16)=2.
    *
    EUSCI_A2->BRW = 6; /*12000000/16/9600*/
    EUSCI_A2->MCTLW =(8 << EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;
    EUSCI_A2->CTLW0 &=~(EUSCI_A_CTLW0_SWRST); /*初始化 EUSCI*/
    EUSCI_A2->IFG &=~(EUSCI_A_IFG_RXIFG);
    EUSCI_A2->IE |= EUSCI_A_IE_RXIE; /*启用 UART RX 中断*/
    
    
    /*启用全局中断*/
    __ENABLE_IRQ();
    /*在 EUSCI_A2中断中启用 NVIC */
    NVIC->ISER[0]= 1 <<((EUSCIA2_IRQn)& 31);
    
    }
    /* UART 端口*/
    void confg_UART_wired (void){
    P3->SEL0 |= UART_TX | UART_RX; /*将2个 UART 引脚设置为第二功能*/
    }/*UART
    时钟系统*/
    void UART_cs (void){
    CS->KEY = CS_KEY_VAL; /*解锁 CS 模块寄存器访问*/
    CS->CTL0 = 0; /*重置调整参数*/
    CS->CTL0 = CS_CTL0_DCORSEL_3; /*将 DCO 设置为12MHz (标称值,8-16MHz 范围的中心)*/
    CS->CTL1 = CS_CTL1_SERA_2 | /*选择 ACLK = REFO*/
    CS_CTL1_SELS _3 | /*SMCLK = DCO*/
    CS_CTL1_SELM_3; /*MCLK = DCO*/
    CS->KEY = 0;
    }/*
    
    系统时钟为3MHz*/
    
    void delayM(int n)时的延迟毫秒{
    int i、j;
    for (j=0;j < n;j++);
    for (i= 750;i>0;i--);
    }
    
    void UART_transmit (const char *str){
    而(*str !=0){//do this during current element is not
    //等于空字符
    while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG));
    //确保发送中断标志被置位
    EUSCI_A2->TXBUF =* str++;
    //使用当前字符串元素加载 UCA0TXBUF
    printf ("%c"、EUSCI_A2->TXBUF);
    }
    
    }
    
    
    空 EUSCIA2_IRQHandler (空){
    if (EUSCI_A2->IFG & EUSCI_A_IFG_RXIFG){
    Input[RXByteCTR++]= EUSCI_A2->RXBUF;
    LED_PyOUT (G_LED);
    }
    }
    

    main.c

    const char correct[]="您的密码正确\n";
    
    void main (void){
    /*清除所有 LED RGB/
    LED_PxCLR (R_LED_G_LED_B_LED);
    LED_PyDIR (R_LED|G_LED|B_LED);
    
    看门狗狗犬;
    UART_CS();
    confg_UART_wired();
    UART_INIT();
    
    UART_Transmit (正确);
    while (1){
    }
    }
    
    void WatchDogHold (void){WDTCTL
    = WDTPW | WDTHOLD;/*停止看门狗计时器*/
    } 

    结果:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、这是成功吗? (我不确定我要看什么。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没有 Bruce、我无法在器件上正确获取数据、您能给我一些建议吗?

    我完全迷路了、我不知道该怎么做

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在这里看不到您对 UART_RX 和 UART_TX 的定义。 它们应如下所示:
    >#define UART_RX BIT2 // P3.2 (UCA2RXD)
    >#define UART_TX BIT3 // P3.3 (UCA2TXD)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    所有定义和函数原型都在 uart.h 头文件中定义。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您有 uart.h、我们没有。 这些定义是否看起来正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、定义正确...

    uart.h

    #ifndef UART_H_
    #define UART_H_
    
    /* define*/
    #define UART_TX BIT3
    #define UART_RX BIT2
    
    void UART_INIT (void);
    void confg_UART_Wired (void);
    void UART_cs (void);
    
    
    
    #endif /* UART_H_*
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我获取您的源并(1)完成 LED 功能(2)提供了这些 UART 定义、(3)将 P3.2/3跳线到 Launchpad 的"桥接"接头(J101)时、我使用具有 PuTTY 的 PC 接收到了您的消息。

    这表明故障发生在(a) LED 功能或(b)外部问题、例如接线或蓝牙模块的配置。 我无法检查这些东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce 我和大家分享 main.h、函数在哪里...

    main.h

    #ifndef MAIN_H_
    #define MAIN_H_
    
    void WatchDogHold (void);
    
    /* LED 引脚配置*/
    #define LED_PxOUT P2->OUT
    #define LED_PxDIR P2->DIR
    #define LED_PxCLR (x) LED_PxOUT &=~
    
    
    ^(x & 0x00FF)#define LED_PxLED (x + PxLED)(x + PxLED)#define PxLED (x + PxLED)#define
    
    LED (x + PxLED)#define PxLED (x + PxLED)#define PxLED + PxLED (x + PxLED)#define PxLED + PxLED + PxLED)#define PxLED (0xPxLED /*红色 LED*/
    #define G_LED BIT1 /*绿色 LED*/
    #define B_LED BIT2 /*蓝色 LED*/
    
    #endif /* MAIN_H_*/
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    LED 定义看起来非常无辜。 (我建议在"x"两边加上括号、但这不会给您带来麻烦。)

    我认为这会留下:(b)外部的东西。 下一步是(再次)检查您的接线和 BT 模块配置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您还可以尝试我所做的操作:通过 USB 芯片将 P3.2/3馈送到具有您喜爱的终端程序的 PC。 该结果应告诉您在哪里可以进一步了解。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Armando、

     以下是一些建议:

    1. 关于 Bruce 关于将 P3.2/3路由到 USB 芯片的建议。 如果您有 MSP432 LaunchPad、则无需单独的芯片。  电路板内置的 JTAG 仿真器还通过其 USB 电缆提供反向通道 UART。  您需要移除 J101 RXD 和 TXD 引脚上的现有跳线、并将 P3.2/3连接到引脚(下图黄色框中)
      1. 正确连接后、您可以使用终端仿真器(如 TeraTerm)连接到相应的 COM 端口。 请参阅下图并选择"Application/User UART"
    2. 另一种方法是将 LaunchPad 的 RXD/TXD 引脚(黄色框中)直接连接到蓝牙板、并查看以这种方式驱动时它们是否正常工作。

    希望这会有所帮助。

    -Bob L.

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

    Bruce 和 Bob 感谢您的建议、

    已经意识到他们告诉我的变化、但我没有得到结果、我认为我的问题是数据发送功能和接收、连接中断、我认为这不是很好、