MSP430-时钟的初始化和GPIO_第1页
MSP430-时钟的初始化和GPIO_第2页
MSP430-时钟的初始化和GPIO_第3页
MSP430-时钟的初始化和GPIO_第4页
MSP430-时钟的初始化和GPIO_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MSP430 时钟的初始化和GPIO一.概述:本实验的目的是了解用于执行对MSP430 Value Line设备的初始化过程的步骤。在这个练习中,您将编写初始化代码,并运行该设备使用各种时钟资源。1、写初始化代码2、运行CPU的MCLK的来源方式:VLO 、32768晶体、DCO3、主体程序部分4、观察LED闪光灯速度MSP430时钟:1、在MSP430单片机中一共有三个或四个时钟源:(1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz,也可以接(400kHz16Mhz);(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接(400kHz16Mhz)

2、; (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 co

3、ntrol register DCOCTLBasic clock system control 1 BCSCTL1Basic clock system control 2 BCSCTL2Basic clock system control 3 BCSCTL3SFR interrupt enable register 1 IE1SFR interrupt flag register 1 IFG13、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3DCOCTL: DCO控制寄存器,地址为56H,初始值为60HDCO2DCO1DCO0MOD4MOD3

4、MOD2MOD1MOD0DCO0DCO2: DCO Select Bit,定义了8种频率之一,而频率由注入直流发生器的电流定义。MOD0MOD4: Modulation Bit,频率的微调。一般不需要DCO的场合保持默认初始值就行了。BCSCTL1: Basic Clock System Control 1,地址为57H,初始值为84HXT2OFFXTSDIVA1DIVA0XT5VRSEL2RSEL1RSEL0RSEL0RSEL2: 选择某个内部电阻以决定标称频率.0最低,7最高。XT5V: 1.DIVA0DIVA1:选择ACLK的分频系数。DIVA=0,1,2,3,ACLK的分频系数分别是1

5、,2,4,8;XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。正常情况下把XT2OFF复位就可以了.BCSCTL2: Basic Clock System Control 2,地址为58H,初始值为00HSELM1SELM0DIVM1DIVM0SELSDIVS1DIVS0DCORDCOR: Enable External Resistor. 0,选择内部电阻;1,选择外部电阻DIVS0DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8SELS

6、: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK.DIVM01: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.SELM01: 选择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信号没有用作时钟MC

7、LK和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。实例分析

8、1、CPU运行在VLO时钟下:这是最慢的时钟,在约12千赫兹下运行。因此,我们将通过可视化的LED闪烁的红色慢慢地在约每3秒钟率。我们可以让时钟系统默认这种状态,设置专门来操作VLO。我们将不使用任何ALCK外设时钟在此实验室工作,但你应该认识到,ACLK来自VLO时钟。#include void main(void)WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗定时器P1DIR = 0x40; / P1.6 配置输出P1OUT = 0; / 关闭LEDBCSCTL3 |= LFXT1S_2; / LFXT1 = VLOIFG1 &= OFIFG; / 清除OSCFault

9、 标志_bis_SR_register(SCG1 + SCG0); / 关闭 DCO/*_bis_SR_register():是将SR里的对应位置1, _bic_SR_register_on_exit(CPUOFF); 是将SR里的CPUOFF位置0。 在intrinsics.h里有定义的*/BCSCTL2 |= SELM_3 + DIVM_3; / MCLK = VLO/8while(1)P1OUT = 0x40; / 开启LED_delay_cycles(100);P1OUT = 0; / 关闭 LED_delay_cycles(5000);2、CPU运行在晶振(32768Hz)时钟下:晶

10、体频率为32768赫兹,约3倍的VLO。如果我们在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么32768赫兹是一个标准?这是因为这个数字是2的15次方,因此很容易用简单的数字计数电路,以每秒一次获得率 手表和其他时间时基。认识到ACLK来自外部晶振时钟。#include void main(void)WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗定时器P1DIR = 0x41; / P1.0 和P1.6配置输出P1OUT = 0x01; / 开启P1.0BCSCTL3 |= LFXT1S_0; / LFXT1 = 32768Hz 晶振while(IFG1 &

11、 OFIFG)IFG1 &= OFIFG; / 清除 OSCFault 标志_delay_cycles(); / 为可见的标志延时P1OUT = 0; / 关闭P1_bis_SR_register(SCG1 + SCG0); / 关闭 DCOBCSCTL2 |= SELM_3 + DIVM_3; / MCLK = 32768/8while(1)P1OUT = 0x40; / 开启 LED_delay_cycles(100);P1OUT = 0; / / 关闭LED_delay_cycles(5000);3、CPU运行在晶振(32768Hz)和DCO时钟下:最慢的频率,我们可以运行DCO约在1M

12、Hz(这也是默认速度)。因此,我们将开始切换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 rangeDCOCTL = CALDCO_1MHZ; /设置DCO模

13、式P1DIR = 0x41; / P1.0 和P1.6配置输出P1OUT = 0x01; / P1.0 开启BCSCTL3 |= LFXT1S_0; / LFXT1 = 32768Hzwhile(IFG1 & OFIFG)IFG1 &= OFIFG; / 清除OSCFault 标志_delay_cycles(); / 为可见标志延时P1OUT = 0; / P1.6 关闭/ _bis_SR_register(SCG1 + SCG0); / 关闭DCOBCSCTL2 |= SELM_0 + DIVM_3; / MCLK = DCOwhile(1)P1OUT = 0x40; / P1.6 开启_d

14、elay_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);

15、 / If cal const erased,挂起BCSCTL1 = CALBC1_1MHZ; / Set rangeDCOCTL = CALDCO_1MHZ; / 设置DCO模式P1DIR = 0x40; / P1.6 配置输出P1OUT = 0; / P1关闭BCSCTL3 |= LFXT1S_2; / LFXT1 = VLOIFG1 &= OFIFG; / 清除 OSCFault 标志/_bis_SR_register(SCG1 + SCG0); / 关闭DCOBCSCTL2 |= SELM_0 + DIVM_3; / MCLK = DCO/8while(1)P1OUT = 0x40;

16、/ P1.6 关闭_delay_cycles(100);P1OUT = 0; / P1.6 开启_delay_cycles(5000);以下将会分析上面4个例子的代码细微差别:首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明和以上四个代码有关的部分,其余请大家自行阅读。一、WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗定时器(例1、2、3、4)头文件中的相关说明如下:#define _MSP430_HAS_WDT_ SFR_16BIT(WDTCTL); #define WDTIS0 (0x0001)#define WDTIS1

17、 (0x0002)#define WDTSSEL (0x0004)#define WDTCNTCL (0x0008)#define WDTTMSEL (0x0010)#define WDTNMI (0x0020)#define WDTNMIES (0x0040)#define WDTHOLD (0x0080)#define WDTPW (0x5A00)这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。举例如下:A、间隔时间由Bit0-2位编码:1、看门狗的时钟由FSMCLK(假设为1MHz)#define WDT_MDLY

18、_32 (WDTPW+WDTTMSEL+WDTCNTCL) #define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) #define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) #define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) 2、看门狗的时钟由FACLK(假设为32KHz)#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) #define WDT_ADLY_250

19、(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) #define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) B、看门狗模式在过期时间后重启:1、看门狗的时钟由FSMCLK(假设为1MHz)#define WDT_MRST_32 (WDTPW+WDTCNTCL) #define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) #define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) #define WDT_MRST_0_064 (WDTPW+WDT

20、CNTCL+WDTIS1+WDTIS0) 2、看门狗的时钟由FACLK(假设为32KHz)#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) #define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) #define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) #define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) 二、P1DIR = 0x40; / P1.6 配置输出P1OUT = 0; / P1关

