MSP程序库十一定时器TA的PWM输出_第1页
MSP程序库十一定时器TA的PWM输出_第2页
MSP程序库十一定时器TA的PWM输出_第3页
MSP程序库十一定时器TA的PWM输出_第4页
MSP程序库十一定时器TA的PWM输出_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MSP430程序库<十一>定时器TA的PWM输出 定时器是单片机常用的其本设备,用来产生精确计时或是其他功能;msp430的定时器不仅可以完成精确定时,还能产生PWM波形输出,和捕获时刻值(上升沿或是下降沿到来的时候)。这里完成一个比较通用的PWM波形产生程序。1. 硬件介绍:MSP430系列单片机的TimerA结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电表和手持式仪表的理想配置。它给开发人员提供了较多灵活的选择余地。当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM,而不需利用中断维持PWM输出。MSP430F16x和MSP430F14x

2、单片机内部均含有两个定时器,TA和TB;TA有三个模块,CCR0-CCR2;TB含有CCR0-CCR67个模块;其中CCR0模块不能完整的输出PWM波形(只有三种输出模式可用);TA可以输出完整的2路PWM波形;TB可以输出6路完整的PWM波形。定时器的PWM输出有有8种模式:输出模式0  输出模式:输出信号OUTx由每个捕获/比较模块的控制寄存器CCTLx中的OUTx位定义,并在写入该寄存器后立即更新。最终位OUTx直通。 输出模式1 置位模式:输出信号在TAR等于CCRx时置位,并保持置位到定时器复位或选择另一种输出模式为止。 输出模式2 PWM翻转/复位模式

3、:输出在TAR的值等于CCRx时翻转,当TAR的值等于CCR0时复位。 输出模式3 PWM置位/复位模式:输出在TAR的值等于CCRx时置位,当TAR的值等于CCR0时复位。 输出模式4 翻转模式:输出电平在TAR的值等于CCRx时翻转,输出周期是定时器周期的2倍。 输出模式5复位模式:输出在TAR的值等于CCRx时复位,并保持低电平直到选择另一种输出模式。 输出模式6PWM翻转/置位模式:输出电平在TAR的值等于CCRx时翻转,当TAR值等于CCR0时置位。 输出模式7PWM复位/置位模式:输出电平在TAR的值等于CCRx时复位,当TAR的值

4、等于CCR0时置位。下图是增计数模式下的输出波形(本程序使用的是增模式3和7):计数模式:增计数模式 捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65 536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。连续计数模式 在需要65 536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到0FFFFH后,又从0开始重新计数增/减计数模式 需要对称波形的情况经常可以使用增/减计数模式,

5、该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。TA定时器有比较、捕获两种工作方式;比较可以产生PWM波形等,捕获可以精确的测量时间;这里用的是比较输出。硬件介绍就这么多了,其他的可以参考msp430x1xx_family_users_guide(用户指南)。2. 程序实现:本程序是直接从msp430f42x移植的,只改动了端口就能正常使用了。由此,430的模块在不同的系列中是通用的,有关寄存器是一样的;只是也许外部端口不太一样。程序初始化部分:完成TA相关寄存器的初始化。char TAPwmInit(char Clk,cha

6、r Div,char Mode1,char Mode2) TACTL = 0; /清除以前设置 TACTL |= MC_1; /定时器TA设为增计数模式 switch(Clk) /选择时钟源 case 'A': case 'a': TACTL|=TASSEL_1; break; /ACLK case 'S': case 's': TACTL|=TASSEL_2; break; /SMCLK case 'E': TACTL|=TASSEL_0; break; /外部输入(TACLK) case 'e'

7、: TACTL|=TASSEL_3; break; /外部输入(TACLK取反) default : return(0); /参数有误 switch(Div) /选择分频系数 case 1: TACTL|=ID_0; break; /1 case 2: TACTL|=ID_1; break; /2 case 4: TACTL|=ID_2; break; /4 case 8: TACTL|=ID_3; break; /8 default : return(0); /参数有误 switch(Mode1) /设置PWM通道1的输出模式。 case 'P':case 'p

