MSP430F249的定时器计数器

更新时间:2024-05-30 23:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第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 void main(void) {

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

图5.3 定时器A的基本结构

1. 定时器A寄存器

表5-1 定时器A的相关寄存器 序号 地址 简写 1 160H TACTL 2 162H TACCTL0 3 164H TACCTL1 4 166H TACCTL2 5 170H TAR 6 172H TACCR0 7 174H TACCR1 8 176H TACCR2 9 12EH TAIV 定时器A控制寄存器TACTL 15~10 9 8 7 6

寄存器名称 定时器A控制寄存器 捕获/比较控制寄存器 0 捕获/比较控制寄存器 1 捕获/比较控制寄存器 2 定时器A计数器 捕获/比较寄存器 0 捕获/比较寄存器 1 捕获/比较寄存器 2 中断向量寄存器 5 4 3 2 1 0 6

未用 TASSELx IDx MCx 未用 TASSELx 定时器时钟源选择(x=0、1) TASSEL1 TASSEL0 0 0 0 1 1 0 1 1 IDx

ID1、ID0 TACLR TAIE TAIFG 宏定义 TASSEL_0 TASSEL_1 TASSEL_2 TASSEL_3 时钟源 TACLK ACLK SMCLK INCLK 分频系数 直通 2分频 4分频 8分频 说明 外部引脚输入时钟 辅助时钟 子系统时钟 TACLK的反相信号 宏定义 ID_0 ID_1 ID_2 ID_3 分频系数 (x=0、1) 0 0 0 1 1 0 1 1

MCx 定时器模式选择(x=0、1) MC1、MC0 模式选择 说明 0 0 0 1 1 0 1 1 停止 增计数模式 连续计数模式 增减计数模式 计数值上限为TACCR0 计数值上限为FFFFH 计数值上限为TACCR0 宏定义 MC_0 MC_1 MC_2 MC_3

TACLR 定时器A清除位,该位置位将计数器TAR清零、分频系数清零、计数模式置为增计数模式。TACLR 由硬件自动复位,其读出始终为 0。定时器在下一个有效输入沿开始工作。

TAIE 定时器A中断允许位,0中断禁止;1中断允许

TAIFG 定时器A中断标志位,0没有中断;1中断标志建立。增计数模

式: 当定时器由 CCR0 计数到到 0 时,TAIFG 置位。连续计数模式:当定时器由 0FFFFH计数到 0 时,TAIFG 置位。增/减计数模式:当定时器由 CCR0 减计数到 0 时,TAIFG 置位。

定时器A的16位计数器 TAR 15~0 TARx 这是计数器的主体,内部可读写。如果要写入TAR计数值或用 TACLK 控制寄存器中的控制位来改变定时器工作(特别是修改输入选择位、输入分频器和定时器清除位时),修改时应先停止定时器,否则输入时钟和软件所用的系统时钟异步可能引起时间竞争,使定时器响应出错。

定时器A有3个捕获/比较模块,每个模块都有自己的控制寄存器 TACCTL0~2 捕获/比较控制寄存器TACCTLx (x=0、1、2) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 CMx CCISx SCS SCCI CAP OUTMODx CCIE CCI OUT COV CCIFG

7

CMx

捕获模式(x=0、1) CM1、CM0 捕获模式 00 01 10 11 禁止捕获 上升沿捕获 下降沿捕获 上升沿与下降沿都捕获 宏定义 CM_0 CM_1 CM_2 CM_3

CCIS

捕获/比较输入信号选择 CCIS1、CCIS0 输入信号选择 00 01 10 11 CCIxA(x=0、1、2) CCIxB(x=0、1、2) GND VCC 宏定义 CCIS_0 CCIS_1 CCIS_2 CCIS_3 同步捕获源选择,0异步捕获;1同步捕获。异步捕获模式允许在请求时立即将 CCIFG 置位和捕获定时器值,适用于捕获信号的周期远大于定时器时钟周期的情况。但是,如果定时器时钟和捕获信号发生时间竞争,则捕获寄存器的值可能出错。在实际中经常使用同步捕获模式,捕获事件发生时,CCIFG 置位和捕获定时器值将与定时器时钟信号同步。

SCCI 同步捕获/比较输入位,仅用于比较模式。比较相等信号 EQUx

将选择中的捕获、比较输入信号CCIx(CCIxA,CCIxB,VCC 和 GND)进行锁存,这样当计数器的值继续变化时,锁存器中的值仍然保持不变,然后可以通过 SCCI位读出。

CAP 模式选择位,0 比较模式;1 捕获模式。 OUTMODx 输出模式(x=0、1、2) 表5-2 输出模式 OUTMOD2 OUTMOD1 OUTMOD0 SCS

模式 名称 输出 置位 翻转/复位 置位/复位 翻转 复位 翻转/说明 宏定义 000 001 010 输出信号由TACCTLx的OUT决定 当计数值达到TACCRx寄存器中的值时,输出信号为高电平并保持,直到定时器复位 当计数值达到TACCRx寄存器中的值时,输出信号翻转;当计数值达到TACCR0寄存器中的值时,输出信号复位。 当计数值达到TACCRx寄存器中的值时,输出信号置位;当计数值达到TACCR0寄存器中的值时,输出信号复位。 当计数值达到TACCRx寄存器中的值时,输出信号翻转。 当计数值达到TACCRx寄存器中的值时,输出信号复位。 当计数值达到TACCRx寄存器中的值时,输出信号OUTMOD_0 OUTMOD_1 OUTMOD_2 011 OUTMOD_3 100 101 110 OUTMOD_4 OUTMOD_5 OUTMOD_6 8

置位 111 复位/置位 翻转;当计数值达到TACCR0寄存器中的值时,输出信号置位。 当计数值达到TACCRx寄存器中的值时,输出信号复位;当计数值达到TACCR0寄存器中的值时,输出信号置位。 OUTMOD_7 CCIE CCI OUT

捕获/比较中断使能位,0中断禁止;1 中断允许 捕获/比较输入位,用来读取选择的输入信号。

输出位,如果OUTMODx设为000时,那么由该位决定输出到OUTx的信号。0 输出低电平;1输出高电平。

COV 捕获溢出标志。当 CAP=1 时,选择捕获模式,如果捕获寄存器

的值被读出前再次发生捕获事件,则COV置位。读捕获寄存器时不会使溢出标志复位,须用软件复位。

CCIFG 捕获/比较中断标志位。捕获模式:寄存器 CCR0 捕获了定时器

TAR 值时置位。比较模式:定时器 TAR 值等于寄存器 CCR0 值时置位。

定时器A中断矢量寄存器 TAIV 15~4 3~1 0 0 TAIVx 0 中断矢量值确定申请TAIV中断的中断源,具体含义见表5-5 TAIVx TAIV的值 中断源 中断标志 中断优先级 000 0 没有中断 高 001 2 捕获/比较器1 TACCR1_CCIFG 010 4 捕获/比较器2 TACCR2_CCIFG 011 6 保留 100 8 保留 低 101 10 定时器溢出 TAIFG 110 12 保留 111 14 保留 2. 定时器工作原理

定时器的4种工作模式:

(1)停止模式:定时器停止工作。

(2)增计数模式:如果定时器原来处于停止模式,设置增计数模式会同时启动计数器TAR开始计数。当计数值达到TACCR0寄存器的值时,中断标志TACCR0_CCIFG置位。当下一个计数时钟到来时,计数器TAR的值变为0,重新开始新一轮计数。因此定时器的计数周期由TACCR0的值决定。由于必须用TACCR0寄存器存放计数的最大值,所以增计数模式比连续模式多占用了TACCR0寄存器。在增计数期间还可以设置 CCR1~2 来产生中断标记,产生PWM等信号。

(3)连续计数模式:连续计数模式与增计数模式的区别是连续模式不占用

9

TACCR0寄存器。当CCRx(x=0、1、2)寄存器的值与TAR的值相等时,若此时CCRx是处于中断允许的话,则产生相应的中断标志CCIFGx。而TAR的中断标志TAIFG位则在TAR计数值从FFFFH转为0时产生中断标志TAIFG。定时器A连续模式计数启动后,TAR的值开始从0--FFFFH--0--FFFFH...不断计重复计数,直至软件控制其停止计数为止。

(4)增减计数模式:增减计数模式也要用到TACCR0寄存器,定时器启动后,计数值先从0增加到TACCR0寄存器中的值,然后计数器又开始减少,减少到0后,计数器又递增,如此周而复始。在增减计数模式一个周期中,中断标志位TAIFG和TACCR0_CCIFG个置位一次。当计数值达到最大值TACCR0的值时,中断标志TACCR0_CCIFG置位;当计数值递减到0时,中断标志TAIFG置位。增减模式在定时器周期不是 0FFFFH 且需要产生对称的脉冲时使用。例如,两个输出驱动一个 H 桥时不能同时为高,增减模式支持在输出信号之间有死区时间的应用。

定时器工作原理说明:

(1)比较模式:这是定时器的默认模式。如果事先设置好定时器比较值TACCRx(x=0、1、2),并开启定时器中断,当TAR的值增到TACCRx的时候,中断标志位CCIFGx(x=0、1、2)置1,进入相应的中断服务程序。比较模式常用于产生PWM信号或设置给定时间间隔中断。

(2)捕获模式:当TACCTLx(x=0、1、2)控制寄存器中的CAP置位时,则相应的TACCRx处于捕获模式。捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC,可以利用外部信号的上升沿、下降沿或上升下降沿触发,完成捕获后相应的捕获标志位CCIFGx置1。当捕获事件发生时,硬件自动将计数器TAR的值拷贝到TACCRx寄存器中,同时中断标志CCIFGx置位。捕获模式主要用于测量脉冲周期、频率、速度等。

(3)输出模式:输出模式由 OUTMODx 位来确定,如表 5-2所示。模式0用于电平输出,由OUT位来控制TAx(x=0、1、2)管脚的高低电平输出;模式1和模式5为单脉冲输出,可以用来代替单稳态电路产生单脉冲波形;模式3和模式7用来产生脉宽调制信号(PWM信号);模式4为可变频率或移相输出;模式2和模式6为带死区的PWM模式,广泛用于逆变器、开关电源、变频调速和斩波器等高效率的功率变换应用场合。

图5.4 定时器A处于增计数模式

10

定时器工作模式说明:

(1)定时器A工作在增计数模式下,TACCR0作为周期寄存器,TACC1作为比较寄存器,不同的输出模式产生的输出波形如图5.4所示。

图5.5定时器A处于连续模式

(2)定时器A工作在连续模式下,TACCR0、TACCR1作为比较寄存器,不同的输出模式产生的输出波形如图5.5所示。

图5.6定时器A处于增减计数模式

(3)定时器A工作在增/减计数模式下,TACCR0作为周期寄存器,TACC1和TACC2作为比较寄存器,不同的输出模式产生的输出波形如图5.6所示。

定时器 A 的中断说明:

定时器 A 有2个中断向量,一个单独分配给捕获比较寄存器 CCR0,另一个作为共用的中断向量用于定时器溢出和其他的捕获比较寄存器(CCR1和CCR2)。

CCR0 中断向量具有最高的优先级,CCR0用于定义增计数和增减计数模式的周期。CCR0的中断标志TACCR0_CCIFG 在执行中断服务程序时能自动复位。 CCR1、CCR2 和定时器溢出共用另一个中断向量,属于多源中断,对应的中断标志为TACCR1_CCIFG、TACCR2_CCIFG和 TAIFG1,在读中断向量字 TAIV

11

后,自动复位。如果不访问 TAIV 寄存器,则不能自动复位,须用软件清除;如果相应的中断允许位为零(不允许中断),则将不会产生中断请求,但中断标志仍存在,这时须用软件清除。

实例5.2 定时器A定时1秒

任务要求:利用定时器A产生设定的时间间隔中断,在中断服务程序中切换LED灯的亮灭,亮1s灭1s。

分析说明:定时器A的时钟源可以选择为SMCLK、ACLK和外部引脚输入(TACLK、INCLK),一般选择为SMCLK和ACLK。ACLK为低频晶振32768Hz及1/2/4/8分频,定时器A可以再对ACLK进行1/2/4/8分频,定时器A的时基最小为1/32768秒(约30us),最大为64分频后即1.95ms,因此定时器A的定时范围为2s(对应时基30us)和128s(对应时基1.95ms)。SMCLK可选择XT2和内部DCO作为时钟源,若SMCLK选择XT2(例如8MHz),则定时器A的时基最小为0.125us,最大为64分频后即8us,因此定时器A的定时范围为8.19ms(对应时基0.125us)和524ms(对应时基8ms)。

总而言之,要求定时器时间间隔小于几百毫秒时,定时器A的时钟源采用SMCLK,SMCLK一般选取XT2作为时钟源;定时时间间隔几百毫秒至几十秒应采用ACLK(或者适当分频)作为定时器A的时钟源。

1)硬件电路设计