21、闭 (例1、2、3、4)其中DIR 和P1OUT分别配置IO口的方向和输出值,这里不在赘述,请参考手册。三、BCSCTL3 |= LFXT1S_2; / LFXT1 = VLO (例1和例4)BCSCTL3 |= LFXT1S_0; / LFXT1 = 32768Hz (例2和例3)#define _MSP430_HAS_BC2_ SFR_8BIT(DCOCTL); SFR_8BIT(BCSCTL1); SFR_8BIT(BCSCTL2); SFR_8BIT(BCSCTL3); #define MOD0 (0x01) #define MOD1 (0x02) #define MOD2 (0x04

22、) #define MOD3 (0x08) #define MOD4 (0x10) #define DCO0 (0x20) #define DCO1 (0x40) #define DCO2 (0x80) #define LFXT1OF (0x01) #define XT2OF (0x02) #define XCAP0 (0x04) #define XCAP1 (0x08) #define LFXT1S0 (0x10) #define LFXT1S1 (0x20) #define XT2S0 (0x40) #define XT2S1 (0x80) #define XCAP_0 (0x00) #d

23、efine XCAP_1 (0x04) #define XCAP_2 (0x08) #define XCAP_3 (0x0C) #define LFXT1S_0 (0x00) #define LFXT1S_1 (0x10) #define LFXT1S_2 (0x20) #define LFXT1S_3 (0x30) #define XT2S_0 (0x00) #define XT2S_1 (0x40) #define XT2S_2 (0x80) #define XT2S_3 (0xC0) 四、_bis_SR_register(SCG1 + SCG0); / 关闭 DCO_bis_SR_reg