8、9;: /如果设置为高电平模式 TACCTL1 = OUTMOD_7; /高电平PWM输出 P1SEL |= BIT2; /从P1.2输出 (不同型号单片机可能不一样) P1DIR |= BIT2; /从P1.2输出 (不同型号单片机可能不一样) break; case 'N':case 'n': /如果设置为低电平模式 TACCTL1 = OUTMOD_3; /低电平PWM输出 P1SEL |= BIT2; /从P1.2输出 (不同型号单片机可能不一样) P1DIR |= BIT2; /从P1.2输出 (不同型号单片机可能不一样) break; case &#

9、39;0':case 0: /如果设置为禁用 P1SEL &= BIT2; /P1.2恢复为普通IO口 break; default : return(0); /参数有误 switch(Mode2) /设置PWM通道1的输出模式。 case 'P':case 'p': /如果设置为高电平模式 TACCTL2 =OUTMOD_7; /高电平PWM输出 P1SEL |= BIT3; /从P1.3输出 (不同型号单片机可能不一样) P1DIR |= BIT3; /从P1.3输出 (不同型号单片机可能不一样) break; case 'N'

10、;:case 'n': /如果设置为低电平模式 TACCTL2 =OUTMOD_3; /低电平PWM输出 P1SEL |= BIT3; /从P1.3输出 (不同型号单片机可能不一样) P1DIR |= BIT3; /从P1.3输出 (不同型号单片机可能不一样) break; case '0':case 0: /如果设置为禁用 P1SEL &= BIT3; /P1.3恢复为普通IO口 break; default : return(0); /参数有误 return(1);     主要是设置TACTL寄存器,让TA工

11、作于增模式,设置时钟源和分频;CCTLx设置对应的输出模式;并且打开相应端口的第二功能。设置周期函数:设置PWM波形的周期,单位是多少个TACLK周期。void TAPwmSetPeriod(unsigned int Period) TACCR0 = Period;工作于增模式时,TA计数到TACCR0,设CCR0就完成了周期的设置。设置占空比:设置TA的PWM输出的有效电平的时间。void TAPwmSetDuty(char Channel,unsigned int Duty) switch(Channel) case 1: TACCR1=Duty; break; case 2: TACCR

12、2=Duty; break; 根据参数分别设置每一路的参数。设置占空比,用千分比设置:* 入口参数:Channel: 当前设置的通道号 1/2 Percent: PWM有效时间的千分比 (01000) * 出口参数:无* 说 明: 1000=100.0% 500=50.0% ,依次类推 * 范 例: TAPwmSetPermill(1,300)设置PWM通道1方波的占空比为30.0% TAPwmSetPermill(2,825)设置PWM通道2方波的占空比为82.5% */void TAPwmSetPermill(char Channel,unsigned int Percent) unsig

13、ned long int Period; unsigned int Duty; Period = TACCR0; Duty = Period * Percent / 1000; TAPwmSetDuty(Channel,Duty);这个函数用千分比来设置PWM输出的有效时间。方便程序的使用。有关定时器,TI提供的大量的例程,这些历程都很简洁、清晰。需要其他功能可以自己根据例程编写对应的程序。程序实现就这么多了,下面说下本程序的使用方法。3. 使用示例:使用方式:依然是在工程中加入c文件;文件包含h头文件;然后就可以正常使用本函数了。详细参考示例工程和main.c。main主要程序如下:#inc

14、lude "msp430x16x.h" /430寄存器头文件#include "TAPwm.h" /TA PWM输出程序库头文件void main() / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; ClkInit(); TAPwmInit('A',1,'P','P'); /将定时器TA初始化成为PWM发生器 /时钟源=ACLK ; 无分频; 通道1和通道2均设为高电平模式。 TAPwmSetPeriod(5

