第5章MSP430单片机的定时器/计数器
在学习MSP430F249的定时器之前,我们先回顾一下MSP430F249的时钟系统。MSP430F249的基础时钟模块具有3个振荡器,这3个振荡器分别是LFXT1低频振荡器(32768Hz)、XT2高频振荡器(400k~16MHz)和DCO内部数字控制振荡器(约1.1MHz)。这3个振荡器都可以通过软件设定进行1/2/4/8分频,产生单片机工作需要的3个时钟信号:主时钟MCLK、子系统时钟SMCLK和辅助时钟ACLK。MCLK可以通过编程选择3个振荡器(LFXT1、XT2、DCO)之一,或它们1/2/4/8分频后作为其信号源;SMCLK可以选择2个振荡器(XT2、DCO),或它们1/2/4/8分频后作为其信号源;ACLK只能由LFXT1时钟信号或1/2/4/8分频后作为其信号源。在 MSP430F249单片机的大部分内部设备中,都能选择上述3种时钟信号MCLK、SMCLK和ACLK作为时钟源并对上述时钟信号再进行1/2/4/8分频,应用极其灵活。
低频振荡器主要用来降低能量消耗(如使用电池供电的系统),高频振荡器用来对事件做出快速反应或者供CPU进行大量运算。我们可以根据需要选择合适的振荡器,也可以在不需要时关闭一些振荡器,节省功耗。
5.1 看门狗定时器
看门狗定时器WDT实际上是一个特殊的定时器,其主要功能是当单片机软件出现故障(例如外部干扰引起单片机程序跑飞或陷入死循环)时,能使系统重新启动。看门狗定时器的工作原理就是发生故障的时间满足规定的定时时间后,产生一个非屏蔽中断,使系统复位。当不使用看门狗功能时,看门狗定时器可以作为内部定时器使用。 1)看门狗模式
单片机系统上电后,WDT模块默认作为看门狗模式,默认使用内部时钟源DCOCLK,经过32768个时钟周期后(若DCOCLK为1MHz,则看门狗时间间隔约为32ms左右)系统复位。因此,用户使用时,一般在程序中先停止看门狗功能,然后根据要求配置好,再作为看门狗模式或者定时器模式使用。
作为看门狗模式使用时,通过编写程序使WDT的定时时间略大于程序循环执行一次的时间,并且程序执行过程中有对看门狗计数器清零的指令,使计数器重新计数,因此程序正常运行时,就会在WDT定时时间到之前对WDT清零(俗称定时喂狗),不会产生WDT溢出。如果由于干扰等原因使得程序跑飞,就不会在WDT定时时间到之前执行WDT清零指令,则WDT就会产生溢出,从而产生系统复位,CPU重新从头开始执行用户程序,这样程序就可以回到正常运行状态。
为了说明看门狗模式的工作原理,我们来分析下列程序片段:
void main(void) {
WDTCTL=WDTPW+WDTHOLD;//停止看门狗 初始化部分 while(1) {
WDTCTL=WDT_ARST_250;//看门狗模式,定时250ms 程序主体 …… }
1
}
程序说明:在while循环中,设置看门狗时间间隔为250ms(时钟源为ACLK),同时计数器清零,然后执行程序主体,如此反复执行。如果程序主体执行时间加上所有中断程序执行时间之和小于设定的看门狗时间间隔250ms,那么程序总是正常进行的;如果系统受到干扰,程序跑飞或陷入死循环,这时在250ms时间内执行不到WDTCTL=WDT_ARST_250指令,从而看门狗计数器没有被清零,看门狗计数器溢出WDTIFG标志置位,产生PUC复位信号,系统重新启动,这样系统就脱离了死循环状态。
WDTCTL为看门狗控制寄存器,参见3)看门狗定时器相关寄存器和msp430f249.h头文件。
msp430f249.h头文件在MSP430集成开发环境IAR软件安装目录下:D:\\Program Files\\IAR Systems\\Embedded Workbench 6.0 Evaluation\\430\\inc
/* The bit names have been prefixed with \#define WDTIS0 (0x0001u) #define WDTIS1 (0x0002u) #define WDTSSEL (0x0004u) #define WDTCNTCL (0x0008u) #define WDTTMSEL (0x0010u) #define WDTNMI (0x0020u) #define WDTNMIES (0x0040u) #define WDTHOLD (0x0080u) #define WDTPW (0x5A00u)
/* Watchdog mode -> reset after expired time */看门狗模式 /* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */ #define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms */ #define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms */ #define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms */ /* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms */ #define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms */ #define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms */ #define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms */
2)定时器模式
将WDTCTL寄存器的WDTTMSEL置位时,WDT则处于定时器模式。当设定的时间间隔一到,中断标志寄存器IFG1中的WDTIFG就会置位,系统复位PUC信号不会产生。如果中断允许寄存器IE1中的WDTIE位和状态寄存器SR中的GIE位都置位,则WDTIFG向CPU请求中断,进入中断服务程序后WDTIFG自动复位。如果未使用中断服务,WDTIFG也可以用软件复位。内部定时器模式与看门狗模式的中断矢量地址是不同的。改变定时器时间间隔时,应该用一条指令同时将WDTCNTCL置位,从而避免发生不期望的PUC复位。
3)看门狗定时器相关寄存器 控制寄存器WDTCTL
2
15~8 WDTPW 7 WDTHOLD 6 WDTNMIES 5 WDTNMI 4 WDTTMSEL 3 WDTCNTCL 2 WDTSSEL 1 0 WDTISx PUC 复位后WDTCTL=0x6900 WDTPW 看门狗定时器访问安全口令,读取时总为0x69,写入时必须为
0x5A,否则产生一个PUC信号。
WDTHOLD 看门狗暂停位,0 看门狗定时器正常工作;1 看门狗定时器停
止
WDTNMIES NMI边沿选择,0上升沿触发NMI中断;1下降沿触发NMI
中断
WDTNMIE 复位引脚和NMI选择,0 RST/NMI引脚为复位端;1 RST/NMI
引脚为边沿触发的非屏蔽中断输入。
WDTTMSEL 看门狗定时器模式选择,0看门狗模式;1 定时器模式 WDTCNTCL 计数器清零控制位,0 无作用;1 计数器清零,即WDTCNT=0 WDTSSEL 时钟源选择位,0 SMCLK; 1 ACLK WDTISx 时间间隔选择位,x=0、1 WDTIS1、频率 时钟源为1MHz时,看时钟源为32768Hz时,WDTIS 0 门狗的时间间隔 看门狗的时间间隔 00 时钟源/32768 32ms 1000ms 01 时钟源/8192 8ms 250ms 10 时钟源/512 0.5ms 16ms 11 时钟源/64 0.064ms 1.9ms 中断允许寄存器IE1(与看门狗有关的部分) 7 6 5 4 3 2 1 0 NMIIE WDTIE NMIIE NMI中断允许位,0中断禁止;1 中断允许 WDTIE 看门狗定时器中断允许位,0中断禁止;1 中断允许,用于定时
器模式,看门狗模式不需要中断允许。
中断标志寄存器 IFG1(与看门狗有关的部分) 7 6 5 4 3 2 1 0 NMIIFG WDTIFG NMIIFG NMI中断标志,0没有中断;1中断标志建立 WDTIFG 看门狗定时器中断标志,0没有中断;1中断标志建立
实例5-1 看门狗定时器的应用 任务要求:利用看门狗定时器产生设定的时间间隔中断,在中断服务程序中切换LED灯亮1s灭1s。
分析说明:看门狗定时器的时钟源只有SMCLK和ACLK两种,4种分频值,只能实现几种简单的定时间隔中断。
1)硬件电路设计
P1.0引脚接LED发光二极管,同时用虚拟示波器观察P1.0引脚电平变化。低频晶振LFXT1采用32768Hz的晶振,获得稳定的ACLK时钟源。硬件电路图如图5.1所示,XT2接8MHz晶振(XT2频率范围为400k~16MHz),两个22pF
3
匹配电容,供MCLK、SMCLK选用。一般发光二极管LED管压降约1.8~2.2v,电流5~10mA,因此限流电阻R1取300欧。
D1LED-BLUEABCDR1300U1121314151617181920212223242526272829303132333435P1.0/TACLK/CAOUTP1.1/TA0P1.2/TA1P1.3/TA2P1.4/SMCLKP1.5/TA0P1.6/TA1P1.7/TA2P4.0/TB0P4.1/TB1P4.2/TB2P4.3/TB3P4.4/TB4P4.5/TB5P4.6/TB6P4.7/TBCLK363738394041424344454647484950515960612345610711896462C1XT2OUT22pFP2.0/ACLK/CA2P5.0/UCB1STE/UCA1CLKP2.1/TAINCLK/CA3P5.1/UCB1SIMO/UCB1SDAP2.2/CAOUT/TA0/CA4P5.2/UCB1SOMI/UCB1SCLP2.3/CA0/TA1P5.3/UCB1CLK/UCA1STEP2.4/CA1/TA2P5.4/MCLKP2.5/ROSC/CA5P5.5/SMCLKP2.6/ADC12CLK/CA6P5.6/ACLKP2.7/TA0/CA7P5.7/TBOUTH/SVSOUTP3.0/UCB0STE/UCA0CLKP3.1/UCB0SIMO/UCB0SDAP3.2/UCB0SOMI/UCB0SCLP3.3/UCB0CLK/UCA0STEP3.4/UCA0TXD/UCA0SIMOP3.5/UCA0RXD/UCA0SOMIP3.6/UCA1TXD/UCA1SIMOP3.7/UCA1RXD/UCA1SOMIXT2OUTXT2INRST/NMITCKTDI/TCLKTDO/TDITMSMSP430F249P6.0/A0P6.1/A1P6.2/A2P6.3/A3P6.4/A4P6.5/A5P6.6/A6P6.7/A7/SVSINVEREF+VREF+VREF-/VEREF-XINXOUTAVCCAVSSX2C222pF8MHzXT2INXT2OUT52XT2IN535857555456X132768Hz 图5.1 实例5-1电路图 2)程序设计 看门狗定时器时钟源选用ACLK(32768Hz),分频系数为32768,得到1s定时时间间隔。P1.0引脚设置为输出方式,进入LPM3低功耗模式。 #include
WDTCTL = WDT_ADLY_1000; // 看门狗定时时间间隔为1s IE1 |= WDTIE; // 允许WDT中断 P1DIR |= 0x01; // P1.0输出
_BIS_SR(LPM3_bits + GIE); // 进入LPM3低功耗模式,总中断允许 }
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void) //看门狗中断服务程序 {
P1OUT ^= 0x01; // P1.0 取反 }
3)仿真与结果分析
双击msp430f249单片机,装载可执行文件Debug\\Exe\\WDT.hex,设置仿真参数MCLK=(Default),ACLK=32768Hz。运行后可以观察到LED灯亮1s灭1s;同时在示波器上观察到高电平1s、低电平1s的周期信号,如图5.2所示。
4
图5.2 实例5-1仿真结果图
5.2 定时器A
Msp430f249单片机的定时器A是具有3个捕获/比较寄存器的16位定时器/计数器。定时器A可以用来实现计数、延时、信号频率测量、信号触发检测、脉冲脉宽信号测量。定时器A还可以实现下列功能:
(1)PWM信号输出功能:通过设置TA的工作模式,结合CCR0、CCR1或CCR2计数,直接从CCR0、CCR1或CCR2中子模块的OUT.x端输出。
(2)Slope AD转换功能:利用定时器A与比较器A结合设计成斜边数模转换器。
(3)实现软USART功能:利用CCR0子模块中的捕获输入功能,结合TAR实现通用串行异步通讯功能(USART)。
(4)ADC12模块的采样信号:利用定时器的TAR或CCR0实现OUT.x输出得到ADC12模块所需要的采样触发信号。 定时器A的基本结构如图5.3所示。
在详细讲述定时器A的工作原理之前,我们先了解一下与定时器A有关的9个寄存器。定时器 A 主要资源有1个16位的定时计数器、1个控制寄存器、1个中断向量寄存器、3个可配置的捕获/比较控制寄存器和3个捕获/比较寄存器。以上定时器资源可作多种组合使用,以实现强大的功能。
5
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库MSP430F249的定时器计数器在线全文阅读。
相关推荐: