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.
在使用MSP430FR5969开发板调试时,发现VLO的频率变化很大,在JTAG模式下VLO的频率是10.4K左右,只要退出debugger,硬件不做改动,VLO的频率就变成了9.1K左右,最初以为是JTAG模式下的电压和退出后的电压不一致造成的,但在调试过程中发下,是ADC12影响了VLO的频率,只要屏蔽掉ADC12的初始化代码,VLO的频率基本稳定,请大神们帮忙分析一下。ADC12代码如下:
是用示波器观察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
}
电路上应该没有什么会影响VLO,另外,我还通过改变单片机的供电电压(2.2V和3.6V)来测试过VLO,变化不大,变化最大的就是是否使用LPM3和是否退出JTAG