1、首先,芯片型号是MSP430F437,初始化方式参考官方例程,如下:
void clock_init()
{
unsigned int i;
FLL_CTL0 |= XCAP18PF; // Set load capacitance
FLL_CTL1 &= ~XT2OFF; // Turn on XT2
// Loop until 32kHz crystal stabilizes
do
{
IFG1 &= ~OFIFG; // Clear oscillator fault flag
for (i = 50000; i; i–); // Delay
}
while (IFG1 & OFIFG); // Test osc fault flag
FLL_CTL1 = SELS+SELM_2; // Select SMCLK source as XT2CLK
}
采用该驱动方式之后,外部焊接两个晶振,一个32.768kHz的,一个8MHz的,但是经常出现无法初始化现象,也就是一直卡在语句
do
{
IFG1 &= ~OFIFG; // Clear oscillator fault flag
for (i = 50000; i; i–); // Delay
},只能通过更换芯片来实现初始化。
2、第二个芯片是MSP430F169,其时钟初始化也存在隐患,其程序如下
void clock_init_8M()
{
unsigned int i;
BCSCTL1 &= ~XT2OFF; // XT2= HF XTAL
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i–); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
for (i = 0x0FFF; i > 0; i–); // Time for flag to set
BCSCTL2 |= SELM_2+SELS; // MCLK= XT2 (safe)
}
一般情况下可以正常开关机,但是,反复开关机之后,偶尔会出现时钟主时钟无法初始化,仍然是默认时钟800k左右。
gaoyang9992006:
上电第一部初始化相关寄存器,清理时钟相关的标识寄存器。再试试
灰小子:
这种情况建议先用示波器测量下晶振,看看是否起震了
Liang Chen6:
回复 灰小子:
加入说,没有起振,但是为什么会出现没有起振的情况呢?就STM32或者飞思卡尔的也从来没出现这种奇怪状况
Liang Chen6:
回复 gaoyang9992006:
初始状态下,相关寄存器的值不是默认值吗?另外,以您的经验,哪种寄存器会影响这个呢?
gaoyang9992006:
回复 Liang Chen6:
晶振的问题或者寄存器哪儿没设置正确。更严重的电路出现的物理性故障。
灰小子:
如果是晶振没有起震的话,一般是负载电容和寄生电容的问题。可以尝试更换下电容,pcb布线时晶振和电容尽量靠近相应引脚等等。
对于32.768kHz的晶振,外壳接地我也曾经遇到过受电源纹波影响的情况。