P1.0引脚接LED发光二极管,同时用虚拟示波器观察P1.0引脚电平变化。低频晶振采用32768Hz的晶振,获得稳定的ACLK时钟源。硬件电路图如图5-7所示,XT2接8MHz晶振(XT2频率范围为400k~16MHz),两个22pF匹配电容,供MCLK、SMCLK选用。一般LED发光二极管管压降1.8~2.2v,电流5~10mA,因此限流电阻取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.7 实例5.2电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。定时器A采用增计数模式,定时器A的时钟源为ACLK=32768Hz。时基单位为1/32768秒,设置CCR0 = 32768,则定时时间间隔1s。

12

#include void main(void) {

WDTCTL = WDTPW + WDTHOLD;// 停止看门狗 P1DIR |= 0x01; // P1.0输出

CCTL0 = CCIE; // CCR0中断允许 CCR0 = 32768; //定时时间间隔1s

TACTL = TASSEL_1 + MC_1; // 定时器A时钟源为ACLK,增计数模式 _BIS_SR(LPM0_bits + GIE); // LPM0模式,总中断允许 }

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void) //定时器A0中断服务程序 {

P1OUT ^= 0x01; // P1.0取反 }

3)仿真与结果分析

程序虽然很短,但是它包含了定时器的基本使用方法。使用定时器前,先设置好控制寄存器TACTL,时钟源选择、计数模式选择、中断允许和定时时间间隔CCR0的值。增计数模式,定时器A的计数值达到CCR0,TACCR0_CCIFG中断标志建立,CCR0中断为单源中断,CPU响应中断,进入定时器A0中断服务程序后自动清除中断标志TACCR0_CCIFG。在中断服务程序中,对P1.0取反,得到周期2s的信号,其中高电平1s,低电平1s,如图5.8所示。仿真时设置参数MCLK=(Default),ACLK=32768Hz。

