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 发送多个 ADC 值

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/587253/msp430fr2311-sending-multiple-adc-values-through-uart

器件型号:MSP430FR2311

你好。 我正在尝试通过 UART 向串行发送2个 ADC 值。 现在、我有一个名为 ADC_Result 的变量、用于存储我要发送的两个蓝调。 在 TX 缓冲区上、我首先发送 ADC_Result [0]。 然后是逗号、接着是 ADC_Result [1]。 这是怎么可能的。 我正在使用 sprintf 将 int 更改为十六进制值、以便它可以显示在串行监视器上。  

#include 
#include 
#include 

unsigned int adc_result[2]; // 10位 ADC 转换结果数组
unsigned int i; //用于迭代 ADC_Result 数组
void init_uart ()的变量; //初始化 UART 串行通信

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

init_uart(); //初始化 UART 通信

//配置 ADC A0~1引脚
P1SEL0 |= BIT0 + BIT1;
P1SEL1 |= BIT0 + BIT1;

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

//配置 ADC
ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON; // 16ADCclks、MSC、ADC 打开
ADCCTL1 |= ADCSHP | ADCCONSEQ_1 | ADCSSEL_1; // ADC 时钟 ACLK、采样计时器、s/w trig、单序列
ADCCTL2 |= ADCRES_1; //10位转换结果
ADCMCTL0 |= ADCINCH_1 | ADCSREF_4; // A0~2 (EOS);Vref=1.5V
ADCIE |= ADCIE0; //启用 ADC 转换完成中断

//配置引用
PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
PMMCTL2 |= INTREFEN; //启用内部基准
_DELAY_CYCLES (400); //基准趋稳延迟
__no_operation();

while (1)
{
I = 1;
while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
ADCCTL0 |= ADCENC | ADCSC; //采样和转换开始
_bis_SR_register (LPM0_bits | GIE); //输入带中断的 LPM0

while (!(UCA0IFG & UCTXIFG)); //等待 USCI_A0 TX 缓冲器准备就绪


char ADC_Char[16]; //创建字符数组以存储 ADC_Result,因为序列只读取 ASCII
sprintf (adc_char、"%d"、adc_result);//将 ADC 结果 int 值转换为字符数组

对于(i=0;i 't="" know="" what="" theyre="" here="" __delay_cycles(5000);="" initilizes="" uart="" on="" pins="" 1.6="" and="" 1.7="" void="" init_uart()="" configure="" p1sel0="" |="BIT6" bit7;="" set="" 2-uart="" pin="" second="" function="" uca0ctlw0="" sets="" softare="" reset="" enable="" smclk="" brclk="" be="" used="" baud="" rate="" of="" 115200="" calculation.="" setting="" baudrate="" uca0br0="8;" 1000000="" int(n)="8" uca0mctlw="0xD600;" -="" int(1000000="" 115200)="0.68" uca0br1="0x00;" ucbrsx="" value="0xD6" &="~UCSWRST;" initialize="" eusci="" adc="" interrupt="" service="" routine="" #if="" defined(__ti_compiler_version__)="" ||="" defined(__iar_systems_icc__)="" #pragma="" vector="ADC_VECTOR" __interrupt="" adc_isr(void)="" #elif="" defined(__gnuc__)="" __attribute__="" ((interrupt(adc_vector)))="" adc_isr="" (void)="" #else="" #error="" compiler="" supported!="" #endif="" switch(__even_in_range(adciv,adciv_adcifg))="" case="" adciv_none:="" break;="" adciv_adcovifg:="" adciv_adctovifg:="" adciv_adchiifg:="" adciv_adcloifg:="" adciv_adcinifg:="" adciv_adcifg:="" adc_result[i]="ADCMEM0;" if(i="=" 0)="" __bic_sr_register_on_exit(lpm0_bits);="" exist="" lpm0="" else="" i--;="" default:="" 

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

    您正在对值进行编号、因为在尝试发送下一个序列之前、没有时间清除序列。 首先、只需尝试发送"Hello、World"、然后担心发送数据。 您有多个问题。 其中最小的一个尝试将 ADC_Result 的地址转换为字符串并发送到串行。

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

    我在 driverlib 中执行了如下操作:

    uint8_t serTxBuf[64];
    易失性 uint8_t serBufTxIdx;
    
    空 EUSCIA0_IRQHandler (void){
    uint8_t Rx、offset;
    
    uint32_t status = MAP_UART_getabledInterruptStatus (eUSCI_A0_base);
    
    MAP_UART_INTERRUCT_RATE_LAY_RAST_A0
    
    (eUST_A1_RATE_RATE_LAUNT)
    = TO_A1_RAP_RATE_RAP_RATE_RATE_LAUNT (UART_A1_LAUNT);EUST_A1_AIF_AIF_RA
    //如果
    (serRxBufFull ()=0){
    //缓冲
    区偏移中有余量=(serRxHead &(SER_RX_BUFSIZE - 1));
    serRxBuf[offset]= Rx;
    serRxHead++;
    }
    
    否则、如果(status & SCI_BUFSIZE =
    0);serRxBufflag = ru0_transmit (uT_uuuuF = uart)
    
    如果(serTxBuf[serBufTxIdx]=0){
    //done
    serBufTxIdx = 0;
    }否则{
    MAP_UART_transmitData (eUSCI_A0_BASE、serTxBuf[serBufTxIdx+]);
    }
    
    
    
    
    
    void serialstr(char *transmit){
    
    
    
    
    
    0!/delay therf +!+ sendrf (while +);}void serialstr +(char *bestr)= 0 (while +);while + sertf (while ++);}f (while ++)
    
    //复制数据
    strLen = strlen (str);
    memcpy (serTxBuf、str、strLen);
    serTxBuf[strLen]= 0;
    
    //开始第一轮
    serBufTxIdx = 0;
    MAP_UART_transmitData (EUSCI_A0_BASE、serTxBuf[serBufTxIdx+]);
    }