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/MSP430FR6989:实现反向通道UART功能所需的清晰度

Guru**** 2590930 points
Other Parts Discussed in Thread: MSP430FR6989, MSP-EXP430FR6989

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/634476/ccs-msp430fr6989-clarity-required-to-realize-back-channel-uart-functionality

部件号:MSP430FR6989
主题中讨论的其他部件: MSP-EXP430FR6989

工具/软件:Code Composer Studio

我是初学者,尝试在MSP430FR6989中运行以下程序以访问背面通道UART。 但我面临以下问题,

1. CCS显示2个警告,说明#2580-D pragma vector=接受数值参数或“unused_interrupts”,但不接受USICAB0RX_vector。  

2.使用 IE2 |= UCA0RXIE;CCS抛出错误,使用 UCA0IE |= UCRXIE无错误;  

参考设备管理器选择确切的终端后,我无法在相应的终端中看到任何数据。  

#include <msp430fr6989.h>
#include <stdio.h>

字符串1[]="Hello /n /r";
字符I=0;
字符j =0;

Void主(void)

WDTCTL = WDTPW + WDTHOLD;//停止WDT
PM5CTL0 = 0x00;

P3SEL0 || BIT4 | BIT5;
P3SEL1 &=~(BIT4 | BIT5);


UCA0CTL1 || UCSSEL_1;// CLK = ACLK
UCA0BR0 = 0x03;// 32kHz/9600 = 3.41
UCA0BR1 = 0x00;//
UCA0MCTLW = UCBRS1 + UCBRS0;//调制UCBRSx = 3
UCA0CTL1 &=~UCSWRST;
UCA0IE |= UCRXIE;//IE2 |= UCA0RXIE;


__bis_sr_register(LPM3_bits + GIE);//输入LPM3,中断已启用

}


#pragma vector=USCIAB0TX_vector
__interrupt void USCI0TX_ISR(void)

UCA0TXBUF = string1[I++];

如果(i == sizeof string1)

UCA0IE &=~UCTXIE;//IE2 &=~UCA0TXIE;
}
}


#pragma vector=USCIAB0RX_vector
__interrupt void USCI0RX_ISR(void)

string1[j++]= UCA0RXBUF;

如果(j > sizeof string1 - 1)

