
不可以使用更高频率的外部晶振可以像用软件编写内部DCO
振荡器分频可以例如BCSCTL2|=SELM_3;//主
时钟8分频MSP430频率(时钟)配置MSP430时钟:1、在MSP430单片机中一共有四个时钟源:(1)LFXT1CLK,为低速/高速晶振源,通常接32768kHz晶振(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接400kHz~16Mhz;(3)DCOCLK,数控振荡器,为内部时钟,由RC震荡回路构成,受温度和电压的影响较大;若外部不接稳定的晶振电路,直接由内部时钟工作,则会因环境变化而导致性能不稳定。(4)VLOCLK,内部低频振荡器,12kHz标准振荡器。(要得到标准的12k则必须外接32768等晶振)2、在MSP430单片机内部一共有三个时钟系统:(1)ACLK:辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;(2)MCLK:主时钟,为系统内核提供时钟,它可以通过软件从四个时钟源选择或者从四个时钟源分频后选择为主时钟;(3)SMCLK:子时钟,也是可以由软件选择时钟源。3、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3DCOCTL,DCO控制寄存器,地址为56H,初始值为60HDCO2DCO1DCO0MOD4MOD3MOD2MOD1MOD0DCO0~DCO2:DCOSelectBit,定义了8种频率之一,而频率由注入直流发生器的电流定义。MOD0~MOD4:ModulationBit,频率的微调。一般不需要DCO的场合保持默认初始值就行了。BCSCTL1,地址为57H,初始值为84HXT2OFFXTSDIVA1DIVA0XT5VRSEL2RSEL1RSEL0RSEL0~RSEL2:选择某个内部电阻以决定标称频率0最低,7最高。XT5V:1DIVA0~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,地址为58H,初始值为00HSEM1SELM0DIVM1DIVM0SELSDIVS1DIVS0DCORDCOR:0,选择内部电阻;1,选择外部电阻DIVS0~DIVS1:DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8SELS:选择SMCLK的时钟源,0:DCOCLK;1:XT2CLK/LFXTCLKDIVM0~1:选择MCLK的分频因子,DIVM=0,1,2,3对应分频因子为1,2,4,8SELM0~1:选择MCLK的时钟源,0,1:DCOCLK,2:XT2CLK,3:LFXT1CLK我用的时候一般都把SMCLK与MCLK的时钟源选择为XT2。其它:1LFXT1:一次有效的PUC信号将使OSCOFF复位,允许LFXT1工作,如果LFXT1信号没有用作SMCLK或MCLK,可软件置OSCOFF关闭LFXT12XT2:XT2产生XT2CLK时钟信号,如果XT2CLK信号没有用作时钟MCLK和SMCLK,可以通过置XT2OFF关闭XT2,PUC信号后置XT2OFF,即XT2的关闭的。3DCO振荡器:振荡器失效时,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/---------------------------------------------------------------------------------------------/Voidmain(){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器BCSCTL1|=XT2OFF;//XT2关闭ACLK=32768hzDCO为默认值约800kBCSCTL3|=LFXT1S_2;//LFXT1=VLO=12khz(大约)//BCSCTL3|=LFXT1S_0;//LFXT1=32768khz(大约)IE1&=~OFIE;//清除时钟错误中断IFG1&=~OFIFG;//ClearOSCFaultflagBCSCTL2|=SELM_3+SELS;//mclk时钟源为LFXT1CLK,smclk=LFXT1CLK=32768hz//BCSCTL2|=SELM_0+SELS;//mclk时钟源为DCOCLK,smclk=LFXT1CLK=32768hz__delay_cycles(1000);//小延时等待振荡稳定P1DIR=BIT0;//P10配置输出P1OUT=BIT0;//P10输出高电平While(){P1OUT^=BIT0;//P10电平反转;_delay_cycles(100000);}}/---------------------------------------------------------------------------------------------//液晶控制IO的宏定义/
#define cyCS 0 //P30,片选信号
#define cySID 1 //P31,串行数据
#define cyCLK 2 //P32,同步时钟
#define cyPORT P3OUT
#define cyDDR P3DIR
/
函数名称:delay_Nus
功 能:延时N个us的时间
参 数:n--延时长度
返回值 :无
/
void delay_Nus(uint n)
{
uchar i;
for(i = n;i > 0;i--)
_NOP();
}
/
函数名称:delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
/
void delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/
函数名称:delay_Nms
功 能:延时N个ms的时间
参 数:无
返回值 :无
/
void delay_Nms(uint n)
{
uint i = 0;
for(i = n;i > 0;i--)
delay_1ms();
}
/
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
/
void Ini_Lcd(void)
{
cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出
delay_Nms(100); //延时等待液晶完成复位
Send(0,0x30); /功能设置:一次送8位数据,基本指令集/
delay_Nus(72);
Send(0,0x02); /DDRAM地址归位/
delay_Nus(72);
Send(0,0x0c); /显示设定:开显示,不显示光标,不做当前显示位反白闪动/
delay_Nus(72);
Send(0,0x01); /清屏,将DDRAM的位址计数器调整为“00H”/
delay_Nus(72);
Send(0,0x06); /功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1/
delay_Nus(72);
}
/
函数名称:Send
功 能:MCU向液晶模块发送1一个字节的数据
参 数:type--数据类型,0--控制命令,1--显示数据
transdata--发送的数据
返回值 :无
/
void Send(uchar type,uchar transdata)
{
uchar firstbyte = 0xf8;
uchar temp;
uchar i,j = 3;
if(type) firstbyte |= 0x02;
cyPORT |= BIT(cyCS);
cyPORT &= ~BIT(cyCLK);
while(j > 0)
{
if(j == 3) temp = firstbyte;
else if(j == 2) temp = transdata&0xf0;
else temp = (transdata << 4) & 0xf0;
for(i = 8;i > 0;i--)
{
if(temp & 0x80) cyPORT |= BIT(cySID);
else cyPORT &= ~BIT(cySID);
cyPORT |= BIT(cyCLK);
temp <<= 1;
cyPORT &= ~BIT(cyCLK);
}
//三个字节之间一定要有足够的延时,否则易出现时序问题
if(j == 3) delay_Nus(600);
else delay_Nus(200);
j--;
}
cyPORT &= ~BIT(cySID);
cyPORT &= ~BIT(cyCS);
}
评论列表(0条)