MSP430F2619单片机时钟初始化故障始末

    技术2025-03-30  24

    MSP430F2619单片机时钟初始化故障始末

    初次使用该芯片,问题说大不大,说小也折腾了挺久,写出来,让后来者能避免此类简单错误。

    项目需要,使用MSP430F2619捕获功能对待测频率信号进行采样计算。

    待测信号由信号发生器给出。

    硬件上,MSP430F2619单片机XIN和XOUT并未按手册建议接入32.768kHz低频时钟,仅在XT2IN和XT2OUT引脚接入8MHz高频时钟。(此处是导致错误的根源)

    在后期调试时,有尝试使用MSP430FG439芯片最小系统进行测试,因此查阅用户指南时,在时钟模块章节,有阅读到一句“If there is only one crystal in the system it should be connected to LFXT1. Using only XT2 causes the LFOF fault flag to remain set, not allowing for the OFIFG to ever be cleared.”,说明了只使用一个外部时钟源时,应将其接入LFXT1接口。

    参照各个例程,MSP430时钟初始化程序大同小异,参考某品牌MSP430F149开发板例程。

    void SetupClock() { unsigned int i; BCSCTL1 &= ~XT2OFF; //打开XT2振荡器 BCSCTL2 |= SELM_2+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{ IFG1 &= ~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); } while ((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1 &= ~OFIFG; }

    其中

    while ((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待

    对振荡器故障中断标志进行判断,若故障不消除,则不跳出循环。

    若按上述程序对MSP430F2619芯片进行初始化,则会陷入时钟初始化的死循环。

    可以明白按MSP430F2619芯片硬件电路的时钟连接是有问题的,介于初期并未参考MSP430FG439芯片用户手册,因此根据个人理解,引入所犯的第二个错误。看时钟配置程序如下:

    void SetupClock() { uint16_t tmpv; BCSCTL1 &= ~XT2OFF; //开启外部振荡器 do { IFG1 &= ~OFIFG; //清除晶振失效标志 for (tmpv = 0xff; tmpv > 0; tmpv--); } while((BCSCTL3 & XT2OF) == 1); //*等待外部晶振就绪,该句有误 BCSCTL2 |= SELM_2+SELS; //选择MCLK,选择SMCLK // }

    其中

    while((BCSCTL3 & XT2OF) == 1); //*等待外部晶振就绪

    参考 看过逻辑图,为跳过LFXT1OF的错误标志,则将while循环内语句进行修改,直接判断XT2OF是否置位。

    修改后,程序编译通过,初始化正常,整个程序所实现其他功能均正常,唯独频率信号采样不正常。

    在修改过算法,更换过MSP430F149开发板和MSP430FG439目标板进行移植试验(两块板均焊接有低频和高频两类时钟源)。

    经过多番测试之后,才尝试为MSP430F2619芯片电路板焊接低频晶振,并使用

    while ((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待

    作为初始化循环等待语句。此时成功编译通过,运行时,频率捕获采样功能正常。

    总结:

    针对用户指南和数据手册仔细阅读:

    BCSCTL1寄存器和IFG1寄存器说明如下 由XT2OFF、XTS位可知,XT2振荡器可以关闭,并将XTS置1可将高频晶振接入LFXT1接口。

    但是LFXT1无法进行关闭操作,若仅XT2接入高频晶振,XT1悬空,结合振荡器故障逻辑则导致LFXT1OF置1,会导致OFIFG置1,则会导致程序运行过程中反复振荡器故障中断,导致定时器捕获功能异常。

    Processed: 0.011, SQL: 9