15、00); /通道1/2的PWM方波周期均设为500个时钟周期 TAPwmSetDuty(1,200); /1通道 有效200个时钟周期 TAPwmSetPermill(2,200); /2通道 20.0% LPM0;本程序调用程序库,产生两路PWM波形。TA的PWM输出就到这儿了,如果需要更多路的PWM波,可以使用TB,他可以产生6路完整的PWM波形;可以参考本程序编写TB的波形输出程序。有什么不足之处,欢迎评论,讨论。电设工作小结之MSP430G2553学习笔记1  (2012-08-18 22:00:24)转载标签: 电设 msp430学 设计分类:

16、 学习探讨把这几天的工作做一个小结:第一版MSP430G2553学习笔记   Created on: 2012-8-18      Author: zhang bin 学习笔记for msp430g2553redesigned by zhang bin2012-08-18versions:12_08_01       一,MSP430G2553单片

17、机的各个功能模块  (一),IO口模块,  1,我们所用的MSP430G2553有两组IO口,P1和P2。  2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN, IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。  3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。所以在使用中断时,当进入中断后,

18、还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。   4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。程序如下:void IO_interrupt_init()     /IO中断初始化函数  P1REN |= BIT4+BIT5+BI

19、T6+BIT7;     / pullup 内部上拉电阻使能  /使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断  P1OUT = BIT4+BIT5+BIT6+BIT7;   / 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来          /0:下拉,1:上拉

20、   P1IE |= BIT4+BIT5+BIT6+BIT7;       / interrupt enabled P13中断使能  P1IES |= BIT4+BIT5+BIT6+BIT7;          / Hi/lo edge  下降沿中断 

21、0;/P1IES &= BIT3;                         /上升沿触发中断  P1IFG &= (BIT4+BIT5+BIT6+BIT7);         

22、/中断标志位清零  5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。所以不用的IO口可以设为输出状态,或设为输入状态但通过外围电路接至VCC或GND,或接一个上拉/下拉电阻。7,当使用msp430g2553的IO口时要注意,因为g2553的IO口寄存器的操作,不像51,它不能单独针对某一位进行操作,必须对整个寄存器进行操作。所以就不像51,g2553不可以定义b

23、it型的数据。所以在使用msp的IO口时要注意对需要位的操作,而不要影响其他无关的位,可以 用 |  &  等按位操作的符号。在使用IO都控制其他外围模块时也要注意要使用的IO口的定义,可以用如下的定义方法:#define CLR_RS P2OUT&=BIT0;    /RS = P2.0#define SET_RS P2OUT|=BIT0;#define CLR_RW P2OUT&=BIT1

24、; /RW = P2.1#define SET_RW P2OUT|=BIT1;#define CLR_EN P2OUT&=BIT2; /EN = P2.2#define SET_EN P2OUT|=BIT2; #define DataPort    P1OUT 8,g2553的P27和P26脚分别接外部晶体的输出和输入脚XOUT和XIN,默认是自动设为了晶振管脚功能,但是当想把它们用为普通的IO时,

25、也可以,设置对应的SEL设为普通的IO即可,如下:P2DIR |= BIT6+BIT7;    /把P26和P27配置为普通IO 并为输出脚  默认为晶振的输入和输出引脚 作为dac0832的    P2SEL &= (BIT6+BIT7);   /cs和wr控制端    P2SEL2 &= (BIT6+BIT7); &#

26、160; (二),时钟系统     1,msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。     2,msp430的时钟源有:(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz8MHz;(2),外接高速晶振XT2CLK:8MHz;(3),内部数字控制振荡器DCO:是一个可控的RC振荡器,频率在016MHz;(4),超低功耗低频振荡器VLO:不可控,420KHz 典型值为12KHz;

27、     3,时钟模块:430的时钟模块有MCLK  SMCLK  ACLK :(1),主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。(2),子系统时钟SMCLK: 提供给高速外设。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。(3),辅助系统时钟A

28、CLK:提供给低速外设。可来自LFXT1CLK  VLO。      4,内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:DCOCTL = CALDCO_12MHZ;   /DCO设为12MHz   这种方

29、法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波BCSCTL1 = CALBC1_12MHZ;用这种方法可以设置1,8,12,16MHz宏定义如下:#ifndef _DisableCalData SFR_8BIT(CALDCO_16MHZ);                       SFR_8BIT(

30、CALBC1_16MHZ);                       SFR_8BIT(CALDCO_12MHZ);                     

