我使用的单片机是MSP430F2418,最开始ACLK的时钟源是单片机内部的VLO,在运行的过程中我想把ACLK的时钟源改成外部的32768的晶振,代码如下所示:
#include "msp430.h"
void main(void)
{
unsigned long i=0xffff;
_BIC_SR(0xFFFF); //将SR中的各位清零,内联函数。通过看它的汇编代码可以知道。一个直接后果是GIE被复位,所有的可屏蔽中断关断。
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗定时
BCSCTL1&=~XT2OFF; //打开XT2
BCSCTL2 |= (SELM_2+DIVM_2+SELS); //MCLK、SMCLK选择xt2(5MHz,所以MCLK=1.25MHz,SMCLK=5MHz
BCSCTL3 |= (XT2S_2+LFXT1S_2+XCAP_1); //6pF电容
IFG1 &= ~OFIFG;
P5SEL |= BIT4+BIT6;
P5DIR |= BIT4+BIT6;
P1SEL |= BIT4;
P1DIR |= BIT4;
IFG1&=~(WDTIFG+OFIFG+NMIIFG+PORIFG+RSTIFG); //中断标志清零
FCTL3=FWKEY; //ACCVIFG清零
IE1|=OFIE+NMIIE+ACCVIE; //中断初始化设置
while(i)
{
i--;
}
BCSCTL3 = (XT2S_2+LFXT1S_0+XCAP_1);
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while (IFG1 & OFIFG); // OSCFault flag still set
while(1);
}
结果程序一直在 while(i) { i--;}这段代码中,但是只要我将 BCSCTL3 = (XT2S_2+LFXT1S_0+XCAP_1);这句话注释掉,程序又能正常执行,这是怎么回事?
此帖出自
小平头技术问答
嗯,刚刚找到原因了,因为我打开了时钟错误中断IE1|=OFIE+NMIIE+ACCVIE。
而开启外部晶振时BCSCTL3 = (XT2S_2+LFXT1S_0+XCAP_1),外部晶振不能马上起振,所以会出现时钟错误,导致程序进入时钟错误中断中。
而时钟错误中断向量中我没有放置任何代码,所以程序进入复位中断中,导致程序从头开始执行
找到问题了就好
一周热门 更多>