【求助】32K外部晶振不焊接ACLK时钟源仍能工作?
我用的是MSPf2121,前不久在修理一些坏板子的时候发现,板子上的外部晶振取下来后,用ACLK作时钟源的TimeA中断事件仍然被触发,通过仿真后发现确实进入TimerA中断函数中,并且IFG1中的OFIFG位也未被置1,请问这种现象如何解释?我的相关部分代码如下:
//初始化时调用函数,初始化DCO为8MHZ
void InitClk()
{
/*等待电压稳定*/
DelayN(30);
IE1 |= OFIE; /*Ena××e osc fault int (NMI)*/
BCS1_Fren_Addr=(uchar*)CALBC1_8MHZ_;
BCSCTL1 = *BCS1_Fren_Addr;
DCO_Fren_Addr=(uchar*)CALDCO_8MHZ_;
DCOCTL = *DCO_Fren_Addr;
}
//中断函数检测OSC 错误
#pragma vector=NMI_VECTOR
__interrupt void OscFault(void)
{
volatile uint uiCnt;
#ifdef ALARMLED
LedR_1;
#endif
do /* Loop until flag is clear*/
{
IFG1 &= ~OFIFG; /* Clear fault flag*/
for (uiCnt = 0xFFFF; uiCnt; uiCnt--); /* Delay for crystal to start*/
}
while (IFG1 & OFIFG); /* Test LF oscillator fault flag*/
IE1 |= OFIE; /* Re-ena××e osc fault int*/
#ifdef ALARMLED
LedR_0;
#endif
}
//TimerA初始化函数
void InitTimer()
{
uint uiResultInteger;
TACTL = TASSEL0 + TACLR + ID0; /*TimerAClock=ACLK ,divided by 2,clear TAR*/
TACTL |= MC0;
uiResultInteger = rand();
uiResultInteger &= 0x00ff;
CCR0 = (uiResultInteger + uiWorkFrequence)<<3; /*woke interval = (CCR0)*0.061ms */
CCTL0 |= CCIE; /*CCR0 interrupt ena××e*/
}
自己顶一个,看user's guide上说MCLK的时钟源如果选择外部XT2,XT2失效后会自动切换到DCO,那是不是ACLK也会有LFXT1切换为其他的时钟源呢?
补充一点,我在初始化后进入了LPM3模式,按道理说这时即使TimerA的时钟源切换到DCO,也不应该工作,可是我通过仿真发现TimaA的TAR计数仍然在增长。
我将P2.0用作ACLK输出,发现仍然有大概频率为6.5K左右的方波输出,哪位高人帮忙解答一下啊?
晶振失效时,DCO接替.
TTimerA3中断函数据中,
////////TimerA初始化函数
void InitTimer()
{
uint uiResultInteger;
TACTL = TASSEL0 + TACLR + ID0; /*TimerAClock=ACLK ,divided by 2,clear TAR*/
TACTL |= MC0;
uiResultInteger = rand();
uiResultInteger &= 0x00ff;
CCR0 = (uiResultInteger + uiWorkFrequence)<<3; /*woke interval = (CCR0)*0.061ms */
CCTL0 |= CCIE; /*CCR0 interrupt ena××e*/
}///////////////////////
"TACTL = TASSEL0 + TACLR + ID0; "没有将TA的时钟源选为你想要的ACLK,TACTL仍为0,实际选了TACLK.
TACTL = TASSEL0 + TACLR + ID0; "没有将TA的时钟源选为你想要的ACLK,TACTL仍为0,实际选了TACLK.
不可能啊,TASSEL0 = 0x100,该位置一就是选择时钟源为ACLK。
而且user's guide上说的只有MCLK选择外部XT2失效时才自动替换为DCO,而ACLK的时钟源只有LFXT1和VLOCLK,但F2121没有VLOCLK,因此他只可能有一个来源,即外部的32K晶振
不知道对不?
TACTL = TASSEL0 + TACLR + ID0中,各量都为0(查看头文件中的定义)
因此TACTL不等于0x100,
TA有计数是因TACLK为TA的时钟源并且TACLK引脚上串入干扰,才计数.
21x1的头文件定义:
#define TASSEL1 (0x0200) /* Timer A clock source select 0 */
#define TASSEL0 (0x0100) /* Timer A clock source select 1 */
#define TACLR (0x0004) /* Timer A counter clear */
#define ID0 (0x0040) /* Timer A clock input divider 0 */
TACTL的第8、9位加起来为0b01
2xxx user's guide里面
TASSELx Bits
9-8
Timer_A clock source select
00 TACLK
01 ACLK
10 SMCLK
11 INCLK
说明我选择的时钟源是ACLK啊,你是不是将TASSEL0看成 TASSEL_0了?
而且按你的说法,我选择的是TACLK,可是为什么焊上晶振的板子上TimerA的输出是16.768KHz(通过示波器观察)呢,而不是串扰进去的信号呢?
ACLK的源只有VLO或者外部低频晶振两种选择。
ACLK: Auxiliary clock. ACLK is software selectable as LFXT1CLK or VLOCLK. ACLK is divided by 1, 2, 4, or 8. ACLK is software selectable for individual peripheral modules
在晶振出错时failsafe到DCO的是WDT看门狗的时钟源。
10.2.5 Watchdog Timer+ Clock Fail-Safe Operation
The WDT+ module provides a fail-safe clocking feature assuring the clock to the WDT+ cannot be disabled while in watchdog mode. This means the low-power modes may be affected by the choice for the WDT+ clock. For example, if ACLK is the WDT+ clock source, LPM4 will not be available, because the WDT+ will prevent ACLK from being disabled. Also, if ACLK or SMCLK fail while sourcing the WDT+, the WDT+ clock source is automatically switched to MCLK. In this case, if MCLK is sourced from a crystal, and the crystal has failed, the fail-safe feature will activate the DCO and use it as the source for MCLK. When the WDT+ module is used in interval timer mode, there is no fail-safe feature for the clock source.
Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
如果外部的晶振一个都没接,ACLK频率为多少
还有定时器启动终段一定要在低功耗模式吗??
能不能给个在一般的模式下定时器还能工作,而且在中断至外的时候cpu还能执行其他程序的程序
在USER'S GUIDE 中,看看ACLK前的SELx有没有那个选项吧,149是貌似不行的