您的位置 首页 电源

MSP430学习心得—时钟

时钟初始化和GPIO概述:本实验的目的是了解用于执行对MSP430ValueLine设备的初始化过程的步骤。在这个练习中,您将编写初始化代码,并运行该设备使用各种时钟资源。1、写初始化

  时钟初始化和GPIO

  概述:

  本试验的意图是了解用于履行对MSP430 Value Line设备的初始化进程的过程。在这个操练中,您将编写初始化代码,并运转该设备运用各种时钟资源。

  1、写初始化代码

  2、运转CPU的MCLK的来历方法:VLO 、32768晶体、DCO

  3、主体程序部分

  4、调查LED闪光灯速度

  MSP430时钟

  1、在MSP430单片机中一共有三个或四个时钟源:

  (1)LFXT1CLK,为低速/高速晶振源,一般接32.768kHz,也能够接(400kHz~16Mhz);

  (2)XT2CLK,可选高频振荡器,外接规范高速晶振,一般是接8Mhz,也能够接(400kHz~16Mhz);

  (3)DCOCLK,数控振荡器,为内部晶振,由RC震动回路构成;

  (4)VLOCLK,内部低频振荡器,12kHz规范振荡器。

  2、在MSP430单片机内部一共有三个时钟体系:

  (1)ACLK,Auxiliary Clock,辅佐时钟,一般由LFXT1CLK或VLOCLK作为时钟源,能够经过软件操控更改时钟的分频系数;

  (2)MCLK,Master Clock,体系主时钟单元,为体系内核供给时钟,它能够经过软件从四个时钟源挑选;

  (3)SMCLK,Sub-Main Clock,体系子时钟,也是能够由软件挑选时钟源。

  Basic Clock Module Registers(根底时钟寄存器)

  DCO control register DCOCTL

  Basic clock system control 1 BCSCTL1

  Basic clock system control 2 BCSCTL2

  Basic clock system control 3 BCSCTL3

  SFR interrupt enable register 1 IE1

  SFR interrupt flag register 1 IFG1

  3、MSP430的时钟设置包含3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3

  DCOCTL,DCO操控寄存器,地址为56H,初始值为60H

  DCO2DCO1DCO0MOD4MOD3MOD2MOD1MOD0

  DCO0~DCO2: DCO Select Bit,界说了8种频率之一,而频率由注入直流发生器的电流界说。

  MOD0~MOD4: Modulation Bit,频率的微调。

  一般不需要DCO的场合坚持默许初始值就行了。

  BCSCTL1,Basic Clock System Control 1,地址为57H,初始值为84H

  XT2OFFXTSDIVA1DIVA0XT5VRSEL2RSEL1RSEL0

  RSEL0~RSEL2: 挑选某个内部电阻以决议标称频率.0最低,7最高。

  XT5V: 1.

  DIVA0~DIVA1:挑选ACLK的分频系数。DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8;

  XTS: 挑选LFXT1作业在低频晶体形式(XTS=0)仍是高频晶体形式(XTS=1)。

  XT2OFF: 操控XT2振荡器的敞开(XT2OFF=0)与封闭(XT2OFF=1)。

  正常情况下把XT2OFF复位就能够了.

  BCSCTL2,Basic Clock System Control 2,地址为58H,初始值为00H

  SEM1SELM0DIVM1DIVM0SELSDIVS1DIVS0DCOR

  DCOR: Enable External Resistor. 0,挑选内部电阻;1,挑选外部电阻

  DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8

  SELS: 挑选SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.

  DIVM0~1: 挑选MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.

  SELM0~1: 挑选MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK

  我用的时分一般都把SMCLK与MCLK的时钟源挑选为XT2。

  其它:

  1. LFXT1: 一次有用的PUC信号将使OSCOFF复位,答应LFXT1作业,假如LFXT1信号没有用作SMCLK或MCLK,可软件置OSCOFF封闭LFXT1.

  2. XT2: XT2发生XT2CLK时钟信号,假如XT2CLK信号没有用作时钟MCLK和SMCLK,能够经过置XT2OFF封闭XT2,PUC信号后置XT2OFF,即XT2的封闭的。

  3. DCO振荡器:振荡器失效时,DCO振荡器会主动被选做MCLK的时钟源。假如DCO信号没有用作SMCLK和MCLK时钟信号时,可置SCG0位封闭DCO直流发生器。

  4. 在PUC信号后,由DCOCLK作MCLK的时钟信号,根据需要可将MCLK的时钟源别的设置为LFXT1或XT2,设置次序如下:

  (1)清OSCOFF/XT2

  (2)清OFIFG

  (3)延时等候至少50uS

  (4)再次查看OFIFG,假如仍置位,则重复(1)-(4)步,直到OFIFG=0停止。

  (5)设置BCSCTL2的相应SELM。

  实例剖析

  1、CPU运转在VLO时钟下:

  这是最慢的时钟,在约12千赫兹下运转。因而,咱们将经过可视化的LED闪耀的赤色慢慢地在约每3秒钟率。咱们能够让时钟体系默许这种状况,设置专门来操作VLO。咱们将不运用任何ALCK外设时钟在此试验室作业,但你应该认识到,ACLK来自VLO时钟。

  #include

  void main(void)

  {

  WDTCTL = WDTPW + WDTHOLD; // 封闭看门狗定时器

  P1DIR = 0x40; // P1.6 装备输出

  P1OUT = 0; // 封闭LED

  BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

  IFG1 &= ~OFIFG; // 铲除OSCFault 标志

  __bis_SR_register(SCG1 + SCG0); // 封闭 DCO

  BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8

  while(1)

  {

  P1OUT = 0x40; // 敞开LED

  _delay_cycles(100);

  P1OUT = 0; // 封闭 LED

  _delay_cycles(5000);

  }

  }

  2、CPU运转在晶振(32768Hz)时钟下:

  晶体频率为32768赫兹,约3倍的VLO。假如咱们在前面的代码中运用晶振,指示灯应闪耀大约每秒一次。你知道为什么32768赫兹是一个规范?这是因为这个数字是2的15次方,因而很容易用简略的数字计数电路,以每秒一次取得率 ——手表和其他时刻时基。认识到ACLK来自外部晶振时钟。

  #include

  void main(void)

  {

  WDTCTL = WDTPW + WDTHOLD; // 封闭看门狗定时器

  P1DIR = 0x41; // P1.0 和P1.6装备输出

  P1OUT = 0x01; // 敞开P1.0

  BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 晶振

  while(IFG1 & OFIFG)

  {

  IFG1 &= ~OFIFG; // 铲除 OSCFault 标志

  _delay_cycles(100000); // 为可见的标志延时

  }

  P1OUT = 0; // 封闭P1

  __bis_SR_register(SCG1 + SCG0); // 封闭 DCO

  BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8

  while(1)

  {

  P1OUT = 0x40; // 敞开 LED

  _delay_cycles(100);

  P1OUT = 0; / / 封闭LED

  _delay_cycles(5000);

  }

  }

  3、CPU运转在晶振(32768Hz)和DCO时钟下:

  最慢的频率,咱们能够运转DCO约在1MHz(这也是默许速度)。因而,咱们将开端切换MCLK到DCO下。在大多数体系中,你会期望ACLK上运转的VLO或32768赫兹晶振。因为ACLK在咱们现在的代码是在晶体上运转,咱们会翻开DCO核算。

  #include

  void main(void)

  {

  WDTCTL = WDTPW + WDTHOLD; // 封闭看门狗定时器

  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

  {

  while(1); // If cal const erased, 挂起

  }

  BCSCTL1 = CALBC1_1MHZ; // Set range

  DCOCTL = CALDCO_1MHZ; //设置DCO形式

  P1DIR = 0x41; // P1.0 和P1.6装备输出

  P1OUT = 0x01; // P1.0 敞开

  BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz

  while(IFG1 & OFIFG)

  {

  IFG1 &= ~OFIFG; // 铲除OSCFault 标志

  _delay_cycles(100000); // 为可见标志延时

  _delay_cycles(100000); // 为可见标志延时

  }

  P1OUT = 0; // P1.6 封闭

  // __bis_SR_register(SCG1 + SCG0); // 封闭DCO

  BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO

  while(1)

  {

  P1OUT = 0x40; // P1.6 敞开

  _delay_cycles(100);

  P1OUT = 0; / / P1.6 封闭

  _delay_cycles(5000);

  }

  }

  4、CPU运转在DCO时钟下:

  最慢的频率,咱们能够运转DCO约在1MHz(这也是默许速度)。因而,咱们将开端切换MCLK到DCO下。在大多数体系中,你会期望在VLO或者是晶振下运转ACLK。因为ACLK在咱们现在的代码是在VLO上运转,咱们会翻开DCO运转。

  #include

  void main(void)

  {

  WDTCTL = WDTPW + WDTHOLD; // 封闭看门狗定时器

  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

  {

  while(1); // If cal const erased,挂起

  }

  BCSCTL1 = CALBC1_1MHZ; // Set range

  DCOCTL = CALDCO_1MHZ; // 设置DCO形式

  P1DIR = 0x40; // P1.6 装备输出

  P1OUT = 0; // P1封闭

  BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

  IFG1 &= ~OFIFG; // 铲除 OSCFault 标志

  //__bis_SR_register(SCG1 + SCG0); // 封闭DCO

  BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8

  while(1)

  {

  P1OUT = 0x40; // P1.6 封闭

  _delay_cycles(100);

  P1OUT = 0; // P1.6 敞开

  _delay_cycles(5000);

  }

  }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/212686.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部