在使用MSP430FR5969开发板调试时,发现VLO的频率变化很大,在JTAG模式下VLO的频率是10.4K左右,只要退出debugger,硬件不做改动,VLO的频率就变成了9.1K左右,最初以为是JTAG模式下的电压和退出后的电压不一致造成的,但在调试过程中发下,是ADC12影响了VLO的频率,只要屏蔽掉ADC12的初始化代码,VLO的频率基本稳定,请大神们帮忙分析一下。ADC12代码如下:
{
P1SEL1 = 0;P1SEL0 = 0; //将其他采样通道关闭
P1SEL1 |=BIT0| BIT1|BIT2|BIT3; // Configure P1.2 ,P1.3for ADC
P1SEL0 |= BIT0| BIT1|BIT2|BIT3;
PM5CTL0 &= ~LOCKLPM5;
ADC12CTL0 &=~ ADC12ENC; //初始化在ENC = 0下修改
char busy_i=0;
while(REFCTL0 & REFGENBUSY)// 开启内部2V的参考电压
{
busy_i++;
if(busy_i>>2) break;
}
REFCTL0 |= REFVSEL_1 | REFON; // Select internal ref = 2.0V
ADC12CTL0 |= ADC12SHT0_0 | ADC12ON|ADC12MSC; // ADC
//ADC12CTL1 = ADC12SHP;
ADC12CTL1 = ADC12SHP|ADC12CONSEQ_1; // 序列通道单次采集
ADC12CTL2 |= ADC12RES_2|ADC12PWRMD; // 12位转换精度,低功耗模式
// ADC12CTL3 |= ADC12CSTARTADD_1;
ADC12MCTL0 |= ADC12INCH_0| ADC12VRSEL_1;//
ADC12MCTL1 |= ADC12INCH_1| ADC12VRSEL_1;
ADC12MCTL2 |= ADC12INCH_2| ADC12VRSEL_1;
ADC12MCTL3 |= ADC12INCH_3| ADC12VRSEL_1|ADC12EOS; //
ADC12IER0 |= ADC12IE3; // Enable ADC conv complete interrupt
ADC12CTL0 |= ADC12ENC;
}
Jacky Xu:
VLO精度和和ADC没啥关系,你是把VLO从引脚输出来观察的嘛?
tingmeng yan:
回复 Jacky Xu:
是用示波器观察P2.0的引脚,即将VLO从引脚引出来观察的,另外还发现一个现象,当我用下面的程序调试时,在JTAG模式下VLO的频率在10.4K,退出后为9.1K,但是只要不使能LPM3,频率就为10.4K,难道是LPM3影响VLO的频率?现在还没有添加ADC部分,不确定是否是ADC影响的。
只要将__bis_SR_register(LPM3_bits|GIE); 变为__bis_SR_register(GIE);,VLO的频率就稳定了
#include "msp430.h"
void TimerA_Cfg_LPM(void);void CLK_Cfg_LFXT(void);void CLK_Cfg_VLO(void);void GPIO_Cfg(void);
unsigned char LFXT_Flag=0;unsigned char TimerA_Value=0;
int main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; GPIO_Cfg(); CLK_Cfg_VLO(); TimerA_Cfg_LPM(); TimerA_Value=13; __bis_SR_register(LPM3_bits|GIE);//开启总中断进入LPM3 while(1); }
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector = TIMER0_A0_VECTOR__interrupt void Timer0_A0_ISR (void)#elif defined(__GNUC__)void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)#else#error Compiler not supported!#endif{ TA0CCR0 += TimerA_Value; P3OUT ^= BIT6;}
/********************************************************************************* 函数名称:void CLK_Cfg_LFXT(void)** 功能描述: 配置低功耗模式使用的时钟,SMCLK=MCLK=HFXT16M,ACLK=VLO 9.4K**此处调试时可以试试调低DCO的频率看一下功耗是否降低** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/void CLK_Cfg_LFXT(void){ PJSEL0 |= (BIT4 |BIT5); // 使能晶振管脚 PM5CTL0 &= ~LOCKLPM5; FRCTL0 = FRCTLPW|NWAITS_1;//使用16M晶振前需设置 CSCTL0_H = CSKEY >> 8; // Unlock CS registers CSCTL1 = DCOFSEL_4|DCORSEL; // Set DCO to 16 MHz // CSCTL1 = DCOFSEL_0; //CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__VLOCLK;// CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__LFXTCLK;// CSCTL3 = DIVM__1| DIVS__1|DIVA__4 ; // Set all dividers to 1 CSCTL4 |=( LFXTOFF );//不使用时关闭HFXT和LFXT do { CSCTL5 &= ~(LFXTOFFG | HFXTOFFG); // Clear XT1 and XT2 fault flag SFRIFG1 &= ~OFIFG; }while (SFRIFG1&OFIFG); // Test oscillator fault flag LFXT_Flag=1; P3OUT|=BIT5; CSCTL0_H = 0; // Lock CS registers }/********************************************************************************* 函数名称:void CLK_Cfg_VLO(void)** 功能描述: 配置低功耗模式使用的时钟,SMCLK=MCLK=HFXT16M,ACLK=VLO 9.4K**此处调试时可以试试调低DCO的频率看一下功耗是否降低** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/void CLK_Cfg_VLO(void){ PJSEL0 &=~ (BIT4 |BIT5); // 使能晶振管脚 PM5CTL0 &= ~LOCKLPM5; FRCTL0 = FRCTLPW|NWAITS_1;//使用16M晶振前需设置 CSCTL0_H = CSKEY >> 8; // Unlock CS registers CSCTL1 = DCOFSEL_4|DCORSEL; // Set DCO to 16 MHz // CSCTL1 = DCOFSEL_0; CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__VLOCLK;// //CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__LFXTCLK;// CSCTL3 = DIVM__1| DIVS__1|DIVA__1 ; // Set all dividers to 1 LFXT_Flag=0; P3OUT&=~BIT5; CSCTL0_H = 0; // Lock CS registers }
/********************************************************************************* 函数名称:void GPIO_Cfg(void)** 功能描述: 配置GPIO全部为输出,为0** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/
void GPIO_Cfg(void){ P1OUT = 0; P1DIR=0xFF; P2OUT = 0; P2DIR=0xFF; P3OUT = 0; P3DIR=0xFF; P4OUT = 0; P4DIR=0xFF; PJOUT = 0; PJDIR = 0xFFFF; P4DIR &=~ BIT2;//调试用 P2SEL0 |= BIT0; // Output ACLK P2SEL1 |= BIT0; PM5CTL0 &= ~LOCKLPM5;}/********************************************************************************* 函数名称:void TimerA_Cfg_LPM(void)** 功能描述: 低功耗模式下使用定时器A,CLK=ACLK=9.4K** 输入: ** 输出: 无** 全局变量: 无** 调用模块: 无** 作者: ** 日期: **——————————————————————————** 修改人: ** 日 期: ** 描 述: **—————————————————————————–*******************************************************************************/void TimerA_Cfg_LPM(void){ TA0CCTL0 = CCIE; // TACCR0 interrupt enabled TA0CCR0 = 12; TA0CTL = TASSEL__ACLK | MC__CONTINUOUS; // ACLK, UP mode}
灰小子:
回复 tingmeng yan:
我的理解,VLO是rc震荡器类型的,会受到电压,电容等的影响。电路的其他部分以及测量频率的电路,有没有影响到这些?
tingmeng yan:
回复 灰小子:
电路上应该没有什么会影响VLO,另外,我还通过改变单片机的供电电压(2.2V和3.6V)来测试过VLO,变化不大,变化最大的就是是否使用LPM3和是否退出JTAG
HG:
回复 灰小子:
你改一下CCS里面JTAG的选项,试试有没有影响
tingmeng yan:
回复 HG:
不好意思,忘了说了,我用的是IAR for MSP430 V6.4.。
HG:
回复 tingmeng yan:
就做个小实验,用CCS也不麻烦的,看看这个VLO震荡频率是不是真的和JTAG打进去的电压有关