图5.8 实例5.2仿真结果图

实例5.3 定时器A产生4路周期信号 任务要求:利用定时器A产生4路周期信号,周期分别为4s、2s、1s和0.25s,四路周期信号分别从P1.0和 P1.1~P1.4的A0~A3输出。

13

分析说明:定时器A有3个捕获\\比较寄存器CCR0、CCR1和CCR2。若设置定时器A工作在连续模式,利用3个比较器可以获得3路不同的周期信号,再利用定时器溢出中断可以再输出1路周期信号。因此,定时器A可以很方便的产生4路时间间隔不同的周期信号。 1)硬件电路设计 硬件电路如图5.9所示,用虚拟示波器观察P1.0~P1.3四路引脚电平变化。 D1LED-BLUER1300U112131415161718192021222324252627XT2OUT2829303132333435P1.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/TBCLK363738394041424344454647484950515960612345610711896462ABCDC120pFP2.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-XINXOUTAVCCAVSSX2C220pF8MHzXT2INXT2OUT52XT2IN535857555456X132768Hz 图5.9 实例5.3电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。定时器A采用连续模式,定时器A的时钟源为ACLK=32768Hz。时基单位为1/32768秒,设置CCR0 = 32768,则定时时间间隔1s(周期2s);CCR1 = 32768/2,则定时时间间隔0.5s(周期1s);CCR2 = 32768/8,则定时时间间隔0.125s(周期0.25s);定时器A溢出中断,定时时间间隔2s(周期4s)。

#include void main(void) {

WDTCTL = WDTPW + WDTHOLD; //停止看门狗

P1SEL |= 0x0E; // P1.1~P1.4功能选择 P1DIR |= 0x0F; // P1.0~P1.4输出

CCTL0 = OUTMOD_4 + CCIE; // CCR0翻转, 中断允许 CCTL1 = OUTMOD_4 + CCIE; // CCR1翻转, 中断允许 CCTL2 = OUTMOD_4 + CCIE; // CCR2翻转, 中断允许

TACTL = TASSEL_1 + MC_2 + TAIE; //定时器A时钟源为ACLK,连续模式, 中断允许 _BIS_SR(LPM0_bits + GIE); // LPM0模式,总中断允许 }

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A0 (void) //定时器A0中断服务程序 {

CCR0 += 32768; //周期2s }

#pragma vector=TIMERA1_VECTOR

__interrupt void Timer_A1(void)//定时器A1中断服务程序

14

{

switch( TAIV ) // TAIV中断矢量 {

case 2: CCR1 += 32768/2; //周期1s break;

case 4: CCR2 += 32768/8; //周期0.25s break;

case 10: P1OUT ^= 0x01; //溢出中断,周期4s break; } }

3)仿真与结果分析

仿真结果见图5.10所示,第1路信号周期为4s,定时器A溢出时间间隔为2s,在中断程序中对P1.0取反;第2路信号周期为2s,比较寄存器CCR0设置值为32768,1秒钟对TA0(P1.1)取反一次;第3路信号周期为1s,比较寄存器CCR1设置值为32768/2,0.5秒钟对TA1(P1.2)取反一次;第4路信号周期为0.25s,比较寄存器CCR2设置值为32768/8,0.125秒钟对TA2(P1.3)取反一次。

图5.10 实例5.3仿真结果图

实例5.4 定时器A产生两路PWM信号

任务要求:利用定时器A产生占空比75%和15%的两路PWM信号,周期均为20ms。

分析说明:定时器A有多种信号输出模式,其中输出模式3和模式7用来产生脉宽调制信号(PWM信号),在定时器A的增计数模式,用CCR0控制PWM信号的周期,CCR1、CCR2控制占空比,可以得到两路不同占空比的PWM信号。

1)硬件电路设计

硬件电路如图5.11所示。

15

D1LED-BLUER1300U112131415161718192021222324252627XT2OUT2829303132333435P1.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/TBCLK363738394041424344454647484950515960612345610711896462ABCDC120pFP2.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-XINXOUTAVCCAVSSX2C220pF8MHzXT2INXT2OUT52XT2IN535857555456X132768Hz 图5.11 实例5.4电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。SMCLK = XT2=8MHz,定时器A时钟源为SMCLK的8分频(即1MHz),增计数模式。时基单位1us,CCR0 = 20000,则定时时间间隔20ms(即PWM 周期=20ms)。两路PWM信号从P1.2(TA1)和P1.3(TA2)输出,设置CCR1=20000*75%=15000,则TA1的PWM信号占空比为75%,设置CCR2=20000*15%=3000,则TA2的PWM信号占空比为15%。