31、;  SFR_8BIT(CALBC1_12MHZ);                       SFR_8BIT(CALDCO_8MHZ);                 &#

32、160;      SFR_8BIT(CALBC1_8MHZ);                        SFR_8BIT(CALDCO_1MHZ);            

33、            SFR_8BIT(CALBC1_1MHZ);                         #endif  5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置

34、ACLK为VLO,MCLK为VLO的8分频:#include  <msp430g2553.h> /1延时/#define CPU_F (double)16000000)/cpu frequency16000000#define CPU_F (double)1630)/cpu frequency1630   /CPU的实际MCLK大约为13.05/8=1.63KHz#define delay_us(x) _delay_cycles(long)(C

35、PU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)  void main(void)  volatile unsigned int i;                  / Vola

36、tile to prevent removal  WDTCTL = WDTPW + WDTHOLD;                 / Stop watchdog timer   BCSCTL3 |= LFXT1S_2;   &

37、#160;                  / LFXT1 = VLO  低频时钟选择为VLO ACLK选为VLO   IFG1 &= OFIFG;            

38、0;              / Clear OSCFault flag  清除振荡器错误中断标志   _bis_SR_register(SCG1 + SCG0);           / Stop DCO  

39、;SCG1禁止SMCLK  SCG0禁止DCO   BCSCTL2 |= SELM_3 + DIVM_3;               / MCLK = LFXT1/8  /因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO  8分频 

40、 所以CPU的MCLK大约为1.5KHz   P1DIR = 0xFF;                             / All P1.x outputs  P1OUT =

41、60;0;                                / All P1.x reset  P2DIR = 0xFF;      &

42、#160;                      / All P2.x outputs  P2OUT = 0;                &#

43、160;               / All P2.x reset   P1SEL |= BIT0+BIT4;                / P10 P14options 

44、 功能选择为外围模块  /p10输出ACLK,来自VLO,p14输出SMCLK,  因为禁止了SMCLK,所以P14脚无波形输出  /VLO典型值为12KHz  实际用示波器测得为:13.05KHz 左右波动  /所以CPU的实际MCLK大约为13.05/8=1.63KHz    for (;)      P1OUT = BIT6; &#

45、160;        / P1.6 闪烁    delay_ms(1000);     6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数_delay_cycles(int n); 可以达到比较精确的延迟,如下: /more_/1延时/#define CPU_F (double)16000000)/cpu frequency1

46、6000000#define CPU_F (double)12000000)/cpu frequency12000000#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)/2空函数#define nop() _NOP();    7,系统上电后默认使用的是DCO

47、时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。    (三),定时器Timer_A   1,MSP430g2553具有两个16位的定时器:Timer0_A   Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。   2,产生PWM,例子如下: #include <msp4

48、30g2553.h>  void Timer_A0_1_init()  /TA0.1输出PWMTACTL|= TASSEL_1+MC_1;/ACLK,增计数CCTL1=OUTMOD_7;/输出模式为复位/置位CCR0=328;/时钟频率为32768HZ,100HZ/CCR1=164;/时钟频率为32768HZ,占空比CCR1/CCR0=50%CCR1=109;/占空比CCR1/CCR0=1/3           

49、60;                  TA0.1由P1.2 P1.6输出  void Timer_A1_2_init()    /TA1.2输出PWMTA1CTL|= TASSEL_1+MC_1;/ACLK,增计数TA1CCTL2=OUTMOD_7;/输出模式为复位/置位,注意CCTL2要写为TA1CCTL2 TA

