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未将电压值从ADC引脚发送到我的PC的问题? UART的设置肯定不正确。

Guru**** 2595805 points
Other Parts Discussed in Thread: MSP430FR6989, MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/641590/ccs-msp430fr6989-issue-with-uart-not-sending-voltage-values-from-adc-pin-to-my-pc-uart-is-definitely-set-up-incorrectly

部件号:MSP430FR6989
主题中讨论的其他部件: MSP430G2553

工具/软件:Code Composer Studio

您好,TI论坛。 我的最后一个问题几乎与我现在在这里发表的问题相同(见 :https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/63.901万)

从我原来的岗位上,我成功地使MSP430G2553从光敏电阻接收到其ADC引脚(WFP 1.3)的电压值。 这些ADC10值通过UART发送,其中一个名为CoolTerm的程序能够将数字打印到我的PC屏幕上。 我的下一个目标是使用MSP430FR6989将整个电路从ADC10设置转换为ADC12设置。 在浏览了头文件和几个UART示例代码之后,我尝试在下面转换这两个MSP430板之间的所有内容。 令人遗憾的是,它不起作用。 PC不打印任何内容,CoolTerm显示TX或RX均不工作。 我确信我的UART设置或ADC12设置有一两条错误的行,因为某些内容使用了错误的声明。 是否有人可以查看下面的代码,看看我在转换过程中犯了什么错误?

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

未签名的短数据; //从ADC读取的数据

//全局变量
volatile unsigned int latest_adc_result;
volatile unsigned int timer_count =0;
char buffer[32];

void init_led ();
void init_UART ();
void init_timer();
void init_adc();
void start_conversion ();

void main(void)
{
	WDTCTL	= WDTPW + WDTHOLD;	//停止WDT
	PM5CTL0 &=~LOCKLPM5;//禁用GPIO通电默认高阻抗模式以激活配置的端口设置
	//时钟系统设置
CSCTL0_H = CSOKEY >> 8; //解锁CS寄存器
CSCTL1 = DCOFSEL_0 | DCORSEL; //将DCO设置为16MHz
CSCTL2 =拉美_ VLOCLK | SESS__DCOCLK | SELM__DCOCLK;// SET SMCLK = MCLK = DCO,
// ACLK = VLOCLK
CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1; //设置所有分禾器
CSCTL0_H = 0; //锁定CS寄存器

	//启动外围设备
	init_led ();
	init_UART ();
	init_timer();
	init_adc ();

	//启用中断并将CPU置于休眠
	_bis_sr_register(GIE+LPM3_bits);
}//

帮助器功能
void init_led ()
{
	P1DIR = 0x01;
	P9DIR = 0x80;


INOPTIF3={ BIT2; BIT3=UART3;

		// WFP 1.1 = RXD,WFP 1.2 = TXD
	P4SEL1 = BIT3 + BIT2;	// 1.1 = RXD,WFP 1.2 = TXD
	UCA0CTL1 |= UCSSEL_2;	// SMCLK
	UCA0BR0 = 104;			//参见UCA0BR1
	= 0以上的波特率分配器;
	UCA0MCTL1		= URSTLF/ URS0
	= UCS0 ~UCA0 	//**初始化USCI状态机**
	UCA0IE_H |= UCTXIE0;//		启用USI_A0 TX中断
}

void init_timer()
{
	TA0CTL || TACLR;		//重置计时器
	TA0CTL = tassel_2		// SMCLK
			+ ID_0			//输入分隔符=1
			+ MC_2; 			//连续模式,中断禁用
	TA0CCTL0 = OUTMOD_2//		比较模式
			+ CCIE			//中断启用
			+ CCIFG
;}

void init_ADC()
{
	ADC12CTL1 = ADC12INCH0		//对ADC的光敏电阻输入
			+ ADC12SHS_0			//使用ADC10SC位触发采样
			+ ADC12DIV_3	//时钟分频器=4
			+ ADC12SSEL_3	//时钟源= SMCLK
			+ ADC12CONSEQ0;		//
	单通道TC1转换			,每个通道1
//ADC10AE0 = 0x08; //启用A4模拟输入
	ADC12CTL0 = CEREF00		//参考电压为VSS和Vcc。 0允许代码工作。
			+ ADC12SHT0_3	// 64 ADC10采样和保持时间时钟(最慢)
			+ REFON			//参考发生器打开
			+ ADC12ON		//打开ADC10
			+ ADC12ENC; 			//启用(但尚未启动)转换
}

void start_conversion ()
{
	IF ((ADC12CTL1 & ADC12BUSY)==0){//	if not already converting
		P9OUT ^= 0x80;//绿色LED
		ADC12CTL0 |= ADC12SC;
		ADC12MCTL0 =(
	


处理程序)

_ latest_ADC_result = 0x80;</rag_erma_erma_er0;}: RELA0_AD_ADC12CTL0_AD_AD_ADC12SC0

	
	如果(timer_count >1){//缺省值为16表示1秒刷新raet
		timer_count =0;
		start_conversion ();
		UCA0IE_H |= UCTXIE0;
	}


#pragma vector = USCIAB0TX_vector
__interrupt void USCI0TX_OUT(

	
						指针){ P1ISR|=0x01;////=无信号缓冲
	区= 0;/0 (无信号强度)(dvent) //将文本

	输出到PC,同时(buffer[i]!='\0'){
		while (!(UCA0IFG_H & UCTXIFG));//	USI_A0 TX buffer ready?
		UCA0TXBUF = buffer[i+];}
	

	P1OUT &=~0x01;//红色LED
	UCA0IE_H &=~UCTXIFG;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您现在可能会遇到的情况:
    >#pragma vector = USCIAB0TX_vector
    FR6989中未定义该向量(我希望您会收到有关此的警告)。 尝试:
    >#pragma vector = USI_A0_vector
    ----------------
    您即将遇到的问题:
    > ADC12MCTL0 =(未签名)&Latest_ADC_Result;
    在FR6989上,ADC12MCTL0是您指定输入通道的位置。 尝试:
    > ADC12MCTL0 = ADC12VRSEL_0 | ADC12INCH_0;//参考Vcc/VSS,通道A0
    由于FR6989没有DTC,您必须等待结果(“while (ADC12CTL1 & ADC12BUSY)/*empty*/;”)并从ADC12MEM0中获取。 对于此实验,您可能只需在start_conversion中等待;较长的时间,您应该定义ADC12_Vector。
    ----------------
    > UCA0IE_H |= UCTXIE0; //启用USI_A0 TX中断
    UCTXIE0位于UCA0IE的下半部分。 尝试:
    > UCA0IE |= UCTXIE0; //启用USI_A0 TX中断
    另外,不要在init_UART ()中启用TXIE;等待转换完成。
    更一般地说,我认为(不检查每一个)您不需要这些"_H"寄存器引用中的任何一个。
    ----------------
    > ADC12CTL0 = CEREF00 //参考电压为VSS和Vcc。 0允许代码工作。
    CEREF00是完全不同设备(eCOMP)的定义;您可以在MCTL0 (以上)中指定引用。 对于ADC12,CEREF00看起来就像ADC12SC,所以您就在那里开始转换。 您只需将其移除即可。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce提到的几个要点在以下迁移指南中介绍: www.ti.com/.../slaa559e.pdf

    此致,
    Ryan