TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F2418在运行的过程中可以更改ACLK的时钟源吗?

我使用的单片机是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);这句话注释掉,程序又能正常执行,这是怎么回事?

灰小子:

你好,运行中可以更改ACLK的时钟源,但要注意留出足够的切换时钟源的时间,以防影响到其他程序的正确执行。

建议再一步一步定位一下,确定是在那一句出的问题。BCSCTL3 = (XT2S_2+LFXT1S_0+XCAP_1);不应该影响到前面while代码的执行的。

Maka Luo:

回复 adam zhang:

模块或时钟配置过程中,中断使能都是需要关闭,常用例程都是初始化结束后才使能总中断和模块中断。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F2418在运行的过程中可以更改ACLK的时钟源吗?
分享到: 更多 (0)