#include void main(void) {

WDTCTL = WDTPW + WDTHOLD; //停止看门狗

BCSCTL2 |= SELS; // SMCLK = XT2 BCSCTL2=DIVS0+DIVS1; //SMCLK 8分频 P1DIR |= 0x0C; // P1.2 和 P1.3输出

P1SEL |= 0x0C; // P1.2(TA1)和P1.3(TA2) 输出 CCR0 = 20000; // PWM 周期

CCTL1 = OUTMOD_7; // CCR1复位/置位

CCR1 = 15000; // CCR1 PWM 占空比75% CCTL2 = OUTMOD_7; // CCR2复位/置位

CCR2 = 3000; // CCR2 PWM 占空比15%

TACTL = TASSEL_2 + MC_1; // 定时器A时钟源为SMCLK,增计数模式 _BIS_SR(LPM0_bits); //进入低功耗LPM0 }

3)仿真与结果分析

仿真结果如图5.12所示,第3路信号为TA1输出的PWM信号,周期为20ms,占空比75%;第4路信号为TA2输出的PWM信号,周期为20ms,占空比15%;

16

图5.12 实例5.4仿真结果图

实例5.5 定时器A精确测量输入信号的周期 任务要求:利用定时器A精确测量某输入信号的周期,周期范围0~999999us。 分析说明:利用定时器A的脉冲捕获功能可以精确地测量外部输入信号的脉宽和周期。捕获模式测量输入信号的周期时,一般设置定时器A为连续模式,如果选定的引脚上出现设定的跳变沿(上升沿或者下降沿),那么定时器A的计数值被复制到TACCRx中,并且中断标志TACCIFGx置位。在捕获中断程序中读取捕获值,相邻两次捕获值之差就是信号周期。由于事件(上升沿或者下降沿)发生的随机性,注意在需要时使能溢出中断,在溢出中断中记录溢出发生次数,周期=65536x溢出次数+两次捕获值之差。

1)硬件电路设计

低频晶振采用32768Hz的晶振,XT2接8MHz晶振(XT2频率范围为400k~16MHz),两个22pF匹配电容,供SMCLK选用。显示使用6位LED共阳极模块,单片机P4口输出每位数码管的段码,P5口的P5.0~P5.5输出位码。输入信号源采用虚拟仪器中的信号发生器。硬件电路图如图5.13所示。

17

7SEG-MPX6-CA-BLUEP40P41P42P43P44P45P46P47P50P51P52P53P54P55U1+AMFM-12131415161718192021222324252627282930313233343552535857555456P1.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/TBCLK363738394041424344454647484950515960612345610711896462P40P41P42P43P44P45P46P47P50P51P52P53P54P55SIGNAL GENERATORP2.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-XINXOUTAVCCAVSSC1XT2OUT20pFX2C220pF8MHzXT2INX132768Hz 图5.13 实例5.5的硬件电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。SMCLK = XT2=8MHz,定时器A时钟源为SMCLK的8分频(即1MHz),连续计数模式。 定时器A使用捕获模式测量信号周期时,可以让主计数器TAR工作在连续计数模式。捕获模块设置TAx(x=0~2)管脚上升沿触发,每次捕获事件发生后,在捕获中断程序中读取捕获值,相邻两次捕获值之差就是信号周期。对于计数值溢出的情况,可以在溢出中断程序中记录溢出次数,扩展周期信号的测量范围。 #include

#define NUM 16 //测量次数 unsigned int new_cap=0; unsigned int old_cap=0;

char N1; //溢出次数 long diff[NUM]; // 周期测量值 char index=0;

long data; //计算测量周期的平均值

char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,

0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff};//共阳极数码管 char position[]={0x20,0x10,0x08,0x04,0x02,0x01};//位码 char led_buf[] = {0,0,0,0,0,0}; //显示缓冲区

void data_to_buf(long data1) // 值送显示缓冲区函数 {

char i;

for (i=0;i<6;i++) {

led_buf[i] = data1; //低位在前 data1=data1/10; }

18

}

void disp(void) // 动态扫描显示函数 {

char i;