24、ister()是在intrinsics.h这个头文件中定义了,实现的功能是将SR中的位置零。关于头文件中的代码作用#ifdef _cplusplusextern C#endif#ifdef _cplusplus#endif一般用于将C+代码以标准C形式输出(即以C的形式被调用),这是因为C+虽然常被认为是C的超集,但是C+的编译器还是与C的编译器不同的。C中调用C+中的代码这样定义会是安全的。五、BCSCTL2 |= SELM_3 + DIVM_3; / MCLK = VLO/8BCSCTL2 |= SELM_3 + DIVM_3; / MCLK = 32768/8BCSCTL2 |= SEL

25、M_0 + DIVM_3; / MCLK = DCOBCSCTL2 |= SELM_0 + DIVM_3; / MCLK = DCO/8MSP430中有如下定义:#define RSEL0 (0x01) #define RSEL1 (0x02) #define RSEL2 (0x04) #define RSEL3 (0x08) #define DIVA0 (0x10) #define DIVA1 (0x20) #define XTS (0x40) #define XT2OFF (0x80) #define DIVA_0 (0x00) #define DIVA_1 (0x10) #define

26、DIVA_2 (0x20) #define DIVA_3 (0x30) #define DIVS0 (0x02) #define DIVS1 (0x04) #define SELS (0x08) #define DIVM0 (0x10) #define DIVM1 (0x20) #define SELM0 (0x40) #define SELM1 (0x80) #define DIVS_0 (0x00) #define DIVS_1 (0x02) #define DIVS_2 (0x04) #define DIVS_3 (0x06) #define DIVM_0 (0x00) #define

27、DIVM_1 (0x10) #define DIVM_2 (0x20) #define DIVM_3 (0x30) #define SELM_0 (0x00) #define SELM_1 (0x40) #define SELM_2 (0x80) #define SELM_3 (0xC0) 六、BCSCTL1 = CALBC1_1MHZ; /设置值 (例3、4)#ifndef _DisableCalDataSFR_8BIT(CALDCO_16MHZ); SFR_8BIT(CALBC1_16MHZ); SFR_8BIT(CALDCO_12MHZ); SFR_8BIT(CALBC1_12MHZ); SFR_8BIT(CALDCO_8MHZ); SFR_8BIT(CALBC1_8MHZ); SFR_8BIT(CALDCO_1MHZ); SFR_8BIT(CALBC1_1MHZ); #endif 关于SFR_8BIT的相关说明:External references resolved by a device-specific linker command file(外部引用解决的特定于设备的连接器命令文件)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论