50、1CCR0=164;/时钟频率为32768HZ,波形32768/CCR0=199HZTA1CCR2=41;/占空比CCR2/CCR0=1/4,注意CCR2要写成TA1CCR2       TA1.2由P2.4 P2.5输出   void Timer_A1_1_init()   /TA1.1输出PWM  TA1CCTL1=OUTMOD_7; TA1CCR1=123;   /占空比CCR1/

51、CCR0=3/4,注意CCR1要写成TA1CCR1   TA1.1由P2.1 P2.2输出   void IO_init()  P1SEL|=BIT2+BIT6; P1DIR|=BIT2+BIT6;/P1.2 P1.6输出   TA0.1   OUT1  P2SEL|=BIT4+BIT5; P2DIR|=BIT4+BIT5;/P2.4 P2.5输出  

52、60;TA1.2   OUT2  P2SEL|=BIT1+BIT2; P2DIR|=BIT1+BIT2; /P2.1 P2.2输出  TA1.1   OUT1  void main(void) WDTCTL=WDTPW+WDTHOLD;     IO_init(); Timer_A0_1_init();Timer_A1_2_init();Timer_A1_1_init

53、();  _BIS_SR(CPUOFF);                          / Enter LPM0  进入低功耗模式0 SMCLK ON,ACLK ON   3,Timer_A的捕获/比较寄存器TAR

54、寄存器是Timer_A的16位的计数寄存器。TACCRx是Timer_A的捕获/比较寄存器,当为捕获模式时:当捕获发生时,把TAR的值装载到TACCRx中。当为比较模式时:TACCRx中装的是要与TAR寄存器相比较的值。   4,捕获模式捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时,把TAR的值装载到TACCRx中,同时也可以进入中断,执行相应的操作。这样利用捕捉上升沿或下降沿就可以计算外部输入信号的周期,得出频率。利用捕捉上升沿和下降沿可以得出输入信号的高电平或低电平的持续时间。也可以算出占空比。下面是一个例子,是Timer_A捕获初始化

55、的程序:void timer_init()      /使用Timer1_A时要特别注意各个寄存器的写法,因为Timer0_A的寄存器都简写了,所以在写/Timer1_A的寄存器时,要特别注意与Timer0_A的不同P1SEL |= BIT2;    /选择P12作为捕捉的输入端子  Timer0_A /TACCTL1 |=CM_3+SCS+CAP+CCIE;  /上下沿都触发捕捉,用于测脉宽,同步模式、时

56、能中断  CCI1ATACCTL1 |=CM_1+SCS+CAP+CCIE;  /上升沿触发捕捉,同步模式、时能中断  CCI1A    TACTL |= TASSEL1+MC_2;  /选择SMCLK时钟作为计数时钟源,不分频   增计数模式不行,必须连续计数模式   P2SEL |= BIT1;    /选择P21作为捕捉的

57、输入端子    Timer1_A  /TA1CCTL1 |=CM_3+SCS+CAP+CCIE;  /上下沿都触发捕捉,用于测脉宽,同步模式、时能中断  CCI1A  TA1CCTL1 |=CM_1+SCS+CAP+CCIE;  /上升沿触发捕捉,同步模式、时能中断  CCI1A  TA1CTL |= TASSEL1+MC_2;  /选择SMCLK时钟作为计

58、数时钟源,不分频   增计数模式不行,必须连续计数模式   相对应的中断函数如下: #pragma vector=TIMER0_A1_VECTOR   /Timer0_A CC1  的中断向量_interrupt void Timer_A(void) / CCI0A 使用的捕捉比较寄存器是TA0CCR0,TA0CCR0单独分配给一个    /中断向量TIMER1_A0

59、_VECTOR,所以进入中断后直接就是Timer0_A CC0产生的中断,不用经过类似   /下面的方法判断中断源了  。/Timer0_A CC1-4, TA0公用一个中断向量 TIMER0_A1_VECTOR,所以进入了中断后还要用下面    /的方法进行判断是哪一个中断源产生的中断  switch(TAIV)    /如果是Timer0_A CC1产生的中断   