unsigned int k; for(i=0;i<6;i++) {

P4OUT = led[led_buf[i]]; P5OUT = position[i]; //if(i==3)

//P4OUT &=0X7F; //小数点

for ( k=0; k<600; k++); // 延时 P5OUT = 0X00; //关显示 } }

void main(void) {

char k1;

WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 BCSCTL2 |= SELS; // SMCLK = XT2 BCSCTL2=DIVS0+DIVS1; //SMCLK 8分频 P4DIR=0xFF; //设置P4口为输出 P5DIR=0xFF; //设置P5口为输出

P1SEL = 0x02; //设置 P1.1(TA0)为输入信号管脚 CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE;

// 上升沿捕获+ CCI0A (P1.1)输入+捕获模式+中断允许

TACTL = TASSEL_2 + MC_2+ TAIE; //TA时钟源为SMCLK+连续模式+中断允许

_EINT(); //总中断允许 while(1) {

if(index==0) //多次测量周期值后,取平均值并更新数据 {

data=0;

for(k1=0;k1

data_to_buf(data); //数据送显示缓冲区 disp(); // 动态扫描显示程序 } }

#pragma vector=TIMERA0_VECTOR

19

__interrupt void TimerA0(void) //TA0捕获中断服务程序 {

new_cap = TACCR0;

diff[index] = 65536*N1+new_cap-old_cap; //计算周期值 index++;

if (index ==NUM) index = 0;

old_cap = new_cap; // 保存捕获值 N1=0; //溢出次数清零 }

#pragma vector=TIMERA1_VECTOR

__interrupt void Timer_A1(void) //TA中断服务程序 {

switch( TAIV ) {

case 2: break; case 4: break;

case 10: N1++; break; //溢出次数加1 } }

3)仿真结果与分析

图5.14 实例5.5仿真结果图

输入信号50Hz,测量的周期信号显示为20000us;调整输入信号为5Hz,显示为200000us;多调整几次输入信号周期,可以看出测试结果正确。

5.3 定时器B

MSP430F249单片机的定时器B是具有7个捕获/比较寄存器的16位定时器/计数器。TB 可以支持捕获/比较功能、PWM 输出和定时器功能,TB 的捕获比较寄存器是双缓冲结构,定时器B比定时器A使用更为灵活。

20

定时器B与定时器A的大多数功能相同,它们的主要区别如下:定时器B的长度是可编程的,可编程为8,10,12,16位;定时器B的TBCCRx(x=0~6)寄存器是双缓冲的,并可以成组工作;所有定时器B的输出可以为高阻抗状态;SCCI位功能在定时器B中不存在。定时器B的结构示意图如图5.15所示。

图5.15 定时器B的结构示意图

定时器 B 可以通过 CNTL0、CNTL1 位将它配置为 8,10,12 或 16 位定时器,相应的最大计数数值分别为0FFh,03FFh,0FFFh和0FFFFh。在 8,10和 12位模式下,对 TBR 写入数据时,数据的高4位必须为0。

时钟源的选择和分频:定时器的时钟源可以是内部时钟源 ACLK, SMCLK,或外部源 TBCLK 和 INCLK。时钟源由 TBSSEL0、TBSSEL1位来选择,所选择的时钟可以通过 ID0、ID1 位进行 2、4、8 分频,当 TBCLR 置位时,分频器复位。

定时器可以通过以下 2 种方式启动或重新启动: (1)当定时器B的TBCTL寄存器中的MCx>0 并且时钟源处于活动状态时。

21

(2)当定时器模式为 up 或 up/down 模式时(即单调增和增减模式),定时器可以通过写 0到 TBCLR来停止计数。定时器可以通过写一个非 0 的数值来重新开始计数。在这种情况下,定时器从0 开始增计数。

捕获比较寄存器TBCCRx(x=1~6)中的 CCIFG 和 TBIFG 标志共用一个中断向量(不包括 TBCCR0_CCIFG)。中断向量寄存器 TBIV 用于确定它们中的哪个中断要求得到响应。最高优先级的中断(不包括 TBCCR0_CCIFG,TBCCR0单独使用一个中断向量)在 TBIV 寄存器中产生一个数字(见寄存器说明),这个数字是规定的数字,可以在程序中识别并自动进入相应的子程序。禁止定时器 B 中断不会影响 TBIV 的值。 表5-1 定时器B的相关寄存器 序号 地址 简写 寄存器名称 1 0180h TBCTL 定时器B控制寄存器 2 0182h TBCCTL0 捕获/比较控制寄存器 0 TBCCTL1 3 0184h 捕获/比较控制寄存器1 4 0186h TBCCTL2 捕获/比较控制寄存器2 5 0188h TBCCTL3 捕获/比较控制寄存器3 6 018Ah TBCCTL4 捕获/比较控制寄存器4 TBCCTL5 7 018Ch 捕获/比较控制寄存器5 TBCCTL6 018Eh 8 捕获/比较控制寄存器6 9 0190h TBR 定时器B计数器 TBCCR0 10 0192h 捕获/比较寄存器 0 11 0194h TBCCR1 捕获/比较寄存器1 12 0196h TBCCR2 捕获/比较寄存器2 13 0198h TBCCR3 捕获/比较寄存器3 TBCCR4 14 019Ah 捕获/比较寄存器4 TBCCR5 15 019Ch 捕获/比较寄存器5 TBCCR6 019Eh 16 捕获/比较寄存器6 TBIV 011Eh 17 TB中断向量寄存器 定时器B控制寄存器TBCTL 15 14~13 12~11 10 9~8 7~6 5~4 3 2 1 0 — TBCLGRPx CNTLx — TBSSELx IDx MCx — TBCLR TBIE TBIFG TBCLGRPx 比较寄存器成组控制 TBCLGRP1 说明 TBCLGRP0 00 01 每个 TBCLx 锁存器独立加载 TBCL1+TBCL2 (TBCCR1 CLLDx 位控制更新) TBCL3+TBCL4 (TBCCR3 CLLDx bits位控制更新) TBCL5+TBCL6 (TBCCR5 CLLDx bits位控制更新) TBCL0 单独更新 TBCL1+TBCL2+TBCL3 (TBCCR1 CLLDx bits位控制更新) TBCL4+TBCL5+TBCL6 (TBCCR4 CLLDx bits位控制更新) TBCL0 独立更新 宏定义 TBCLGRP_0 TBCLGRP_1 10 TBCLGRP_2 22

11 TBCL0+TBCL1+TBCL2+TBCL3+TBCL4+TBCL5+TBCL6 (TBCCR1 CLLDx bits位控制更新) TBCLGRP_3 CNTLx 计数长度选择 CNTL1、CNTL0 0 0 0 1 1 0 1 1 计数长度 16 12 10 8 TBR最大值 宏定义 0FFFFh CNTL_0 0FFFh CNTL_1 03FFh CNTL_2 0FFh CNTL_3 TASSELx 定时器时钟源选择 TBSSEL1、TBSSEL1 时钟源 0 0 0 1 1 0 1 1 IDx 分频系数 ID1、ID0 说明 外部引脚输入时钟 辅助时钟 子系统时钟 TBCLK的反相信号 宏定义 ID_0 ID_1 ID_2 ID_3 宏定义 TBSSEL_0 TBSSEL_1 TBSSEL_2 TBSSEL_3 TBCLK ACLK SMCLK INCLK 分频系数 直通 2分频 4分频 8分频 00 01 10 11

MCx 定时器模式选择 MC1、MC0 模式选择 00 01 10 11 停止 增计数模式 连续计数模式 增减计数模式 说明 计数值上限为TBCCR0 计数值上限为TBmax 计数值上限为TBCCR0 宏定义 MC_0 MC_1 MC_2 MC_3

TBCLR 定时器B清除位,若该位置位将计数器TBR清零、分频系数清零、计数模式置为增计数模式。TBCLR 由硬件自动复位,其读出始终为 0。定时器在下一个有效输入沿开始工作。

TBIE 定时器B中断允许位,0中断禁止;1中断允许

TBIFG 定时器B中断标志位,0没有中断;1中断标志建立。增计数模式: 当定时器由 CCR0 计数到到 0 时,TBIFG 置位。连续计数模式:当定时器由 0FFFFH 计数到 0 时,TBIFG 置位。增/减计数模式:当定时器由 CCR0 减计数到 0 时,TBIFG 置位。

定时器B的16位计数器 TBR 15~0 TBRx 这是计数器的主体,内部可读写。如果要写入TBR计数值或用 TBCLK 控制寄

23

存器中的控制位来改变定时器工作(特别是修改输入选择位、输入分频器和定时器清除位时),修改时应先停止定时器,否则输入时钟和软件所用的系统时钟异步可能引起时间竞争,使定时器响应出错。

定时器B有7个捕获/比较模块,每个模块都有自己的控制寄存器 TBCCTL0~6

捕获/比较控制寄存器TBCCTLx (x=0~6) 15 14 13 12 11 10~9 8 7 6 5 4 3 2 1 0 CMx CCISx SCS CLLDx CAP OUTMODx CCIE CCI OUT COV CCIFG CMx 捕获模式(x=0、1) CM1、CM0 捕获模式 禁止捕获 上升沿捕获 下降沿捕获 上升沿与下降沿都捕获 宏定义 CM_0 CM_1 CM_2 CM_3 00 01 10 11

CCIS 捕获/比较输入信号选择 CCIS1、CCIS0 输入信号选择 CCIxA(x=0、1、2) CCIxB(x=0、1、2) GND VCC 宏定义 CCIS_0 CCIS_1 CCIS_2 CCIS_3 00 01 10 11 SCS 同步捕获源选择,0异步捕获;1同步捕获。 异步捕获模式允许在请求时立即将 CCIFG 置位和捕获定时器值,适用于捕获信号的周期远大于定时器时钟周期的情况。但是,如果定时器时钟和捕获信号发生时间竞争,则捕获寄存器的值可能出错。在实际中经常使用同步捕获模式,捕获事件发生时,CCIFG 置位和捕获定时器值将与定时器时钟信号同步。

CLLDx 比较锁存加载,该位选择比较锁存加载事件 CLLD1、CLLD0 说明 00 01 10 11

宏定义 CLLD_0 CLLD_1 CLLD_2 CLLD_3 TBCCRx 写入时,TBCLx加载(x=0~6) TBR计数到0时,TBCLx加载 TBR计数到0时,TBCLx加载(增模式或连续模式时) TBR计数到TBCL0或0时,TBCLx加载(增减模式) TBR计数到TBCLx时,TBCLx加载 CAP 模式选择位,0 比较模式;1 捕获模式 OUTMODx 输出模式(x=0、1、2) OUTMOD2 OUTMOD1 OUTMOD0 模式 名称 输出 说明 宏定义 000

输出信号由TACCTLx的OUT决定 OUTMOD_0 24

001 010 置位 翻转/复位 置位/复位 翻转 复位 翻转/置位 复位/置位 当计数值达到TACCRx寄存器中的值时,输出信号为高电平并保持,直到定时器复位 当计数值达到TACCRx寄存器中的值时,输出信号翻转;当计数值达到TACCR0寄存器中的值时,输出信号复位。 当计数值达到TACCRx寄存器中的值时,输出信号置位;当计数值达到TACCR0寄存器中的值时,输出信号复位。 OUTMOD_1 OUTMOD_2 011 OUTMOD_3 100 101 110 当计数值达到TACCRx寄存器中的值时,输出信号OUTMOD_4 翻转。 当计数值达到TACCRx寄存器中的值时,输出信号复位。 当计数值达到TACCRx寄存器中的值时,输出信号翻转;当计数值达到TACCR0寄存器中的值时,输出信号置位。 当计数值达到TACCRx寄存器中的值时,输出信号复位;当计数值达到TACCR0寄存器中的值时,输出信号置位。 OUTMOD_5 OUTMOD_6 111 OUTMOD_7 CCIE 捕获/比较中断使能位,0中断禁止;1 中断允许 CCI 捕获/比较输入位,用来读取选择的输入信号。

OUT 输出位,如果OUTMODx设为000时,那么由该位决定输出到OUTx的信号。0 输出低电平;1输出高电平

COV 捕获溢出标志。当 CAP=1 时,选择捕获模式,如果捕获寄存器的值被读出前再次发生捕获事件,则COV置位。读捕获寄存器时不会使溢出标志复位,须用软件复位。

CCIFG 捕获/比较中断标志位。捕获模式:寄存器 CCRx 捕获了定时器 TAR 值时置位。比较模式:定时器 TAR 值等于寄存器 CCRx 值时置位。

定时器B中断矢量寄存器 TBIV 15~4 3~1 0 0 TBIVx 0 中断矢量值确定申请TBIV中断的中断源,具体含义见表5.5 TBIVx TBIV的值 中断源 中断标志 中断优先级 000 0 没有中断 高 001 2 捕获/比较器1 TBCCIFG1 010 4 捕获/比较器2 TBCCIFG2 011 6 捕获/比较器3 TBCCIFG3 100 8 捕获/比较器4 TBCCIFG4 101 10 捕获/比较器5 TBCCIFG5 110 12 捕获/比较器6 TBCCIFG6

25

111

14 定时器溢出 TBIFG 低 实例5-6定时器B产生8路周期信号

任务要求:利用定时器B产生8路周期信号,周期分别为4s、2s、1s、0.5s、0.25s、0.125s、0.0625s和0.03125s,8路周期信号分别从P1.0和 P2.0~P2.6的TB0~TB6输出。

分析说明:定时器B有7个捕获\\比较寄存器TBCCR0~6。若设置定时器B工作在连续模式,利用7个比较器可以获得7路不同的周期信号,再利用定时器溢出中断可以再输出1路周期信号。因此,定时器B可以很方便的产生8路时间间隔不同的周期信号。

1)硬件电路设计

MSP430F249的低频晶振为32768Hz,为ACLK提供精确时钟,定时器B采用ACLK作为时钟源,最大定时时间间隔2s(时钟不分频)和128s(时钟64分频)。8路周期信号分别从P1.0和 P2.0~P2.6的TB0~TB6输出,采用两个虚拟示波器观察,硬件电路如图5.16所示。 AD1LED-BLUER1300U112131415161718192021222324252627XT2OUT2829303132333435P1.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/TBCLK363738394041424344454647484950515960612345610711896462BCDABCDC120pFP2.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-XINXOUTAVCCAVSSX2C220pF8MHzXT2INXT2OUT52XT2IN535857555456X132768Hz 图5.16 实例5.6硬件电路图 2)程序设计 MSP430F249单片机的程序运行主时钟MCLK= DCO=1.1MHz。定时器B采用连续模式,定时器B的时钟源为ACLK=32768Hz。时基单位为1/32768秒,设置TBCCR0~TBCCR6为适当的初始值,可以得到要求的周期信号输出。利于定时器B的溢出中断,可以得到周期4s的信号输出。

#include void main(void) {

WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 P1DIR |= 0x01; //P1.0输出 P4SEL = 0xFF; // P4功能选择 P4DIR = 0xFF; // P4输出

TBCCTL0 = OUTMOD_4 + CCIE; // CCR0翻转, 中断允许

26

TBCCTL1 = OUTMOD_4 + CCIE; // CCR1翻转, 中断允许 TBCCTL2 = OUTMOD_4 + CCIE; // CCR2翻转, 中断允许 TBCCTL3 = OUTMOD_4 + CCIE; // CCR3翻转, 中断允许 TBCCTL4 = OUTMOD_4 + CCIE; // CCR4翻转, 中断允许 TBCCTL5 = OUTMOD_4 + CCIE; // CCR5翻转, 中断允许 TBCCTL6 = OUTMOD_4 + CCIE; // CCR6翻转, 中断允许 TBCTL = TBSSEL_1 + MC_2 + TBIE;

// 定时器B时钟源为ACLK,连续模式, 中断允许

_BIS_SR(LPM0_bits + GIE); // LPM0模式,总中断允许 }

#pragma vector=TIMERB0_VECTOR

__interrupt void Timer_B0 (void) //定时器B0中断服务程序 {

TBCCR0 += 32768; //周期2s }

#pragma vector=TIMERB1_VECTOR

__interrupt void Timer_B(void) //定时器B1中断服务程序,TBIV中断矢量 {

switch( TBIV ) {

case 2: TBCCR1 += 32768/2; //周期1s break;

case 4: TBCCR2 += 32768/4; //周期0.5s break;

case 6: TBCCR3 += 32768/8; //周期0.25s break;

case 8: TBCCR4 += 32768/16; //周期0.125s break;

case 10: TBCCR5 += 32768/32; //周期62.5ms break;

case 12: TBCCR6 += 32768/64; //周期31.25ms break;

case 14: P1OUT ^= 0x01; // 溢出中断,周期4s break; } }

3)仿真与结果分析

27

图5.17 实例5.6仿真结果(一)

图5.18 实例5.6仿真结果(二)

实例5-7定时器B产生6路PWM信号

任务要求:利用定时器B产生6路PWM信号,周期为20ms,占空比分别为90%、80%、70%、60%、50%和10%。

分析说明:定时器B有多种信号输出模式,其中输出模式3和模式7用来产生脉宽调制信号(PWM信号),在定时器B的增计数模式,用TBCCR0控制PWM信号的周期,TBCCR1~6控制占空比,可以得到6路不同占空比的PWM信号。

1)硬件电路设计

