请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430FR2311 你(们)好 我尝试使用板载运算放大器以及UART串行通信。 由于TIA和UART使用相同的引脚(WFP 1.6 和WFP 1.7),我提出的解决方案是初始化AMP,将数据发送到ADC,然后初始化UART并将数据发送到PC。 该程序运行时循环运行,使WFP 1.6 和WFP 1.7 可同时用于UART和TIA。 但这不奏效。 该代码仅在我禁用TIA且仅使用SACOA时有效,但对于我的应用,我需要两个放大器。 是否可以同时使用TIA和UART? 是否对我的代码进行了任何修改以解决此问题,或者是否有其他方法可供使用?
//************************************************************************************************
// MSP430FR2311 - TRI0+SAC0,TRI0作为缓冲器,SAC0作为GP运算放大器,使用ADC对SAC0输出进行采样
//**********************************************************************
#include <MSP4S.h>
#include <stdio.h>
unsigned int adcResult;
unsigned int I;
void init_UART ();
void init_amps();
void read_ams();
void UART_sendData();
int main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
PM5CTL0 &=~LOCKLPM2; //禁用GPIO默认高阻抗模式,激活先前配置的端口设置
//配置参考
PMMCTL0_H = PMMPW_H; //解锁PMM寄存器
PMMCTL2 |= INTREFEN; //启用内部参考
__DELAY周期(400); //参考设置延迟
//配置ADC10
ADCCTL0 = ADCSHT_2 | ADCON; // ADCON,S&H=16 ADC时钟
ADCCTL1 = ADCSHP; // ADCCLK = MODOSC;采样计时器
ADCCTL2 = ADCRES; // 10位转换结果
ADCIE = ADCIE0; //启用ADC连接完全中断
ADCMCTL0 = ADCINCH_3 | ADCSREF_0; // A3 ADC输入选择= OA输出,Vref = DVCC
,同时(1) //每个循环初始化每个函数
,以便为多个函数{
init_ams(); //初始化引脚以供运算放大器使用
READ_AMPS (); //使用ADC读取运算放大器值
INIT_UART(); //为UART使用初始化引脚
UART_sendData(); //使用UART将数据发送到PC
}
}
void init_UART ()
{
P1SEL0 || BIT6 | BIT7; //配置UART引脚将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_ams()
{
P1SEL0 || BIT2 + BIT3 + BIT4; //选择1.2 WFP 1.3 1.6 1.4 作为SAC功能,1.5 WFP 1.7 作为TRI功能
P1SEL1 || BIT2 + BIT3 + BIT4;
//将TIA配置为缓冲区
TRI0CTL = TRIPM + TRIEN; //启用TIA,选择低速和低功率模式
//将SACOA配置为GP运算放大器
SAC0OA |= PSEL1; //TIA输出= SACOA输入
SAC0OA || NMUXEN + PMUXEN; //启用负和正输入
SAC0OA || OAPM; //选择低速和低功率模式
SAC0OA || SACEN + OAEN; //启用SAC和OA
}
void read_ams()
{
ADCCTL0 |= ADCENC | ADCSC; //开始采样和转换
__bis_sr_register (LPM0_BITS | GIE); //输入LPM0,ADC_ISR将强制退出
__no_operation(); //仅用于调试
}
void UART_sendData()
{
同时(!(UCA0IFG和UCTXIFG)); //等待USCI_A0 TX缓冲器就绪
CHAR ADC_Char[16]; //创建字符数组以存储ADC_Result,因为串行只读ASCII格式
Sprintf (ADC_Char,"%d",adcResult); //将ADC结果int值转换为char数组
用于(i=0;i<strlen (ADC_Char);i++){ //读取char数组,一次一位
UCA0TXBUF = ADC_Char[I]; //如果串行未缓冲,请暂停以发送字符
}
UCA0TXBUF = 0xA; //换行符
__DELAY周期(5000); //用于调试
}//
ADC中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_ICC__)
#pragma vector=ADC_vector
__interrupt void ADC_ISR(void)
#Elif defined(__GNUC__)
void __attribute__((void(ADC_vector))#adc_error!)
不支持ADC_ELSE
#endif
{
switch (__偶 数_in_range (ADCIV,ADCIV_ADCIFG))
{
案例ADCIV_NONE:
中断;
Case ADCIV_ADCOVIFG:
中断;
Case ADCIV_ADCTOVIFG:
中断;
Case ADCIV_ADCHIIFG:
中断;
Case ADCIV_ADCLOIFG:
中断;
Case ADCIV_ADCINIFG:
中断;
问题ADCIV_ADCIFG:
adcResult = ADCMEMM0; //读取ADC存储器
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //从LPM退出
中断;
默认:
中断;
}