1/
void main (void)
{
unsigned int i;
WDTCL = WDTPW+WDTHOLD; //停止看门狗
P5DIR = 0x10; //设置P5.4输出
P5SEL = 0x10; //设置P5.4口为外围模块用作MCLK信号输出
BCSCTL1 &= ~XT2OFF; //使TX2有效,TX2上电时默认为关闭的.
do
{
IFG1 &= ~OFIFG; //清振荡器失效标志
for(i= 0xff; i>0; i--); //延时,待稳定.
}
while ((IFG1 & OFIFG)!=0); //若振荡器失效标志有效
BCSCTL2 |= SELM1; //使MCLK = XT2
for(;;);
}
2/
#include <msp430x11x1.h>
void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
BCSCTL1 |= XTS;
// 设置时基寄存器1,使ACLK = LFXT1 = HF XTAL,也就是高频模式.
P2DIR |= 0x01; // 设置P2.0方向寄存器为输出
P2SEL |= 0x01; // 设置P2.0口为外围模块用作ACLK信号输出
P1DIR |= 0x02; // 设置P1.1方向寄存器为输
do
{
IFG1 &= ~OFIFG; // 清振荡器失效标志
for (i = 0xFF; i > 0; i--); // 延时,待稳定
}
while ((IFG1 & OFIFG)); //若振荡器失效标志有效?
BCSCTL2 |= SELM_3;// 设置时基寄存器2,使主时钟信号MCLK = LFXT1 (可靠的)
for (;;) // 无穷循环
{
P1OUT |= 0x02; // P1.1 = 1
P1OUT &= ~0x02; // P1.1 = 0
}
}
1-LFXT1CLK: 低频/高频时钟源.由外接晶体振荡器,而无需外接两个振荡电容器.较常使用的晶体振荡器是32768HZ。
2-XT2CLK: 高频时钟源.由外接晶体振荡器。需要外接两个振荡电容器,较常用的晶体振荡器是8MHZ。
3-DCOCLK: 数字可控制的RC振荡器。d
/*******************************************************************************************************************/
/*******************************************************************************************************************/
BCSCTL 基本时钟系统控制寄存器1
|
|||||||
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
DCO.2
|
DCO.1
|
DCO.0
|
MOD.4
|
MOD.3
|
MOD.2
|
MOD.1
|
MOD.0
|
BCSCTL |=DCOx; //位选择,x为0,1,2。DCO0=0x20;DCO1=0x40;DCO2=0x80;
BCSCTL |=MODx;//模块选择,x为0,1,2,3,4;MOD0=0x01,MOD1=0x2;MOD2=0x04;MOD3=0x08,MOD4=0x10;
/********************************************************************************************************************/
BCSCTL |=MODx;//模块选择,x为0,1,2,3,4;MOD0=0x01,MOD1=0x2;MOD2=0x04;MOD3=0x08,MOD4=0x10;
/********************************************************************************************************************/
BCSCTL1 基本时钟系统控制寄存器1
|
|||||||
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
XT2OFF
|
TXS
|
DIVA.1
|
DIVA.0
|
XT5V
|
Rsel.2
|
Resl.1
|
Resl.0
|
BCSCTL1 |=XT2OFF; //使能启用XT2CLK
BCSCTL1 |=TXS; //启用高频; BCSCTL1 &=~TXS;//启用低频
BCSCTL1 |=DIVA_x; //ACLK时钟源分频,x为0,不分频,1是2分频,2是4分频,3是8分频
BCSCTL1 |=XT5V; //
BCSCTL1 |=RSELx; //x可选0,1,2,3,频率范围选择
BCSCTL1 |=TXS; //启用高频; BCSCTL1 &=~TXS;//启用低频
BCSCTL1 |=DIVA_x; //ACLK时钟源分频,x为0,不分频,1是2分频,2是4分频,3是8分频
BCSCTL1 |=XT5V; //
BCSCTL1 |=RSELx; //x可选0,1,2,3,频率范围选择
/*********************************************************************************************************************/
BCSCTL2 基本时钟系统控制寄存器2
|
|||||||
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
SELM.1
|
SELM.0
|
DIVM.1
|
DIVM.0
|
SELS
|
DIVS.1
|
DIVS.0
|
DCOR
|
BCSCTL2寄存器默认为0x00,需要哪个时钟源,几分频,按下列相加即可。
BCSCTL2 |=SELM_x; //MCLK时钟源选择,x为0,1选内部时钟DCOCLK,2选XT2,3选LFXTCLK
BCSCTL2 |=DIVM_x; //MCLK时钟源分频,x为0,不分,1是2分频,2是4分频,3是8分频
BCSCTL2 |=SELS; //SMCLK时钟源选XT2CLK,默认选DCOCLK
BCSCTL2 |=DIVS_x; //SMCLK时钟源分频,x为0,不分,1是2分频,2是4分频,3是8分频
BCSCTL2 |=DCOR;//使能外部电阻,默认使能内部电阻。宏定义DCOR=0x01;
对于辅助时钟的分频,设置BCSCTL1
/**********************************************************************************/
BCSCTL2 |=SELM_x; //MCLK时钟源选择,x为0,1选内部时钟DCOCLK,2选XT2,3选LFXTCLK
BCSCTL2 |=DIVM_x; //MCLK时钟源分频,x为0,不分,1是2分频,2是4分频,3是8分频
BCSCTL2 |=SELS; //SMCLK时钟源选XT2CLK,默认选DCOCLK
BCSCTL2 |=DIVS_x; //SMCLK时钟源分频,x为0,不分,1是2分频,2是4分频,3是8分频
BCSCTL2 |=DCOR;//使能外部电阻,默认使能内部电阻。宏定义DCOR=0x01;
对于辅助时钟的分频,设置BCSCTL1
/**********************************************************************************/
MSP430单片机时钟模块提供3个时钟信号输出,以供给片内各部电路使用。
1-ACLK: 辅助时钟信号.由图所示,ACLK是从LFXT1CLK信号由1/2/4/8分频器分频后所得到的.由BCSCTL1寄存器设置DIVA相应为来决定分频因子.ACLK可用于提供CPU外围功能模块作时钟信号使用.
2-MCLK: 主时钟信号.由图所示,MCLK是由3个时钟源所提供的。他们分别是LFXT1CLK,XT2CLK(F13、F14,如果是F11,F11X1则由LFXT1CLK代替),DCO时钟源信号提供.MCLK主要用于MCU和相关系统模块作时钟使用。同样可设置相关寄存器来决定分频因子及相关的设置。
3-SMCLK: 子系统时钟,SMCLK是由2个时钟源信号所提供.他们分别是XT2CLK(F13、F14)和DCO,如果是F11、F11X1则由LFXT1CLK代替TX2CLK。同样可设置相关寄存器来决定分频因子及相关的设置。
DCOCTL DCO控制寄存器
|
|||||||
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
DCO.2
|
DCO.1
|
DCO.0
|
MOD.4
|
MOD.3
|
MOD.2
|
MOD.1
|
MOD.0
|
DCO.0-DCO.4 定义8种频率之一,可以分段调节DCOCLK频率,相邻两种频率相差10%。而频率由注入直流发生器的电流定义。
MOD.0-MOD.4 定义在32个DCO周期中插入的Fdco+1周期个数,而在下的DCO周期中为Fdco周期,控制改换DCO和DCO+1选择的两种频率。如果DCO常数为7,表示已经选择最高频率,此时不能利用MOD.0-MOD.4进行频率调整。
BCSCTL1 基本时钟系统控制寄存器1
|
|||||||
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
XT2OFF
|
TXS
|
DIVA.1
|
DIVA.0
|
XT5V
|
Rsel.2
|
Resl.1
|
Resl.0
|
XT2OFF 控制XT2振荡器的开启与关闭。
TX2OFF=0,XT2振荡器开启。
TX2OFF=1,TX2振荡器关闭(默认为TX2关闭)
XTS 控制LFXT1 工作模式,选择需结合实际晶体振荡器连接情况。
XTS=0,LFXT1 工作在低频模式(默认)。
XTS=1,LFXT1 工作在高频模式(必须连接有高频相应的高频时钟源)。
DIVA.0 DIVA.1 控制ACLK分频。
0 不分频(默认)
1 2分频
2 4分频
3 8分频
XT5V 此位设置为0。
Resl1.0,Resl1.1,Resl1.2 三位控制某个内部电阻以决定标称频率。
Resl=0,选择最低的标称频率。
……..
Resl=7,选择最高的标称频率。
BSCCTL2 |= DIVM_x (x=0,1,2,3)MCLK分频(x=0,不分频;x=1,2分频;x=2,4分频;x=3,8分频)
DIVS_0
BCSCTL2 基本时钟系统控制寄存器2
|
|||||||
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
SELM.1
|
SELM.0
|
DIVM.1
|
DIVM.0
|
SELS
|
DIVS.1
|
DIVS.0
|
DCOR
|
SELM.1 SELM.0 选择MCLK时钟源
0 时钟源为DCOCLK(默认)
1 时钟源为DCOCLK
2 时钟源为LFXT1CLK(对于MSP430F11/12X),时钟源为XT2CLK(对于MSP430F13/14/15/16X);
3 时钟源为LFTXTICLK。
DIVM.1 DIVM.0 选择MCLK分频
0 1分频(默认)
1 2分频
2 4 分频
3 8 分频
SELS 选择SMCLK时钟源
0 时钟源为DCOCLK(默认)
1 时钟源为LFXT1CLK(对于MSP430F11/12X),时钟源为XT2CLK(对于MSP430F13/14/15/16X)。
DIVS.1 DIVS.0 选择SMCLK分频。
0 1分频
1 2分频
2 4分频
4 8分频
DCOR 选择DCO电阻
0 内部电阻
1 外部电阻
PUC信号之后,DCOCLK被自动选择MCLK时钟信号,根据需要,MCLK的时钟源可以另外设置为LFXT1或者XT2。设置顺序如下:
[1] 复位OscOff
[2] 清除OFIFG
[3] 延时等待至少50us
[4] 再次检查OFIFG,如果仍然置位,则重复[3]、[4]步骤,直到OFIFG=0为止。
低功耗设置的技巧问题:
1、LPM4:在振荡器关闭模式期间,处理机的所有部件工作停止,此时电流消耗最小。此时只有在系统上电电路检测到低点电平或任一请求异步响应中断的外部中断事件时才会从新工作。因此在设计上应含有可能需要用到的外部中断才采用这种模式。否则发生不可预料的结果。
2、LPM3:在DC发生器关闭期间,只有晶振是活动的。但此时设置的基本时序条件的DC发生器的DC电流被关闭。由于此电路的高阻设计,使功耗被抑制。注:当从DC关闭到启动DC0要花一端时间(ns-us)
3、LPM2:在此期间,晶镇振和DC发生器是工作的,所以可实现快速启动。
4、LPM1:在此振荡器已经工作,所以不存在启动时间延时问题。
Timer_A的寄存器
|
|
||||||||||||||
寄存器
|
缩写
|
读定类型
|
地址
|
初态
|
|
||||||||||
Timer_A控制寄存器
|
TACTL
|
R/W
|
160H
|
POR复位
|
|
||||||||||
Timer_A计数器
|
TAR
|
R/W
|
170H
|
POR复位
|
|
||||||||||
捕捞/比较控制寄存器0
|
CCTL0
|
R/W
|
162H
|
POR复位
|
|
||||||||||
捕捞/比较寄存器0
|
CCR0
|
R/W
|
172H
|
POR复位
|
|
||||||||||
捕捞/比较控制寄存器1
|
CCTL1
|
R/W
|
164H
|
POR复位
|
|
||||||||||
捕捞/比较寄存器1
|
CCR1
|
R/W
|
174H
|
POR复位
|
|
||||||||||
捕捞/比较控制寄存器2
|
CCTL2
|
R/W
|
166H
|
POR复位
|
|
||||||||||
捕捞/比较寄存器2
|
CCR2
|
R/W
|
176H
|
POR复位
|
|
||||||||||
中断向量寄存器
|
TAIV
|
R/W
|
12EH
|
POR复位
|
|
||||||||||
TACTL 控制寄存器
|
|||||||||||||||
15--10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|||||
未用
|
SSEL1
|
SSEL0
|
ID1
|
ID0
|
MC1
|
MC0
|
未用
|
CLR
|
TAIE
|
TAIFG
|
SSEL1、SSEL0选择定时器输入分频器的时钟源
Timer_A时钟源
SSEL1
|
SSEL0
|
输入时钟源
|
说明
|
0
|
0
|
TACLK
|
用特定的外部引脚信号
|
0
|
1
|
ACLK
|
辅助时钟
|
1
|
0
|
SMCLK
|
子系统时钟
|
1
|
1
|
INCLK
|
见器件说明
|
ID1,ID0 输入分频选择
00 不分频
01 2分频
10 4分频
11 8分频
MC1,MC0 计数模式控制位
00 停止模式
01 增计数模式
10 连续计数模式
11 增/减计数模式
CLR 定时器清除位
POR或CLR置位时定时器和输入分频器复位。CLR由硬件自动复位,其读出始终为0。定时器在下一个有效输入沿开始工作。如果不是被清除模式控制暂停,则定时器以增计数模式开始工作。
TAIE 定时器中断允许位
0 禁止定时器溢出中断
1 允许定时器溢出中断
TAIFG 定时器溢出标志位
增计数模式: 当定时器由CCR0计数到到0时,TAIFG置位。
连续计数模式:当定时器由0FFFFH计数到0时,TAIFG置位。
增/减计数模式:当定时器由CCR0减计数到0时,TAIFG置位。
CCTLx 捕获/比较控制寄存器
|
|||||||||||||||||||||
15 14
|
13 12
|
11
|
10
|
9
|
8
|
7 6 5
|
4
|
3
|
2
|
1
|
0
|
||||||||||
CAPTMOD1-0
|
CCIS1-0
|
SCS
|
SCCIx
|
CAP
|
OUTMODx
|
CCIEx
|
CCIx
|
OUT
|
COV
|
CCIFx
|
TIMER_A有多个捕获比较模块,每个模块都有自己的控制寄存器CCTLx
CAPTMOD1-0 选择捕获模式
00 禁止捕获模式
01 上升沿捕获
10 下降沿捕获
11 上升沿与下降沿都捕获
CCISI1-0 在捕获模式中用来定提供捕获事件的输入端
00 选择CCIxA
01 选择CCIxB
10 选择GND
11 选择VCC
SCS 选择捕获信号与定时器时钟同步、异步关系
0 异步捕获
1 同步捕获
异步捕获模式允许在请求时立即将CCIFG置位和捕获定时器值,适用于捕获信号的周期远大于定时器时钟周期的情况。但是,如果定时器时钟和捕获信号发生时间竞争,则捕获寄存器的值可能出错。
在实际中经常使用同步捕获模式,而且捕获总是有效的。
SSCIx 比较相等信号EQUx将选择中的捕获、比较输入信号CCIx(CCIxA,CCIxB,Vcc和GND)进行锁存,然后可由SCCIx读出。
CAP 选择捕获模式还是比较模式。
0 比较模式
1 捕获模式
注意:同时捕获和捕获模式选择
如果通过捕获比较寄存器CCTLx中的CAP使工作模式从比较模式变为捕获模式,那么不应同时进行捕获;否则,在捕获比较寄存器中的值是不可预料的,推荐的指令顺序为:[1]修改控制寄存器,由比较模式换到捕获模式。
[2]捕获
OUTMODx 选择输出模式
000 输出
001 置位
010 PWM翻转/复位
011 PWM置位/复位
100 翻转/置位
101 复位
110 PWM翻转/置位
111 PWM复位/置位
CCIx 捕获比较模的输入信号
捕获模式:由CCIS0和CCIS1选择的输入信号通过该位读出。
比较模式:CCIx复位。
OUT 输出信号
0 输出低电平
1 输出高电平
如果OUTMODx选择输出模式0(输出),则该位对应于输入状态。
COV 捕获溢出标志
0 输出低电平
1 输出高电平
[1]当CAP=0时,选择比较模式。捕获信号发生复位,没有使COV置位的捕获事件。
[2]当CAP=1时,选择捕获模式,如果捕获寄存器的值被读出再次发生捕获事件,则COV置位。程序可检测COV来断定原值读出前是否又发生捕获事件。读捕获寄存器时不会使溢出标志复位,须用软件复位。
CCIFGx 捕获比较中断标志
捕获模式:寄存器CCRx捕获了定时器TAR值时置位。
比较模式:定时器TAR值等于寄存器CCRx值时置位。
#include <msp430x14x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器
P1DIR |= 0x01; // 设P1.0为输出
TACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, 定时器A计数模式,且开中断功能
_BIS_SR(LPM3_bits + GIE); //进入LPM3 低功耗模式和开总中断允许
}
// Timer_A3中断向量(TAIV)处理程序
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch( TAIV ) //应用switch语句来处理多中断源的向量
{ //向量列表通过case语句来分多中断源的入口
case 2: break; // CCR1比较/捕获寄存器的中断入口,
//本例子未用到。
case 4: break; // CCR2比较/捕获寄存器的中断入口,
微控网为你准备的 MSP430F 单片机入门必修课 //