硬件电路如图5.19所示,采用两个虚拟示波器观察6路PWM信号。

28

AU11213141516171819202122232425P1.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/TBCLK3637383940414243444546474849BCDABCDP2.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/SMCLKC126P2.6/ADC12CLK/CA6P5.6/ACLK5027P2.7/TA0/CA7P5.7/TBOUTH/SVSOUT51XT2OUT28P3.0/UCB0STE/UCA0CLKP6.0/A05920pF29P3.1/UCB0SIMO/UCB0SDAP6.1/A160X230P3.2/UCB0SOMI/UCB0SCLP6.2/A26131C28MHzP3.3/UCB0CLK/UCA0STEP6.3/A3232P3.4/UCA0TXD/UCA0SIMOP6.4/A43XT2IN33P3.5/UCA0RXD/UCA0SOMIP6.5/A5434P3.6/UCA1TXD/UCA1SIMOP6.6/A6520pF35P3.7/UCA1RXD/UCA1SOMIP6.7/A7/SVSIN6XT2OUT52XT2IN53XT2OUTVEREF+1058XT2INVREF+7X157RST/NMIVREF-/VEREF-1155TCKXIN854TDI/TCLKXOUT956TDO/TDIAVCC646232768HzTMSAVSSMSP430F249 图5.19 实例5.7硬件电路图 2)程序设计 #include void main(void) { WDTCTL = WDTPW + WDTHOLD; //停止看门狗

