//======================== MCU时钟初始化 ==========================
//ACLK = LFXT1 = 32kHz, SMCLK = HF or default DCO, MCLK = HF or default DCO
void MCU_init()
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// Enable XT1
P5SEL |= BIT4+BIT5; // Port select XT1
UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_3; // Internal load cap 12pF,参考F5xx用户手册Page91 & Page108
// Enable XT2,需要外部负载电容
P5SEL |= BIT2+BIT3; // Port select XT2
UCSCTL6 &= ~XT2OFF; // Set XT2 On
// Loop until XT1、XT2 & DCO stabilizes
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL6 &= ~(XT1DRIVE_3); // Xtal is now stable, reduce drive strength UCSCTL6 &= ~XT2DRIVE0; // Decrease XT2 Drive according to expected frequency // 参考F5xx用户手册Page108,目前设置为24~32MHz
UCSCTL4 |= SELA_0 + SELS_5 + SELM_5; // Select ACLK=XT1,SMCLK=XT2 or DCO,MCLK for XT2 or DCO
}
Charles Wu:
代码初看起来没有问题,现在是芯片晶振起振出了问题?有些寄存器配置和具体硬件有关。比如32k晶振要求的负载电容是多少,XT2接的高频晶振是几M?请楼主再把问题描述的清楚一点吧。
Yun Zhang:
回复 Charles Wu:
这个程序,原先使用上发生问题,XT1是常见的12.5pF负载电容(但并未在PCB上焊接电容、只有1只32768晶振);XT2原用的24.576MHz,配二只负载电容为27pF,最初工作基本正常(从ACLK的看门狗的LED闪烁、及SMCK源的串口输出字符串判断),但工作大约5秒后,明显感觉时钟不再对了,一个100ms的循环可以花费1分钟以上。
后来将XT2换成7.3728MHz的,并对应调整串口设置后,前面那些异常不再出现了。
想问一下,如果XT2想用尽量高速的,例如24.576MHz,该如何设置?
F5510内部的ACLK精度和稳定性,能与常见的20ppm的32768晶振一致吗?
Charles Wu:
回复 Yun Zhang:
代码中将XT2DRIVE0清成了0,XT2的Driver 没有开到最大,当外接晶振频率过高时,可能发生停振。将那句代码去掉再试试。
Charles Wu:
回复 Charles Wu:
另外,楼主所提到的ACLK精度,是否是指片内的REFO?REFO典型误差在3V,25C时是+/-1.5%,还是无法做到晶振的精度。
Yun Zhang:
回复 Charles Wu:
发现问题了,不应该是时钟系统的事情。
只要以下程序启动,就会出现不正常的现象:
void GDO2_ISR(void)
{
TI_CC_GDO2_PxSEL &=~TI_CC_GDO2_PIN; // 普通IO
TI_CC_GDO2_PxDIR &=~TI_CC_GDO2_PIN; // input
TI_CC_GDO2_PxREN |= TI_CC_GDO2_PIN; //
TI_CC_GDO2_PxIES &=~TI_CC_GDO2_PIN; // P2.0 Lo->Hi edge
TI_CC_GDO2_PxIE |= TI_CC_GDO2_PIN; // P2.0 interrupt enabled,GDO2
TI_CC_GDO2_PxIFG &=~TI_CC_GDO2_PIN; // P2.0 IFG cleared
}
这是用于CC1101的外部中断,当CC1101接收到同步信号(或者数据,依据IOCFG2的设置而定)后,读出数据并回复和保存。
以前用于F2132时都是正常的,但移植到F5510后,就出了问题。
请问是什么地方忽略掉了?
Charles Wu:
回复 Yun Zhang:
IFG的清除在IE置位之后,会否是误进入P2的中断了,换个次序试试。