void main()
{
WDTCTL = WDT_ADLY_1000; // WDT 250ms, ACLK, interval timer
SFRIE1 |= WDTIE; // Enable WDT interrupt check_clk(); TA1_Init();
_EINT();
while(1);
}
void check_clk(void)
{
P11SEL |= BIT0+BIT1+BIT2; // P11DIR = BIT0+BIT1+BIT2; // P11.1-2 to output direction
P5SEL |= 0x0C; // Port select XT2
P7SEL |= 0x03; // Select XT1
UCSCTL6 &= ~(XT1OFF+XT2OFF); // XT1 On
UCSCTL6 |= XCAP_3; UCSCTL3 |= SELREF_2; // FLLref = REFO
// Since LFXT1 is not used,
// sourcing FLL with LFXT1 can cause
// XT1OFFG flag to set
UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL6 &= ~(XT2DRIVE0+XT1DRIVE_3); // Decrease XT2 Drive according to
UCSCTL4 |= SELS_5 + SELM_5+SELA_0; // SMCLK=MCLK=XT2
UCSCTL5 |= DIVPA_0+DIVS_0+DIVM_0; // SMCLK=MCLK=XT2}
#pragma vector = WDT_VECTOR //看门狗定时器
__interrupt void WDT_ISR(void)
{
fre=flag*65535+TA1R;
flag=0;
TA1R=0;
}
void TA1_Init()
{
TA1CTL=TASSEL_0+MC_1+TACLR;
TA1CCR0=65535;
TA1CCTL0|=CCIE;
P2SEL|=BIT0;
}
在这程序在全速运行时会跑飞,单步调试时可以正常通过初始化函数,然后再点全速运行的时候又会跑飞。 跑飞(两个中断都进不去)
但是当我把红色语句改成UCSCTL5 |= DIVPA_0+DIVS_0+DIVM_1; // SMCLK=MCLK=XT2 ,
整个程序有可以正常运行。
求解释,这个问题?
Eric Fu:
你好,
请问你的XT2外部晶振的频率是多少?另外,可以试试先把XT2的驱动能力设置到最大,有可能是因为XT2的驱动能力过小,无法驱动你外接晶振的频率。
Zhenpeng Mo:
回复 Eric Fu:
怎么把XT2的驱动能力设置到最大呢??
Zhenpeng Mo:
回复 Zhenpeng Mo:
如果我XT2外接25MHz,旁边的两个电容是22pF,电源管理已经改好,XT2的驱动能力也已经改好,输出的波形如下,请问这样的波形正常?谢谢各位为我耐心地做下解答!
Lina Lian:
回复 Zhenpeng Mo:
Zhenpeng Mo,
Zhenpeng Mo怎么把XT2的驱动能力设置到最大呢??
如下图所示,将UCSCTL6寄存器中的XT2DRIVE设置为对应XT2频率响应的驱动能力。
Lina Lian:
回复 Zhenpeng Mo:
Zhenpeng Mo,
不知你的输出波形是如何观看的?是直接用示波器接在XT2上看的,还是现将其设置为系统时钟,后将其从对应管脚引出再用示波器观看的?更推荐第二种,因为第一种有可能会导致晶体停振,尤其当晶体是低频晶体时,25MHz高频晶体的话,稳定性会好一些。
从波形上看,是正确的。频率约为25MHz.
Zhenpeng Mo:
回复 Lina Lian:
谢谢你的解答,我是采用的后者,驱动能力的修改也已经通过查询用户手册已经修改好,谢谢你的耐心解答