BCSCTL2=SELS+DIVS0+DIVS1; //SMCLK = XT2,SMCLK 8分频 P4DIR |= 0x7e; // P4.1 - P4.6 输出

P4SEL |= 0x7e; // P4.1 - P4.6 TBx(x=1~6)输出 TBCCR0 = 20000; // PWM 信号周期 TBCCTL1 = OUTMOD_7; // CCR1 输出模式7 TBCCR1 = 18000; //占空比90% TBCCTL2 = OUTMOD_7;

TBCCR2 = 16000; //占空比80% TBCCTL3 = OUTMOD_7;

TBCCR3 = 14000; //占空比70% TBCCTL4 = OUTMOD_7;

TBCCR4 = 12000; //占空比60% TBCCTL5 = OUTMOD_7;

TBCCR5 = 10000; //占空比50% TBCCTL6 = OUTMOD_7;

TBCCR6 = 2000; //占空比10%

TBCTL = TBSSEL_2 + MC_1; // SMCLK, 连续计数模式 _BIS_SR(CPUOFF); // Enter LPM0 }

3)仿真结果与分析

29

图5.20 实例5.7仿真结果(一)

图5.21 实例5.7仿真结果(二)

实例5.8定时器B精确测量某输入信号的脉冲宽度

任务要求:利用定时器B精确测量某输入信号的脉冲宽度,脉冲宽度范围0~999999us。

分析说明:利用定时器B的脉冲捕获功能可以精确地测量外部输入信号的脉冲宽度。捕获模式测量输入信号的脉宽时,一般设置定时器B为连续模式,可以先设置捕获模式为上升沿触发,在捕获到的上升沿中断程序里记下TBCCRx(x=0~6)的值;再将捕获模式设置为下降沿触发,在捕获到的下降沿中断程序里记下TBCCRx(x=0~6)的值,两者之差就是输入信号高电平的脉冲宽度。由于事件(上升沿或者下降沿)发生的随机性,注意使能溢出中断,在溢出中断中记录溢出发生次数,脉冲宽度=65536x溢出次数+两次捕获值之差。

1)硬件电路设计

硬件电路参见图5.23所示。

2)程序设计

受到简短的 C 语言入门程序范例的影响,初学初学者往往将所有的代码都写在一个 C文件中。这是一种非常坏的习惯。当程序逐渐变长,只要超过几个屏幕长度,会发现编辑、查找和调试都将变得非常困难。而且这种代码很难用在

30

别的项目中,除非仔细地理顺函数关系,然后寻找并复制每一段函数。

合理的方法是将一个大程序划分为若干个小的 C 文件。在单片机程序中,最常用的划分方法是按硬件功能划分,将每个功能模块做成独立的 C 文件。例如一个项目中会用到定时器B、16 位 AD 转换器、LCD 显示、键盘,可以划分为 4 个文件:TB.C、ADC16.C、LCD.C、Key.C。属于每个功能模块的函数写在相应的文件中,然后在相应头文件中声明对外引申的函数与全局变量。

