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 时出现问题、会收集 ADC 转换结果

Guru**** 2534270 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1203112/msp430fr2433-problem-with-using-uart-collect-adc-conversion-results

器件型号:MSP430FR2433

大家好

我的代码如下

#include

void UARTPutString (const char* strptr);//开始输出字符串
空 UARTSetup (空);
void Init_GPIO();

const char* TxPtr ;
char OutStr [50];//用于保存输出字符串的缓冲器
int ADC_result;


int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
// Init_gpio ();
//配置 GPIO 设置
//红色 LED 指示灯
P1DIR |= BIT0;//将 P1.0设置为输出
P1OUT |= BIT0;// P1.0高电平


//配置 ADC A1引脚
SYSCFG2 |= ADCPCTL1;


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


//时钟系统设置 ACLK = 32786,MCLK = SMCLK = 1MHz
__ bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFOCLK 设置为 FLL 基准源
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7);//首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_3;//设置 DCOCLK = 8MHz
CSCTL2 = FLLD_1 + 121;// FLLD = 1、DCODIV = 4MHz
__delay_cycles (3);
__ BIC_SR_register (SCG0);//启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 锁定
CSCTL4 = SELMS__DCOCLKDIV | SELM__XT1CLK;//设置 ACLK = XT1 = 32768Hz、DCOCLK 作为源
默认情况下 CSCTL5 |= DIVM1;// SMCLK = MCLK = DCODIV/2 = 1MHz


UARTSetup();//设置波特率


//添加 ADC 设置
//配置 ADC10
ADCCTL0 |= ADCSHT_2 | ADCON;// ADCON、S&H 时钟
ADCCTL1 |= ADCSHP | ADCSSEL0;// ADCCLK = MODOSC;采样计时器
ADCCTL2 |= ADCRES;// 10位转换结果
ADCMCTL0 |= ADCINCH_1;// A1 ADC 输入选择;Vref=AVCC
ADCIE |= ADCIE0;//启用 ADC 转换完成中断

// Timer0_A3设置 ISR 10/秒:
TA0CCTL0 |= CCIE;// TACCR0中断已启用
TA0EX0 |= TAIDEX_3;// SMCLK/8/4 = 31250Hz
TA0CCR0 = 3125;//每秒10次
TA0CTL = TASSEL_2 | MC_1 | ID_3;// SMCLK/8 = 125K,向上计数模式

//进入待机
__ bis_SR_register (LPM0_bits | GIE);

}

//计时器 A0中断服务例程
#pragma vector = TIMER0_A0_vector
__interrupt void Timer_A (void)

P1OUT ^= BIT0;
//开始转换
ADCCTL0 |= ADCENC | ADCSC;//采样和转换开始

}

#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)

开关(UCA0IV)

USCI_NONE:中止;
案例 USCI_UART_UCRXIFG:
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = UCA0RXBUF;
___ no_operation();
中断;
案例 USCI_UART_UCTXIFG:
//加载字符值
// unsigned char testVal=*TxPtr++;
if (!(* TxPtr)//如果为零,则停止

UCA0IE &&~UCTXIE;//关闭中断
}
方案

UCA0TXBUF =*TxPtr++;
}
中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;
默认值:中断;
}
}

// ADC 中断服务例程
#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)

开关(ADCIV)

情况 ADCIV_NONE:
中断;
案例 ADCIV_ADCOVIFG:
中断;
案例 ADCIV_ADCTOVIFG:
中断;
案例 ADCIV_ADCHIIFG:
中断;
案例 ADCIV_ADCLOIFG:
中断;
案例 ADCIV_ADCINIFG:
中断;
案例 ADCIV_ADCIFG:
ADC_RESULT = ADCMEM0;
//最后一个字符串必须是完整的或有问题的-不允许分块
//最坏的情况将覆盖要输出的字符串的一部分
sprintf (OutStr、"%d\n"、ADC_Result);
UARTPutString (OutStr);//开始输出字符串


//_BIC_SR_register_on_exit (LPM0_bits);//从 LPM0清除 CPUOFF 位
中断;
默认值:
中断;
}
}


空 UARTSetup (空)

//配置 UART 引脚
P1SEL0 |= BIT4 | BIT5;//将2-UART 引脚设置为第二个功能
//配置 UART
UCA0CTLW0 |= UCSWRST;//重置 UART
UCA0CTLW0 |= UCSSEL_SMCLK;//使用 SMCLK 输入
UCA0BR0 = 104;// 1MHz SMCLK/9600波特
UCA0MCTLW = 0x1100;////波特率的余数
UCA0CTLW0 &=~μ H UCSWRST;

// UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断
}

void UARTPutString (const char* strptr)//开始输出字符串

//使用第一个 char 加载 TxBuf,然后启用中断
TxPtr = strptr;
UCA0TXBUF =* TxPtr++;//首先加载、假设缓冲区中至少有一个 char
UCA0IE |= UCTXIE;//发送时中断- ISR 在完成时关闭
}

void Init_GPIO()

P1DIR = 0xFF;P2DIR = 0xFF;P3DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;P3REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;
}

我在线看到此示例、并尝试将其用于开发板(这是正好适用于 MSP430FR2xx 的代码)、当时我正尝试在串行监视器中获取 ADC 转换的串行打印结果。 不过、我放入了一个正弦波、可以看到观察窗口中的 ADC_Result 在变化、但串行监视器中的打印结果只是随机重复的字符。 我不知道什么是错的,这个代码是由创造者测试,它是有效的。 创建者还会输入正确的打印结果。

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

    尝试添加:

    > #include // sprintf()