您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > MSP430-时钟的初始化和GPIO
MSP430时钟的初始化和GPIO一.概述:本实验的目的是了解用于执行对MSP430ValueLine设备的初始化过程的步骤。在这个练习中,您将编写初始化代码,并运行该设备使用各种时钟资源。1、写初始化代码2、运行CPU的MCLK的来源方式:VLO、32768晶体、DCO3、主体程序部分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,AuxiliaryClock,辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;(2)MCLK,MasterClock,系统主时钟单元,为系统内核提供时钟,它可以通过软件从四个时钟源选择;(3)SMCLK,Sub-MainClock,系统子时钟,也是可以由软件选择时钟源。BasicClockModuleRegisters(基础时钟寄存器)DCOcontrolregisterDCOCTLBasicclocksystemcontrol1BCSCTL1Basicclocksystemcontrol2BCSCTL2Basicclocksystemcontrol3BCSCTL3SFRinterruptenableregister1IE1SFRinterruptflagregister1IFG13、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3DCOCTL:DCO控制寄存器,地址为56H,初始值为60HDCO2DCO1DCO0MOD4MOD3MOD2MOD1MOD0DCO0~DCO2:DCOSelectBit,定义了8种频率之一,而频率由注入直流发生器的电流定义。MOD0~MOD4:ModulationBit,频率的微调。一般不需要DCO的场合保持默认初始值就行了。BCSCTL1:BasicClockSystemControl1,地址为57H,初始值为84HXT2OFFXTSDIVA1DIVA0XT5VRSEL2RSEL1RSEL0RSEL0~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:BasicClockSystemControl2,地址为58H,初始值为00HSELM1SELM0DIVM1DIVM0SELSDIVS1DIVS0DCORDCOR:EnableExternalResistor.0,选择内部电阻;1,选择外部电阻DIVS0~DIVS1:DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8SELS:选择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时钟。#includemsp430g2231.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器P1DIR=0x40;//P1.6配置输出P1OUT=0;//关闭LEDBCSCTL3|=LFXT1S_2;//LFXT1=VLOIFG1&=~OFIFG;//清除OSCFault标志__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)时钟下:晶体频率为32768赫兹,约3倍的VLO。如果我们在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么32768赫兹是一个标准?这是因为这个数字是2的15次方,因此很容易用简单的数字计数电路,以每秒一次获得率——手表和其他时间时基。认识到ACLK来自外部晶振时钟。#includemsp430g2231.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器P1DIR=0x41;//P1.0和P1.6配置输出P1OUT=0x01;//开启P1.0BCSCTL3|=LFXT1S_0;//LFXT1=32768Hz晶振while(IFG1&OFIFG){IFG1&=~OFIFG;//清除OSCFault标志_delay_cycles(100000);//为可见的标志延时}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约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望ACLK上运行的VLO或32768赫兹晶振。由于ACLK在我们目前的代码是在晶体上运行,我们会打开DCO计算。#includemsp430g2231.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF){while(1);//Ifcalconsterased,挂起}BCSCTL1=CALBC1_1MHZ;//SetrangeDCOCTL=CALDCO_1MHZ;//设置DCO模式P1DIR=0x41;//P1.0和P1.6配置输出P1OUT=0x01;//P1.0开启BCSCTL3|=LFXT1S_0;//LFXT1=32768Hzwhile(IFG1&OFIFG){IFG1&=~OFIFG;//清除OSCFault标志_delay_cycles(100000);//为可见标志延时}P1OUT=0;//P1.6关闭//__bis_SR_register(SCG1+SCG0);//关闭DCOBCSCTL2|=SELM_0+DIVM_3;//MCLK=DCOwhile(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运行。#includemsp430g2231.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF){while(1);//Ifcalconsterased,挂起}BCSCTL1=CALBC1_1MHZ;//SetrangeDCOCTL=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;//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);#defineWDTIS0(0x0001)#defineWDTIS1(0x0002)#defineWDTSSEL(0x0004)#defineWDTCNTCL(0x0008)#defineWDTTMSEL(0x0010)#defineWDTNMI(0x0020)#defineWDTNMIES(0x0040)#defineWDTHOLD(0x0080)#defineWDTPW(0x5A00)这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。举例如下:A、间隔时间由Bit0-2位编码:1、看门狗的时钟由FSMCLK(假设为1MHz)#defineWDT_MDLY_32(WDTPW+WDTTMSEL+WDTCNTCL)#defineWDT_MDLY_8(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)#defineWDT_MDLY_0_5(WDTPW+W
本文标题:MSP430-时钟的初始化和GPIO
链接地址:https://www.777doc.com/doc-5330417 .html