I = 0;
J = 0;
UCA0IE &=~UCTXIE;//IE2 |= UCA0TXIE;
UCA0TXBUF = string1[I++];
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否尝试复制用于MSP430G2xx超值系列设备的代码? 您应该使用USI_A1_ISR来处理UCRXConfig和UCTXIFG请求。 我的意思是UCA1,因为这是连接到3.4 的MSP-EXP430FR6989背信道UART的外设。3.5 UCA1IE是正确的寄存器名称,而不是IE2。 现在,您的代码使用VLOCLK来获取ACLK,在这种情况下,典型的9.4 kHz对于波特率生成来说不够稳定或快速。 LFXT未初始化为您预期的32 kHz BRCLK。 您还只能重置UCTXIE,这样UCTXIFG将永远不会创建有效的中断请求(对于此用例,您始终不需要它)。 一旦进行了所有正确的更改,就可以输入UCRXIFG ISR,但在将值加载到UCA1TXBUF之前,您需要先确保已设置UCTXIFG。 我建议您查看从产品页面的“工具和软件”选项卡中找到的msp430fr69xx_euscia0代码示例。

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

    我想知道我的中断调用是否正在进行,因此我声明 P1OUT =0x01;以确保LED切换以成功执行传输中断。  

    程序返回时没有错误,但LED未切换,这反过来假定我的中断未被调用。

    #include <msp430fr6989.h>
    #include <stdio.h>

    字符串1[]="Hello /n /r";
    字符I=0;
    //char j =0;

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;//停止WDT
    PM5CTL0 = 0x00;
    P1OUT = 0x00;
    P1DIR || BIT0;
    P3SEL0 || BIT4 | BIT5;
    P3SEL1 &=~(BIT4 | BIT5);

    CSCTL0_H = CSOKEY >> 8;//解锁时钟寄存器
    CSCTL1 = DCOFSEL_3 | DCORSEL;//将DCO设置为8MHz
    CSCTL2 =拉美_ VLOCLK | SESS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;//设置所有分隔线
    CSCTL4 &=~LFxTOFF;//启用LFFXT1
    CSCTL5 &=~LFxTOFFG;//清除XT1故障标志
    CSCTL0_H = 0;//锁定CS寄存器
                 //FRCTL0 = FRCTLPW | nACCESS_1

    //配置UART模块
    UCA1CTL1 || UCSWRST;//重置
    UCA1CTL1 = UCSSEL__ACLK;// CLK = ACLK
    UCA1BR0 = 3;// 3.2768万/9600 =9600 = 3.4.1333万
    UCA1BR1 = 0x00;
    UCA1MCTLW = 0x5300;//通过N的分数部分设置UCBRSx
    UCA1CTL1 &=~UCSWRST;//设置
    UCA1IE &=~UCRXIE;//IE2 |= UCA0RXIE;

    __bis_sr_register(LPM3_bits + GIE);//输入LPM3,中断已启用

    }


    #pragma vector=USI_A1_vector  
    __interrupt void USI_A1_ISR (void)  


    P1OUT =0x01;         //切换LED -检查中断调用的执行情况
    UCA0TXBUF = string1[I++];

    如果(i == sizeof string1)

    UCA1IE &=~UCTXIE;//IE2 &=~UCA0TXIE;
    }
    }

    //接收中断,但暂时忽略
    /*#pragma vector=USI_A1_vector
    __interrupt void USI_A1_ISR (void)

    string1[j++]= UCA0RXBUF;

    如果(j > sizeof string1 - 1)

    I = 0;
    J = 0;
    UCA1IE &=~UCTXIE;//IE2 |= UCA0TXIE;
    UCA0TXBUF = string1[I++];
    }
    }*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1)您未设置UCA1IE:UCTXIE,因此您不会获得Tx中断。
    2)您正在从VLOCLK运行UART,这对于UART来说不够精确(甚至不够接近)。 我建议使用SMCLK。
    3) LPM3关闭了一组东西,这会混淆事物。 我建议您从LPM0开始。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我做了上述更改, 放弃传输启用是一个愚蠢的错误。 现在,我的CCS统计信息“ USI_A1_ISR”已经定义。

    理论上我可以理解这里发生了什么,但我无法解决这个问题。 我需要在定义接收中断时获得帮助,以便在配置的终端中查看字符的传输和接收。

     

    #include <msp430fr6989.h>
    #include <stdio.h>

    字符串1[]="Hello /n /r";
    字符I=0;
    字符j =0;

    Void主(void)

    WDTCTL = WDTPW + WDTHOLD;//停止WDT
    PM5CTL0 = 0x00;
    P1OUT = 0x00;
    P1DIR || BIT0;
    P9OUT = 0b0万;
    P9DIR =0b1000万;
    P3SEL0 || BIT4 | BIT5;
    P3SEL1 &=~(BIT4 | BIT5);

    CSCTL0_H = CSOKEY >> 8;//解锁时钟寄存器
    CSCTL1 = DCOFSEL_3 | DCORSEL;//将DCO设置为8MHz
    CSCTL2 =拉美_ VLOCLK | SESS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;//设置所有分隔线
    CSCTL4 &=~LFxTOFF;//启用LFFXT1
    CSCTL5 &=~LFxTOFFG;//清除XT1故障标志
    CSCTL0_H = 0;//锁定CS寄存器
    //FRCTL0 = FRCTLPW | nACCESS_1

    //配置UART模块
    UCA1CTL1 || UCSWRST;//重置
    UCA1CTL1 = UCSSEL__SMCLK;// CLK = SMCLK
    UCA0BR0 = 52;
    UCA0BR1 = 0x00;
    UCA0MCTLW || UCOS16 | UCBRF_1 | 0x4900;
    UCA1CTL1 &=~UCSWRST;
    UCA1IE &=~UCRXIE;
    UCA1IE= UCTXIE;

    __bis_sr_register (LPM0_bits + GIE);

    }


    #pragma vector=USI_A1_vector
    __interrupt void USI_A1_ISR (void)


    P1OUT =0x01;//切换LED -检查中断调用的执行
    UCA0TXBUF = string1[I++];

    如果(i == sizeof string1)

    UCA1IE &=~UCTXIE;
    }

    }
    #pragma vector=USI_A1_vector
    __interrupt void USI_A1_ISR (void)

    P9OUT = 0b1000万;
    string1[j++]= UCA0RXBUF;

    如果(j > sizeof string1 - 1)

    I = 0;
    J = 0;
    UCA1IE &=~UCTXIE;
    UCA0TXBUF = string1[I++];
    }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如Ryan指出的那样,FR6xx具有Tx和Rx的单一矢量(ISR功能)。 (这与G2xx MCU等不同。) 您需要将两个功能结合起来,并检查TXIFG/RXIFG标志以查看触发它的原因。

    您还需要设置UCA1IE:UCRXIE以获取Rx中断。

    您是否看到您的"Hello"字符串? 如果没有,您可能需要先花点时间来诊断。 如果UCA配置不正确,您可能会也可能不会看到Rx中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请评估msp430fr69xx_euscia0_UART示例代码,然后从那里构建您的应用程序。

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

    我尝试读取 msp430fr69xx_euscia0_UART示例代码,但它没有帮助我理解使用Tx和Rx单中断的部分。 没有涉及这两者的示例,并且示例代码对于理解工作非常有用。 我想使用背面的UART (WFP 3.4 ,WFP 3.5)发送和接收上述程序的字符串

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    代码示例仅显示了EUSCIA0初始化和ISR的外观,与使用TX中断相比,大多数应用程序选择在填充TXBUF之前仅检查TXBUF是否为空(当TXBUF准备好用于更多数据时标记)。

    此致,
    Ryan