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:通过UART发送整数值

Guru**** 2535150 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/578045/msp430fr2311-send-integer-value-over-uart

部件号:MSP430FR2311
主题中讨论的其他部件:Energia

您好,我在串行监视器上发送int值1023时遇到问题。 如果ADC_Result为1023或1或任何其它数字,我看不到串行上的1023。

#include <MSP430-h>

int ADC_result;
#include <stdio.h>
void init_UART ();
void init_led ();

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止WDT

INIT_UART();
init_led ();

//配置GPIO
//P1DIR |= BIT0; //将WFP 1.0 设置为输出方向
//P1OUT &=~BIT0; // WFP 1.0 指示灯熄灭

//配置ADC A1引脚
P1SEL0 |= BIT1;
P1SEL1 |= BIL1;

//禁用GPIO开机默认高阻抗模式以激活
//以前配置的端口设置
PM5CTL0 &=~LOCKLPM2;

//配置ADC10
ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON,S&H=16 ADC CLKS
ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC;采样计时器
ADCCTL2 |= ADCRES; // 10位转换结果
ADCIE |= ADCIE0; //启用ADC连接完全中断
ADCMCTLS0 || ADCINCH_1 | ADCSREF_1; // A1 ADC输入选择;参考电压=1.5V

//配置参考
PMMCTL0_H = PMMPW_H; //解锁PMM寄存器
PMMCTL2 |= INTREFEN; //启用内部参考
__DELAY周期(400); //参考确定延迟

同时(1)
{
ADCCTL0 |= ADCENC | ADCSC; //开始采样和转换
__bis_sr_register (LPM0_BITS | GIE); // LPM0,ADC_ISR将强制退出
IF (ADC_Result < 0x155)
P1OUT &=~BIT0; //清除WFP 1.0 LED关闭
否则
P1OUT |= BIT0; //将WFP 1.0 LED设置为打开
while (!(UCA0IFG & UCTXIFG));//等待USSCI_A0 TX缓冲器就绪

CHAR ADC_Char[16];
Sprintf (ADC_Char,"%d",ADC_Result);
UCA0TXBUF = ADC_Result;

__delay_cycles(5000);
}
}//

此函数对UART进行初始化,以便它可以具有8个数据位,无奇偶校验,1个停止位和9600

void init_UART ()
{
//配置UART引脚
P1SEL0 || BIT6 | BIT7; //将2-UART引脚设置为第二个功能

//配置UART
UCA0CTLW0 |= UCSWRST; //设置软重置启用
UCA0CTLW0 |= UCSSEL__SMCLK; //将SMCLK设置为BRCLK,用于11.52万的波特率

//波特率计算。 将波特率设置为11.52万
UCA0BR0 = 8; // 100万/115200 =11.52万 = 8.68 INT (N)= 8
UCA0MCTLW = 0xD600; // 100万/115200 -11.52万 - INT (100万/115200)11.52万)= 0.68
UCA0BR1 = 0x00; // UCBRSx值= 0xD6

UCA0CTLW0 &=~UCSWRST; //初始化eUSCI

}