做好文件划分和管理之后,每个文件都不会很长,如果需要修改或调试某个函数,打开相应模块的 C 文件,很容易找到。打开相应的头文件还可查看函数列表。这些代码还能被重复使用。假设另一项目也用到 LCD 显示器,只要把 LCD.C 和 LCD.h 文件复制并添加到新工程内即可调用各种 LCD 显示函数,避免了重复劳动。

Main.c主文件

#include #include \#define M1 10

unsigned int cap1,N1;

long width[10]={0,0,0,0,0,0,0,0,0,0}; char m=0;

char led_buf[] = {0,0,0,0,0,0}; //显示缓冲区 long data;

const char table[]=\const char table1[]=\

void data_to_buf(unsigned long data2) // 值送显示缓冲区函数 {

unsigned char i; for (i=0;i<6;i++) {

led_buf[i] = table[data2];//低位在前 data2=data2/10; }

for(i=5;i>0;i--)

{if(led_buf[i]=='0')

led_buf[i]=' ';//数字前面的零不显示 else break; } }

void main() {

char num, k1;

WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 BCSCTL2 = SELS+DIVS0+DIVS1; // SMCLK = XT2

P4SEL|=0x01; //P4.0作为捕获模块功能的输入端输入方波 P5DIR=0xFF; //设置P5口为输出

31

P6DIR=0xFF; //设置P6口为输出 lcdinit();

// TBCCTL0=0; // 捕获源为P4.0,即CCI0A(也是CCI0B)

TBCCTL0|=CM_1+SCS+CAP+CCIE; //上升沿捕获,同步捕获,工作在捕获模式+中断允许 TBCTL|=TBSSEL_2+MC_2+ TBIE; //选择时钟SMCLK+连续计数模式+中断允许 write_com(0x80); // 显示第一行字 for(num=0;num<10;num++) write_data(table1[num]); _EINT();

while(1) {

data=0;

for(k1=0;k1

data_to_buf(data); //数据送显示缓冲区 write_com(0x80+0x40); // 第二行显示频率 for(num=0;num<6;num++)

write_data(led_buf[5-num]); } } }

#pragma vector=TIMERB0_VECTOR

__interrupt void TimerB0(void)//定时器TB的CCR0的中断:用于检测脉冲上升与下降沿 {

if(TBCCTL0&CM1) //捕获到下降沿 {

width[m++]=65536*N1+TBCCR0-cap1; //记录下结束时间 N1=0;

TBCCTL0=CM_1+SCS+CAP+CCIE;//+TBCLR; //改为上升沿捕获:CM1置0,CM0置1

if(m==M1) m=0; }

else if(TBCCTL0&CM0) //捕获到上升沿 { cap1=TBCCR0; N1=0;

TBCCTL0=CM_2+SCS+CAP+CCIE;//+TBCLR; //改为下降沿捕获:CM0置0,CM1置1

} }

32

// Timer_B7 Interrupt Vector (TBIV) handler #pragma vector=TIMERB1_VECTOR __interrupt void Timer_B(void) {

switch( TBIV ) {

case 14: N1++; break; // 溢出 } }

Lcd.c文件

#include

#define lcdrs_0 P6OUT&=~BIT0;//P6.0=0 命令 #define lcdrs_1 P6OUT|=BIT0;//P6.0=1 数据

#define lcden_0 P6OUT&=~BIT2;//P6.2=0 关闭 LCD 使能 #define lcden_1 P6OUT|=BIT2;//P6.2=1 打开 LCD 使能

void delay(unsigned int z) {

unsigned int i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); }

void write_com(char com) // 写入 {

lcdrs_0; //LCD 选择输入命令

P5OUT=com; // 向 P0 口输入命令 delay(5); // 延时

lcden_1; // 打开 LCD 使能 delay(5); // 一个高脉冲 lcden_0; // 关闭 LCD 使能 }

void write_data(char dataout) {

lcdrs_1; // 设置为输入数据

P5OUT=dataout; // 将数据赋给 P0 口 delay(5); // 延时 lcden_1; // 置高 delay(5); // 高脉冲

lcden_0; // 置低 完成高脉冲 }

void lcdinit() {

lcden_0;

write_com(0x38); // 设置 16x2 显示 5x7 点阵, 8 位数据接口

33

write_com(0x0c); // 设置开始显示 不显示光标 write_com(0x06); // 写一个字符后地址指针加 1 write_com(0x01); // 显示清零 数据指针清零 }

Lcd.h头文件

extern void delay(unsigned int z); extern void write_com(char com); extern void write_data(char dataout); extern void lcdinit();

3)仿真与结果分析

图5.22 输入信号参数设置

34

LCD1LM016LVSSVDDVEERSRWE456RSEN123P50P51P52P53P54P55P56P577891011121314D0D1D2D3D4D5D6D7U112131415161718192021222324252627P1.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/TBCLK363738394041424344454647484950515960612345610711896462P50P51P52P53P54P55P56P57RSP61ENP63P64P65P66P67U1(P4.0/TB0)P2.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-XINXOUTAVCCAVSSC1XT2OUT20pFX2C220pF8MHzXT2IN282930313233343552535857555456X132768Hz 图5.23 实例5.5仿真结果图

第5章思考题与练习

1. msp430f249定时/计数器的时钟源有哪些?预分频器的作用是什么? 2. msp430f249定时/计数器的定时范围是多少?

3. 在msp430f249单片机中,假设SMCLK=8MHz,ACLK=32768Hz。要求编程实现为定时器A配置时钟源和工作模式,从P1.0输出周期1s的方波信号,无需CPU干预。

4. 编程实现使用msp430f249的定时/计数器产生周期50ms、占空比30%的PWM信号,并在proteus上完成仿真。

5. 使用定时器A对外部输入的脉冲信号进行计数,当计满100次时,定时器A暂停计数且蜂鸣器响1s,然后定时器A又从0开始计数,两位LED数码管能够实时显示当前计数值。

6. 设计一个30s倒计时器,用两位数码管显示,要求使用定时器B作为秒计时器。

7. 使用定时器B设计一个分频器,用两位数码管显示分频系数,按K1键分频系数递增,按K2键分频系数递减,分频值1~10。

8. 使用定时器B设计一个占空比可调的PWM信号发生器,按K1键占空比以10%递增,按K2键占空比以10%递减。

35

本文来源:https://www.bwwdw.com/article/riz6.html

Top