60、; case 2:      flag=1;   LPM1_EXIT;      /退出低功耗模式  / _BIC_SR_IRQ(LPM1_bits);   /_bic_SR_register_on_exit(LPM1_bits);   break;     case 4:

61、60;break;  case 10:break;    #pragma vector=TIMER1_A1_VECTOR      /Timer1_A CC1  的中断向量_interrupt void Timer_A1(void) / P1OUT|=BIT0;  /led调试用的/ LPM1_EXIT;    

62、60; /退出低功耗模式  因为使用的是CCI0A 使用的捕捉比较寄存器是TA1CCR0,TA1CCR0单独分配给一个                /中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer1_A CC0产生的中断,不用经过类似          

63、60;    /下面注释掉的方法判断  。               /而Timer1_A CC1-4, TA1则公用一个中断向量 TIMER1_A1_VECTOR,所以进入了中断后还要用下面       /的方法进行判断是哪一个中断源产生的中断  switch(TA

64、1IV)    /如果是Timer1_A CC1产生的中断    case 2:      flag=2;   LPM1_EXIT;      /退出低功耗模式   / _BIC_SR_IRQ(LPM1_bits);   /_bic_SR_register_on_exit(LPM

65、1_bits);   break;     case 4:break;  case 10:break;   /如果要测量更低频率的信号的话,可以在中断中判断溢出中断发生的次数,这样就可以得到溢出的次数,从而可以测量更/低频率的信号   5,Timer_A的计数模式计数模式有:增计数模式,连续计数模式和增减计数模式。具体的各个模式的详解,参见用户指南。   6,定时器的定时中断在使用定时器

66、的定时中断时,要注意定时器计数模式的选择。在使用中断时,要注意中断向量的使用和中断源的判断,下面就举一个例子,注释的也较详细:#include <msp430g2553.h> unsigned int t=0; void main(void)  WDTCTL = WDTPW + WDTHOLD;              &#

67、160;  / Stop WDT  P1DIR |= 0x01;                            / P1.0 output   CCTL0 = C

68、CIE;   / CCTLx是捕获/比较控制寄存器   interrupt enabled  CCIE=0x0010  时能定时器A中断   CCR0 = 50000;   /捕获/比较寄存器   设置计数器CCR0的初值  16位寄存器,最大值为65535       

69、0;        /默认SMCLK使用的是DCO,默认的DCO大约为800KHz,而CCR0=50000,所以中断产生的频率大约为16Hz  TACTL = TASSEL_2 + MC_2;                  / SMCLK, contmod

70、e  连续计数模式从0计到0FFFFh  /TACTL = TASSEL_2 + MC_1;                  / SMCLK, upmode  增计数模式从0计到CCR0   _BIS_SR(LPM0_bits + GIE);

71、60;                / Enter LPM0 w/ interrupt  进入低功耗模式0,允许中断 / Timer A0 interrupt service routine#pragma vector=TIMER0_A0_VECTOR_interrupt void Ti

72、mer_A (void)    /CCIFG中断被响应后,该标志位自动清零   /P1OUT = 0x01;                            / Toggle P1.0t+;if

73、(t=5)P1OUT = BIT0;           / Toggle P1.0t=0;   CCR0 += 50000;                       

74、;     / Add Offset to CCR0  增加CCR0偏移      /定时器总是从0开始往上计数,一直到计满再从0开始,在连续计数模式下,当定时器的值等于CCR0时,产生中断  /在中断中对CCR0增加50000,这样的话定时器从当前值到下一时刻再次等于CCR0时的间隔为50000,恒定  /这样产生中断的时间间隔就相等了 /所以在连续计数模式下,要想使中断的时

75、间间隔一定,就要有CCR0 += n;这句话                                            

76、0; /在中断中CCR0不需要从新赋值,区别于51 中断的使用注意情况:还是把举个例子吧:#include <msp430g2553.h> void main(void)  WDTCTL = WDTPW + WDTHOLD;                 / Stop WDT  P1DIR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论