void init_led (){
//配置GPIO
P1DIR || BIT0; //将WFP 1.0 设置为输出方向
P1OUT &=~BIT0; //










编译器1.0 LED关闭}// ADC中断服务例程#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)#pragma vector=ADC_vector __interrupt void ADC_ISR(void)#Elif defined(__GNUC__) void __attribute__(((interrupt (ADC_vector))#elvector))不支持#AD_else
#endif
{
SWITCH(__EIV_IN_RANGE(ADCIV,ADCIV_ADCIFG))
{
案例ADCIV_NONE:
中断;
Case ADCIV_ADCOVIFG:
中断;
Case ADCIV_ADCTOVIFG:
中断;
Case ADCIV_ADCHIIFG:
中断;
Case ADCIV_ADCLOIFG:
中断;
Case ADCIV_ADCINIFG:
中断;
问题ADCIV_ADCIFG:
ADC_Result = ADCMEM0;
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //从LPM0中清除CPUOFF位
中断;
默认:
中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正在将int ADC_result放入UCA0TXBUF。 至少需要ADC_Char。 实际上,您需要逐步浏览ADC_Char,一次发送一个字节。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何逐步执行ADC_Char并一次发送一个字节? 如果我发送ADC_Char,我仍然无法得到我所期望的结果。 我对如何一次发送字节感到困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试这样做,但我在使用高和低进行拆分时遇到了错误。 



    #include <MSP430-h> int ADC_result; char random = 1; #include <stdio.h> void init_UART (); void init_led (); int main(void) { WDTCTL = WDTPW | WDTHOLD; //停止WDT INIT_UART(); init_led (); //配置GPIO //P1DIR |= BIT0; //将WFP 1.0 设置为输出方向 //P1OUT &=~BIT0; // WFP 1.0 指示灯熄灭 //配置ADC A1引脚 P1SEL0 |= BIT1; P1SEL1 |= BIL1; //禁用GPIO开机默认高阻抗模式以激活 //以前配置的端口设置 PM5CTL0 &=~LOCKLPM2; //配置ADC10 ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON,S&H=16 ADC CLKS ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC;采样计时器 ADCCTL2 |= ADCRES; // 10位转换结果 ADCIE |= ADCIE0; //启用ADC连接完全中断 ADCMCTLS0 || ADCINCH_1 | ADCSREF_1; // A1 ADC输入选择;参考电压=1.5V //配置参考 PMMCTL0_H = PMMPW_H; //解锁PMM寄存器 PMMCTL2 |= INTREFEN; //启用内部参考 __DELAY周期(400); //参考确定延迟 同时(1) { ADCCTL0 |= ADCENC | ADCSC; //开始采样和转换 __bis_sr_register (LPM0_BITS | GIE); // LPM0,ADC_ISR将强制退出 IF (ADC_Result < 0x155) P1OUT &=~BIT0; //清除WFP 1.0 LED关闭 否则 P1OUT |= BIT0; //将WFP 1.0 LED设置为打开 while (!(UCA0IFG & UCTXIFG));//等待USSCI_A0 TX缓冲器就绪 CHAR ADC_Char[16]; Sprintf (ADC_Char,"%d",ADC_Result); 字符高=(无符号字符)(ADC_Char>8); 字符低= ADC_Char和0xff; UCA0TXBUF =高; while (!(UCA0IFG & UCTXIFG));//等待USSCI_A0 TX缓冲器就绪 UCA0TXBUF =低; __delay_cycles(5000); } }// 此函数对UART进行初始化,以便它可以具有8个数据位,无奇偶校验,1个停止位和9600 void init_UART () { //配置UART引脚 P1SEL0 || BIT6 | BIT7; //将2-UART引脚设置为第二个功能 //配置UART UCA0CTLW0 |= UCSWRST; //设置软重置启用 UCA0CTLW0 |= UCSSEL__SMCLK; //将SMCLK设置为BRCLK,用于11.52万的波特率 //波特率计算。 将波特率设置为11.52万 UCA0BR0 = 8; // 100万/115200 =11.52万 = 8.68 INT (N)= 8 UCA0MCTLW = 0xD600; // 100万/115200 -11.52万 - INT (100万/115200)11.52万)= 0.68 UCA0BR1 = 0x00; // UCBRSx值= 0xD6 UCA0CTLW0 &=~UCSWRST; //初始化eUSCI } void init_led (){ //配置GPIO P1DIR || BIT0; //将WFP 1.0 设置为输出方向 P1OUT &=~BIT0; // 编译器1.0 LED关闭}// ADC中断服务例程#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)#pragma vector=ADC_vector __interrupt void ADC_ISR(void)#Elif defined(__GNUC__) void __attribute__(((interrupt (ADC_vector))#elvector))不支持#AD_else #endif { SWITCH(__EIV_IN_RANGE(ADCIV,ADCIV_ADCIFG)) { 案例ADCIV_NONE: 中断; Case ADCIV_ADCOVIFG: 中断; Case ADCIV_ADCTOVIFG: 中断; Case ADCIV_ADCHIIFG: 中断; Case ADCIV_ADCLOIFG: 中断; Case ADCIV_ADCINIFG: 中断; 问题ADCIV_ADCIFG: ADC_Result = ADCMEM0; __BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //从LPM0中清除CPUOFF位 中断; 默认: 中断; } }

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

    您是否可以发送*Any*串行数据? MSP和PC上的波特率是否匹配? 您是否有示波器或逻辑分析器来验证串行端口上发送的内容?

    (您在这里所做的是将ADC_CHAR的*ADDRESS*发送到串行端口。 我认为您需要查看C字符串。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我发送一个ASCII字符,如'R'或其他任何东西,我可以发送数据,它就会收到数据。 我可以看到显示'R',波特率匹配。 我不确定如何将ADC_Char拆分为两个字节并将其发送到TX缓冲区。 C字符串太不确定。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用于(i=0;i<strlen (ADC_Char);i++){
    UCA0TXBUF = ADC_Char[I];
    //如果序列未缓冲,请暂停以发送字符
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可能想看看Energia。 虽然它消除了低级控制,但它却处理了许多麻烦,如将字符串写入串行。