打印

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

[复制链接]
829|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Rollo|  楼主 | 2016-10-31 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的单片机是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);这句话注释掉,程序又能正常执行,这是怎么回事?

相关帖子

沙发
Bjorn| | 2016-10-31 21:07 | 只看该作者
BCSCTL3 = (XT2S_2+LFXT1S_0+XCAP_1);这一句在while(i)循环语句之后,怎么会有影响?

使用特权

评论回复
板凳
Thorald| | 2016-10-31 21:21 | 只看该作者
IE1|=OFIE+NMIIE+ACCVIE,开中断是要注意了

使用特权

评论回复
地板
Soraka| | 2016-10-31 21:36 | 只看该作者
开启外部晶振时BCSCTL3 = (XT2S_2+LFXT1S_0+XCAP_1),外部晶振不能马上起振,所以会出现时钟错误,导致程序进入时钟错误中断中。

使用特权

评论回复
5
pmp| | 2016-11-1 16:49 | 只看该作者
为什么要改变ALCK呢?

使用特权

评论回复
6
pmp| | 2016-11-1 16:51 | 只看该作者
时钟源能够重新初始化。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

730

帖子

1

粉丝