当前位置:文档之家› MSP430程序库十一定时器TA的PWM输出

MSP430程序库十一定时器TA的PWM输出

MSP430程序库十一定时器TA的PWM输出
MSP430程序库十一定时器TA的PWM输出

MSP430程序库<十一>定时器TA的PWM输出

定时器是单片机常用的其本设备,用来产生精确计时或是其他功能;msp430的定时器不仅可以完成精确定时,还能产生PWM波形输出,和捕获时刻值(上升沿或是下降沿到来的时候)。这里完成一个比较通用的PWM波形产生程序。

1. 硬件介绍:

MSP430系列单片机的TimerA结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电

表和手持式仪表的理想配置。它给开发人员提供了较多灵活的选择余地。当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM,而不需利用中断维持PWM输出。

MSP430F16x和MSP430F14x单片机内部均含有两个定时器,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翻转/复位模式:输出在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的值等于CCR0时置位。

下图是增计数模式下的输出波形(本程序使用的是增模式3和7):

计数模式:

增计数模式

捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65 536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。

连续计数模式

在需要65 536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到0FFFFH后,又从0开始重新计数

增/减计数模式

需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。

TA定时器有比较、捕获两种工作方式;比较可以产生PWM波形等,捕获可以精确的测量时间;这里用的是比较输出。

硬件介绍就这么多了,其他的可以参考msp430x1xx_family_users_guide(用户指南)。

2. 程序实现:

本程序是直接从msp430f42x移植的,只改动了端口就能正常使用了。由此,430的模块在不同的系列中是通用的,有关寄存器是一样的;只是也许外部端口不太一样。

程序初始化部分:完成TA相关寄存器的初始化。

char TAPwmInit(char Clk,char 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': 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': //如果设置为高电平模式

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 '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':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工作于增模式,设置时钟源和分频;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: TACCR2=Duty; break;

}

}

根据参数分别设置每一路的参数。

设置占空比,用千分比设置:

* 入口参数:Channel: 当前设置的通道号 1/2

Percent: PWM有效时间的千分比 (0~1000)

* 出口参数:无

* 说明: 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)

{

unsigned long int Period;

unsigned int Duty;

Period = TACCR0;

Duty = Period * Percent / 1000;

TAPwmSetDuty(Channel,Duty);

}

这个函数用千分比来设置PWM输出的有效时间。方便程序的使用。

有关定时器,TI提供的大量的例程,这些历程都很简洁、清晰。需要其他功能可以自己根据例程编写对应的程序。程序实现就这么多了,下面说下本程序的使用方法。

3. 使用示例:

使用方式:依然是在工程中加入c文件;文件包含h头文件;然后就可以正常使用本函数了。详细参考示例工程和main.c。

main主要程序如下:

#include "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(500); //通道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学

设计

把这几天的工作做一个小结:

第一版

MSP430G2553学习笔记

Created on: 2012-8-18

Author: zhang bin

学习笔记

for msp430g2553

redesigned by zhang bin

2012-08-18

versions:12_08_01

一,MSP430G2553单片机的各个功能模块

(一),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口公用一个中断向量。所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。

4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。

注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。程序如下:

void IO_interrupt_init() //IO中断初始化函数

{

P1REN |= BIT4+BIT5+BIT6+BIT7; // pullup 内部上拉电阻使能

//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断

P1OUT = BIT4+BIT5+BIT6+BIT7; // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来

//0:下拉,1:上拉

P1IE |= BIT4+BIT5+BIT6+BIT7; // interrupt enabled P13中断使能

P1IES |= BIT4+BIT5+BIT6+BIT7; // Hi/lo edge 下降沿中断

//P1IES &= ~BIT3; //上升沿触发中断

P1IFG &= ~(BIT4+BIT5+BIT6+BIT7); //中断标志位清零

}

5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉

6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。所以不用的IO口可以设为输出状态,或设为输入状态但通过外围电路接至VCC或GND,或接一个上拉/下拉电阻。

7,当使用msp430g2553的IO口时要注意,因为g2553的IO口寄存器的操作,不像51,它不能单独针对某一位进行操作,必须对整个寄存器进行操作。所以就不像51,g2553不可以定义bit型的数据。所以在使用msp的IO口时要注意对需要位的操作,而不要影响其他无关的位,可以用| & ^等按位操作的符号。在使用IO都控制其他外围模块时也要注意要使用的IO口的定义,可以用如下的定义方法:

#define CLR_RS P2OUT&=~BIT0; //RS = P2.0

#define SET_RS P2OUT|=BIT0;

#define CLR_RW P2OUT&=~BIT1;//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时,也可以,设置对应的SEL设为普通的IO即可,如下:

P2DIR |= BIT6+BIT7; //把P26和P27配置为普通IO 并为输出脚默认为晶振的输入和输出引脚作为dac0832的

P2SEL &= ~(BIT6+BIT7); //cs和wr控制端

P2SEL2 &= ~(BIT6+BIT7);

(二),时钟系统

1,msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。

2,msp430的时钟源有:

(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;(2),外接高速晶振XT2CLK:8MHz;

(3),内部数字控制振荡器DCO:是一个可控的RC振荡器,频率在0~16MHz;

(4),超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz;

3,时钟模块:430的时钟模块有MCLK SMCLK ACLK :

(1),主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自

LFXT1CLK XT2CLK DCO VLO可选,默认为DCO。

(2),子系统时钟SMCLK: 提供给高速外设。可以来自LFXT1CLK XT2CLK DCO VLO 可选,默认为DCO。

(3),辅助系统时钟ACLK:提供给低速外设。可来自LFXT1CLK VLO。

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

DCOCTL = CALDCO_12MHZ; //DCO设为12MHz 这种方法设DCO频率比较精确,实际测得为12.08MHz左右正弦波

BCSCTL1 = CALBC1_12MHZ;

用这种方法可以设置1,8,12,16MHz

宏定义如下:

#ifndef __DisableCalData

SFR_8BIT(CALDCO_16MHZ);

SFR_8BIT(CALBC1_16MHZ);

SFR_8BIT(CALDCO_12MHZ);

SFR_8BIT(CALBC1_12MHZ);

SFR_8BIT(CALDCO_8MHZ);

SFR_8BIT(CALBC1_8MHZ);

SFR_8BIT(CALDCO_1MHZ);

SFR_8BIT(CALBC1_1MHZ);

#endif

5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:

#include

//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)(CPU_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; // Volatile to prevent r emoval

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 低频时钟选择为VLO ACLK选为VLO

IFG1 &= ~OFIFG; // Clear OSCFault flag 清除振荡器错误中断标志

__bis_SR_register(SCG1 + SCG0); // Stop DCO SCG1禁止SMCLK SCG0禁止DCO

BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = LFXT1/8

//因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO 8分频所以CPU的MCLK大约为1.5KHz

P1DIR = 0xFF; // All P1.x outputs

P1OUT = 0; // All P1.x reset

P2DIR = 0xFF; // All P2.x outputs

P2OUT = 0; // All P2.x reset

P1SEL |= BIT0+BIT4; // P10 P14options 功能选择为外围模块

//p10输出ACLK,来自VLO,p14输出SMCLK,因为禁止了SMCLK,所以P14脚无波形输出

//VLO典型值为12KHz 实际用示波器测得为:13.05KHz 左右波动

//所以CPU的实际MCLK大约为13.05/8=1.63KHz

for (;;)

{

P1OUT ^= BIT6; // P1.6 闪烁

delay_ms(1000);

}

}

6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数

__delay_cycles(int n); 可以达到比较精确的延迟,如下:

//more_

//1延时

//#define CPU_F ((double)16000000)//cpu frequency16000000

#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时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。

(三),定时器Timer_A

1,MSP430g2553具有两个16位的定时器:Timer0_A Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。

2,产生PWM,例子如下:

#include

void Timer_A0_1_init() //TA0.1输出PWM

{

TACTL|= TASSEL_1+MC_1;//ACLK,增计数

CCTL1=OUTMOD_7;//输出模式为复位/置位

CCR0=328;//时钟频率为32768HZ,100HZ

//CCR1=164;//时钟频率为32768HZ,占空比CCR1/CCR0=50%

CCR1=109;//占空比CCR1/CCR0=1/3 TA0.1由P1.2 P1.6输出

}

void Timer_A1_2_init() //TA1.2输出PWM

{

TA1CTL|= TASSEL_1+MC_1;//ACLK,增计数

TA1CCTL2=OUTMOD_7;//输出模式为复位/置位,注意CCTL2要写为TA1CCTL2

TA1CCR0=164;//时钟频率为32768HZ,波形32768/CCR0=199HZ

TA1CCR2=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/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输出 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();

_BIS_SR(CPUOFF); // Enter LPM0 进入低功耗模式0 SMCLK ON,ACLK ON

}

3,Timer_A的捕获/比较寄存器

TAR寄存器是Timer_A的16位的计数寄存器。TACCRx是Timer_A的捕获/比较寄存器,当为捕获模式时:当捕获发生时,把TAR的值装载到TACCRx中。当为比较模式时:TACCRx 中装的是要与TAR寄存器相比较的值。

4,捕获模式

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

void timer_init() //使用Timer1_A时要特别注意各个寄存器的写法,因为Timer0_A的寄存器都简写了,所以在写

//Timer1_A的寄存器时,要特别注意与Timer0_A的不同

{

P1SEL |= BIT2; //选择P12作为捕捉的输入端子 Timer0_A

//TACCTL1 |=CM_3+SCS+CAP+CCIE; //上下沿都触发捕捉,用于测脉宽,同步模式、时能中断 CCI1A

TACCTL1 |=CM_1+SCS+CAP+CCIE; //上升沿触发捕捉,同步模式、时能中断 CCI1A

TACTL |= TASSEL1+MC_2; //选择SMCLK时钟作为计数时钟源,不分频增计数模式不行,必须连续计数模式

P2SEL |= BIT1; //选择P21作为捕捉的输入端子 Timer1_A

//TA1CCTL1 |=CM_3+SCS+CAP+CCIE; //上下沿都触发捕捉,用于测脉宽,同步模式、时能中断 CCI1A

TA1CCTL1 |=CM_1+SCS+CAP+CCIE; //上升沿触发捕捉,同步模式、时能中断 CCI1A

TA1CTL |= TASSEL1+MC_2; //选择SMCLK时钟作为计数时钟源,不分频增计数模式不行,必须连续计数模式

相对应的中断函数如下:

#pragma vector=TIMER0_A1_VECTOR //Timer0_A CC1 的中断向量

__interrupt void Timer_A(void)

{

//CCI0A 使用的捕捉比较寄存器是TA0CCR0,TA0CCR0单独分配给一个

//中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer0_A CC0产生的中断,不用经过类似

//下面的方法判断中断源了。

//Timer0_A CC1-4, TA0公用一个中断向量 TIMER0_A1_VECTOR,所以进入了中断后还要用下面

//的方法进行判断是哪一个中断源产生的中断

switch(TAIV) //如果是Timer0_A CC1产生的中断

{

case 2:

{

flag=1;

LPM1_EXIT; //退出低功耗模式

// _BIC_SR_IRQ(LPM1_bits);

//_bic_SR_register_on_exit(LPM1_bits);

break;

}

case 4: break;

case 10:break;

}

}

#pragma vector=TIMER1_A1_VECTOR //Timer1_A CC1 的中断向量

__interrupt void Timer_A1(void)

{

//P1OUT|=BIT0; //led调试用的

//LPM1_EXIT; //退出低功耗模式因为使用的是CCI0A 使用的捕捉比较寄存器是TA1CCR0,TA1CCR0单独分配给一个

//中断向量TIMER1_A0_VECTOR,所以进入中断后直接就是Timer1_A CC0产生的中断,不用经过类似

//下面注释掉的方法判断。

//而Timer1_A CC1-4, TA1则公用一个中断向量 TIMER1_A1_VECTOR,所以进入了中断后还要用下面

//的方法进行判断是哪一个中断源产生的中断

switch(TA1IV) //如果是Timer1_A CC1产生的中断

{

case 2:

{

flag=2;

LPM1_EXIT; //退出低功耗模式

// _BIC_SR_IRQ(LPM1_bits);

//_bic_SR_register_on_exit(LPM1_bits);

break;

}

case 4:break;

case 10:break;

}

}

//如果要测量更低频率的信号的话,可以在中断中判断溢出中断发生的次数,这样就可以得到溢出的次数,从而可以测量更

//低频率的信号

5,Timer_A的计数模式

计数模式有:增计数模式,连续计数模式和增减计数模式。具体的各个模式的详解,参见用户指南。

6,定时器的定时中断

在使用定时器的定时中断时,要注意定时器计数模式的选择。在使用中断时,要注意中断向量的使用和中断源的判断,下面就举一个例子,注释的也较详细:

#include

unsigned int t=0;

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P1DIR |= 0x01; // P1.0 output

CCTL0 = CCIE; // CCTLx是捕获/比较控制寄存器 interrupt enabled CCIE=0x0010 时能定时器A中断

CCR0 = 50000; //捕获/比较寄存器设置计数器CCR0的初值 16位寄存器,最大值为65535

//默认SMCLK使用的是DCO,默认的DCO大约为800KHz,而CCR0=50000,所以中断产生的频率大约为16Hz

TACTL = TASSEL_2 + MC_2; // SMCLK, contmode 连续计数模式从0计到

0FFFFh

//TACTL = TASSEL_2 + MC_1; // SMCLK, upmode 增计数模式从0计到CCR0

_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt 进入低功耗模式0,允许中断

}

// Timer A0 interrupt service routine

#pragma vector=TIMER0_A0_VECTOR

__interrupt void Timer_A (void) //CCIFG中断被响应后,该标志位自动清零

{

//P1OUT ^= 0x01; // Toggle P1.0

t++;

if(t==5)

{

P1OUT ^= BIT0; // Toggle P1.0

t=0;

}

CCR0 += 50000; // Add Offset to CCR0 增加CCR0偏移

//定时器总是从0开始往上计数,一直到计满再从0开始,在连续计数模式下,当定时器的值等于CCR0时,产生中断

//在中断中对CCR0增加50000,这样的话定时器从当前值到下一时刻再次等于CCR0时的间隔为50000,恒定

//这样产生中断的时间间隔就相等了

//所以在连续计数模式下,要想使中断的时间间隔一定,就要有CCR0 += n;这句话

//在中断中CCR0不需要从新赋值,区别于51

}

中断的使用注意情况:还是把举个例子吧:

#include

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P1DIR |= 0x01; // P1.0 output

TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt TAIE允许定时器溢出中断

_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt GIE允许中断

}

// Timer_A3 Interrupt Vector (TA0IV) handler

#pragma vector=TIMER0_A1_VECTOR

__interrupt void Timer_A(void)

{

switch( TA0IV ) //TAIV中断向量寄存器用于

{

case 2: break; // CCR1 not used 捕获/比较器1

case 4: break; // CCR2 not used 捕获/比较器2

case 10: P1OUT ^= 0x01; // overflow 定时器溢出

break;

}

}

7,注意:定时器Timer0_A的时钟可以选择为外接时钟输入TACLK(P10),这样当外接一个信号时,定时器Timer0_A就相当于一个计数器使用。这样就可以用Timer0_A接外接信号,Timer1_A接标准的时钟如32768Hz的晶振,就可以实现等精度测频了。其实Timer1_A 的时钟也可以外接的,但是在g2553中没有这个外接管脚(P37),所以就只能选择正常的时钟了。

Timer0_A的外接时钟输入TACLK(P10)的设置如下:下面是我实现等精度测频时,两个定时器的初始化程序:

void timer0_init()

{

TACTL |= TASSEL_0+MC_2+TACLR; //选择TACLK时钟作为计数时钟源,不分频必须连续计数模式

P1SEL |= BIT0; //P10为Timer0_A的时钟TACLK输入,接外部待测信号,这样Timer0_A 就当作计数器用

}

//Timer1_A采用ACLK作为时钟源计数,这样ACLK就相当于是标准信号,这样两个定时器相当于都工作在计数器方式,

//ACLK 32768Hz作为标准信号,这样可以实现等精度测频

void timer1_init()

{

TA1CCTL0 = CCIE;

TA1CCR0 = 32768; //1s定时

TA1CTL |= TASSEL_1+MC_2+TACLR; //选择ACLK时钟作为计数时钟源,不分频必须连续计数模式

}

8,用定时器和比较器可以实现DAC 使用定时器也可以实现串口通信

MSP430程序库十一定时器TA的PWM输出

MSP430程序库<十一>定时器TA 的PWM 输出 定时器是单片机常用的其本设备,用来产生精确计时或是其他功能;msp430的定时器不仅可以完成精确定时,还能产生PWM 波形输出,和捕获时刻值(上升沿或是下降沿到来的时候)。这里完成一个比较通用的PWM 波形产生程序。 ? 硬件介绍硬件介绍:: MSP430系列单片机的TimerA 结构复杂,功能强大,适合应用于工业控制,如数字化电机控制,电表和手持式仪表的理想配置。它给开发人员提供了较多灵活的选择余地。当PWM 不需要修改占空比和时间时,TimerA 能自动输出PWM ,而不需利用中断维持PWM 输出。 MSP430F16x 和MSP430F14x 单片机内部均含有两个定时器,TA 和TB ;TA 有三个模块,CCR0-CCR2;TB 含有CCR0-CCR67个模块;其中CCR0模块不能完整的输出PWM 波形(只有三种输出模式可用);TA 可以输出完整的2路PWM 波形;TB 可以输出6路完整的P WM 波形。 定时器的PWM 输出有有8种模式: 输出模式0 输出模式:输出信号OUTx 由每个捕获/比较模块的控制寄存器CCTLx 中的OUTx 位定义,并在写入该寄存器后立即更新。最终位OUTx 直通。 输出模式1 置位模式:输出信号在TAR 等于CCRx 时置位,并保持置位到定时器复位或选择另一种输出模式为止。 输出模式2 PWM 翻转/复位模式:输出在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 的值等于CCR0时置位。 下图是增计数模式下的输出波形(本程序使用的是增模式3和7): 计数模式计数模式:: 增计数模式 捕获/比较寄存器CCR0用作Timer_A 增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65 536的连续计数情况。计数器TAR 可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。 连续计数模式 在需要65 536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到0FFFFH 后,又从0开始重新计数 增/减计数模式 需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。

MSP430 定时器A

上次Cloud和大家一起学习完了MSP430的时钟配置,这一篇,我们来学习MSP430 单片机的TimerA(定时/计数器A)。MSP430单片机的TimerA具有非常强大的功能,相关的寄存器配置也相当复杂,Cloud花了好久才逐步理清学习思路,尤其是学习数据手册的相关描述。在这里Cloud提醒大家,虽然现在网上有中文汉化版的数据手册,但Cloud阅读英文原版后对比发现还是英文原版对器件特性描述得更加清楚,而中文汉化版的省略掉了一些内容。好吧,扯远了。下面进入正题: 一、MSP430的Timer结构 首先让我们通过官方描述来初步了解一下MSP430单片机的Timer资源: 定时器A是一个16位的定时/计数器。定时器A支持多重捕获/比较,PWM输出和内部定时。定时器还有扩展中断功能,中断可以由定时器溢出产生或由捕获/比较寄存器产生。 定时器A的特性包括: ·四种运行模式的异步16位定时/计数器 ·可选择配置的时钟源 ·可配置的PWM输出 ·异步输入和输出锁存 ·对所有TA中断快速响应的中断向量寄存器 MSP430G2553单片机共有两个TimerA,分别是Timer0A和Timer1A。 OK,零零总总说了这么多,大家一定带有很多的疑惑,比如什么叫“捕获/比较”等,这里Cloud先不作解释,会用才是王道。我们呢先找来定时器A的结构图给大家初步了解一下定时器A的结构: 我们先从上面部分开始解释。中间红色的是一个16位的TimerA,TAR,这其实就是MSP430单片机内部的一个定时计数器了,类似于51中的TH0和TL0的合体。既然可以拿来计时,那么肯定可以有时钟信号输入,让我们最左边黄色的框,是一个选择器,由上面的TASSEL来选择TACLK、ACLK、SMCLK、INCLK的其中一种时钟。上次我们已经学习过ACLK和SMCLK,也知道如何配置这两个时钟了(这也是为什么先学习时钟的原因),另外两个是外部时钟源,其中TACLK可以由P1.0输入。跟在时钟源后面的是一个分频器,由ID来控制,将时钟源的时钟信号1、2、4、8分频后作为定时/计数器的时钟源。TAR右边的蓝色框代表TimerA在计数模式下由MC来控制TAR的四种计数方式。同时我们还注意到TAR的左下方有一个TACLAR连接至TAR的Clear端,显然是清零作用的,数据手册还告诉我们置位TACLAR,不但会清零TAR的计数值还会清除时钟分频信息。TACLAR 一旦置1,会自动归零,所以可以当做是TimerA的复位按钮。

MSP430 定时器A的使用

第四讲定时器A的使用 MSP430F413芯片中含有TimerA3模块,如图1-2所示。其常用的外引线有三条:TACLK、TA1和TA2。 TACLK:定时器_A输入时钟(48脚),与P1.6和ACLK输出共用同一引脚。 TA1:定时器_A的第一通道输入、输出引脚(51脚)。捕获方式:CCI1A输入;比较方式:OUT1输出。 TA2:定时器_A的第二通道输入、输出引脚(45脚)。捕获方式:CCI2A输入;比较方式:OUT2输出。 1.定时器A功能及结构 定时器A基本结构是一个十六位计数器,由时钟信号驱动工作,结构框图如图4-1所示。 图4-1 定时器A结构图 定时器A具有多种功能,其特性如下: (1)输入时钟可以有三种选择,可以是慢时钟(ACLK)、快时钟(SMCLK与单片机主时钟同频)和外部时钟。 (2)能产生的定时中断、定时脉冲和PWM(脉宽调制)信号,没有软件带来的误差。

(3)不仅能捕获外部事件发生的时间,还可选择触发脉冲沿(由上升沿或下降沿触发)。 定时器A功能模块主要包括: (1)计数器部分:输入的时钟源具有4种选择,所选定的时钟源又可以1、2、4或8分频作为计数频率,Timer_A可以通过选择4种工作模式灵活的完成定时/计数功能。 (2)捕获/比较器:用于捕获事件发生的时间或产生时间间隔,捕获比较功能的引入主要是为了提高I/O 端口处理事务的能力和速度。不同的MSP430单片机,Timer_A模块中所含有的捕获/比较器的数量不一样,每个捕获/比较器的结构完全相同,输入和输出都取决于各自所带控制寄存器的控制字,捕获/比较器相互之间完全独立工作。 (3)输出单元:具有可选的8种输出模式,用于产生用户需要的输出信号,支持PWM输出。 2.定时器工作模式 (1)停止模式:停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。例如,停止模式前,Timer_A工作于增/减计数模式并且处于下降计数方向,停止模式后,Timer_仍然工作于增/减计数模式,从暂停前的状态开始继续沿着下降方向开始计数。如果不需这样,则可通过TACTL中的CLR控制位来清除定时器的方向记忆特性。 (2)增计数模式:捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。增计数模式的计数过程如图4-2所示。通过改变CCR0值,可重置计数周期。 图4-2增计数模式示意图 (3)连续计数模式:在需要65536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到单增到0FFFFH后,又从0开始重新计数如图4-3所示。 图4-3 连续计数模式 (4)增/减计数模式

LaunchPad-MSP430入门系列4-定时器模块(定时、计数、捕获)

LaunchPad-MSP430入门系列4-定时器模块 (定时、计数、捕获) Version 1.2 文先,介绍几个英文缩写的意思以及一些注意的地方。 1.Timer0/1 定时器0/1,在User's Guide中用的是TimerA/B,所指的也是Timer0/1 。 G2553Datasheet中用的是Timer0/1 ,本文以G2553Datasheet为准。全文以Timer0 为例,Timer1类同。 2.TAxR(x = 0/1)定时器x对应的计数器,这是一个只读寄存器。硬件自动驱动计数。 3.EQUy(y = 0/1/2)计数事件发生寄存器,当TAxR = TAxCCRy时EQUy置1。 4. 定时器简介 MSPG2553共有两个定时器,Timer0、Timer1,他们都是十六位的定时、计数器,内含三个捕获、比较寄存器。两个定时器均支持多个捕获、PWM输出、间歇性计时,定时器包含多个中断源,可以是计数溢出中断、捕获中断等等。 定时器包含: ●同步十六位定时、计数器运行模式。 ●时钟源可从MCLK、SMCLK、ACLK任意选择。 ●三个比较、捕获寄存器。 ●中断向量寄存器能快速解码的所有定时器中断 本文以Timer0为例详细介绍430的定时器模块,下图是Timer0组成框图

0-1定时器0组成框图 下面简要介绍一下该硬件框图的意思,从左上角看,首先是一个时钟源选择寄存器TASSELx,通过该寄存器选择定时器的时钟源,选择了时钟源后有一个分频器Divider,相应的设置寄存器是IDx,再过来就到一个定时器的核心部分,一个16位的定时器TAR。其右侧有一个定时器的计数模块,MCx寄存器用来设置计数模式。 接下来,TAR正下方有三个横线,右侧标有CCR0、CCR1、CCR2,意思是CCR1、CCR0的框图和下方CCR2的框图是一样的。此处省略不写。在CCR中,左上角为一个捕获源选择寄存器。可以从CCI2A、CCI2B、GND或者VCC选择捕获源,选择捕获源后有一个选择捕获模式寄存器Capture Mode,然后过来有一个捕获溢出状态寄存器COV,SCS同步/异步捕获模式选择位,然后连接到捕获比较寄存器。下方为模式选择寄存器,具体设置可以查看相应的寄存器设置。 这里仅是大概介绍一下Timer0的寄存器,具体的设置使用还看参考相应的寄存器并结合例程慢慢学习理解。 定时器运行方式 下面简要重点介绍定时器计数模块的四种模式以及7种输出模式。 Timer0有一个在不断计数的只读寄存器TA0R。计数器的计数模式共有四种,

MSP430教程10:MSP430单片机WDT看门狗定时器解析

看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。程序中设置看门狗清零指令 WDTCTL=WDTPW+WDTCNTCL,当程序跑飞不能及时清零看门狗,导致看门狗溢出复位,这样程序可以恢复正常运行状态。 一、WDT寄存器包括WDTCNT和WDTCTL,两个寄存器在上电和系统复位内容全部清零 1.记数单元WDTCNT:WDTCNT是16位增记数器,由MSP430选定的时钟电路产生的固定周期脉冲信号对记数器进行加法记数。WDTCNT不能直接软件存取,必须通过看门狗定时器的控制寄存器WDTCTL来控制。 2.控制寄存器WDTCTL:WDTCTL由两部分组成,高8位用作口令,即5AH(头文件中定义为WDTPW),低8位是对WDT操作的控制命令。写入WDT控制命令时先写入口令WD TPW,口令写错将导致系统复位。读WDTCTL时不需口令,低字节WDTCTL的值,高字节读出始终为69H。 bit 15-8 7 6 5 4 3 2 1 0 口令HOLD NMIES NMI TMSE L CNTCL SSEL IS1 IS0 IS1 SI0 选择看门狗定时器的定时输出,T为WDTCNT的输入时钟源周期。 TMSEL W DT工作模式选择 0 0 T*2的15次 方 0 看门狗模式 0 1 T*2的13次

方 1 定时器模式 1 0 T*2的9次 方 NMI 选择RST/NMI 引脚功能 1 1 T*2的6次 方 RST/NMI为复位端 SSEL 选择WDTCNT的时钟 源 1 RST/NMI为非屏蔽中断输入 0 SMCL K 1 ACLK NMIES 选择NMI中断的边沿触发方 式 HOLD 停止看门狗定时器工作 0 上升沿触发NMI中 断 0 看门狗功能激活 1 下降沿触发NMI中 断 1 时钟禁止输入,记数停止

MSP430定时器A捕捉脉实例

MSP430定时器A捕捉脉实例[调试通过,很好用] 微控论坛原创主贴作者:fangth Microcontrol CODE /***************************************************************** //功能:利用定时器A的捕捉能测量脉冲信号的脉宽 // // // MSP430F449 // ----------------- // /|\| XIN|- // | | | 32kHz // --|RST XOUT|- // | | // | P1.5/ACLK|---+ // | | | // | P2.0/TA2|<--+ // | | // | | //说明:ACLK要进行8分频(4K),并将其作为外部的要捕获的脉冲; //MCLK=SMCLK=8M; *****************************************************************/ #include int pwm_start,pwm_end,pwm_wide=0; void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR = 0x20; // P1.5 输出 P1SEL = 0x20; // P1.5输出ACLK P2SEL|=BIT0; //P2.0 CCI2A SCFI0 |= FN_4; SCFQCTL = 121; // (121+1) ×32768 *2= 7.99Mhz FLL_CTL0=DCOPLUS+OSCCAP1; //MCLK=SMCLK=8M FLL_CTL1 |= FLL_DIV_8; //ACLK要进行8分频,ACLK=4K TACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE; //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开 //Capture input select: 0 - CCI2A

MSP430定时器A说明

MSP430的定时器A有比较\捕获两种工作模式 比较模式: 这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx置1,同时产生中断。若中断允许未开启则只将中断标志位CCIFGx置1。 例子:比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断,输出时序脉冲。 捕获模式: 利用外部信号的上升沿、下降沿或上升下降沿触发来测量外部或内部事件,也可以由软件停止。捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC。完成捕获后相应的捕获标志位CCIFGx置1。 捕获模式的应用: 利用捕获源来触发捕获TAR的值,并将每次捕获的值都保存到TACCRx中,可以随时读取TACCRx的值,TACCRx是个16位的寄存器,捕获模式用于事件的精确定位。如测量时间、频率、速度等。 利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。 本例程用到了定时器A的CCI1A端口(例如MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。在实际应用中可根据例程中的start,end,overflow三个变量来计算脉冲宽度。此功能模块在实际产品应用中体现出有较高的应用价值。 具体例程 #include unsigned int start,end; unsigned char overflow; void main (void) { WDTCTL = WDTPW+WDTHOLD; //关闭看门狗定时器 P1DIR = BIT0+BIT4; //设置P1.0和P1.4方向为输出 P1SEL = BIT2; //设置P1.2端口为功能模块使用 TACTL = TASSEL0+TACLR+TAIE+MC1; //定时器A时钟信号选择ACLK,同时 //设置定时器A计数模式为连续增计模式

MSP430--定时器B

MSP430--定时器B (2012-07-20 10:56:37) 转载▼ 分类:单片机专区 标签: 转载 原文地址:MSP430--定时器B作者:wangtangwang2012 MSP43016位定时器B模块是单片机的重要资源。MSP430F13/14/15x系列都有定时器模块B,但是不同单片机系列所带的比较/捕获模块功能有所不同。 1.定时器B模块: TimerB与TimerA大部分相同,不同点在于定时器B的捕获/比较单元增加了锁存器。 二者区别: (1)TimerB计数长度为8位,10位,12位,16位可编程,由TBCTL寄存器的CNTLx两位来配置,而定时器A的计数长度是固定的16位; (2)TimerB没有实现定时器A中的SCCI功能位的功能; (3)TimerB在比较模式下的捕获/比较寄存器功能与TimerA不同,增加了捕获比较锁存器; (4)有些芯片型号当中TimerB输出实现了高阻抗输出; (5)比较模式的原理有所不同:TimerA当中CCRx寄存器当中保存与TAR相比较的数据,而在TimerB 当中CCRx中保存要比较的数据,但并不直接与定时器TBR相比较,而是将CCRx当中的数据锁存到相应的锁存器之后,由锁存器与TBR相比较。从捕获/比较寄存器相比较锁存器传输数据的过程的时间也是可编程的,可以是写入比较捕获寄存器之后立即传输,也可有一个定时器来触发传输。(6)TimerB支持多种同步的定时功能,多重比较捕获功能和多重波形输出功能(PWM波)。而且,通过对比较数据的两级缓冲,可实现多个PWM波同步周期更新。

2.TimerB的逻辑结构图: 定时器B的逻辑结构基本与定时器A相同。

MSP430定时器输出PWM方波

定时器A输出方波 1、定时器的PWM输出8种模式 输出模式0输出模式:输出信号OUTx由每个捕获/比较模块的控制寄存器CCTLx中的OUTx位定义,并在写入该寄存器后立即更新。最终位OUTx直通。 输出模式1置位模式:输出信号在TAR等于CCRx时置位,并保持置位到定时器复位或选择另一种输出模式为止。 输出模式2 PWM翻转/复位模式:输出在TAR的值等于CCRx时翻转,当TAR的值等于CCR0时复位。 输出模式3 PWM置位/复位模式:输出在TAR的值等于CCRx时置位,当TAR的值等于CCR0时复位。 输出模式4翻转模式:输出电平在TAR的值等于CCRx时翻转,输出周期是定时器周期的2倍。 输出模式5复位模式:输出在TAR的值等于CCRx时复位,并保持低电平直到选择另一种输出模式。 输出模式6 PWM翻转/置位模式:输出电平在TAR的值等于CCRx时翻转,当TAR值等于CCR0时置位。 输出模式7 PWM复位/置位模式:输出电平在TAR的值等于CCRx时复位,当TAR的值等于CCR0时置位。 下图是增计数模式下的输出波形:

2、程序:(TA定时器输出1K的方波) void TAPWM(void) { //引脚设置(暂时使用P1.2输出一路PWM) P1SEL |= BIT2; //TA1从P1.2输出 P1DIR |= BIT2; //TA1从P1.2输出 //P2SEL |= BIT0; //TA2从P1.2输出 //P2DIR |= BIT0; //TA2从P1.2输出 TACTL |= MC_1 +TASSEL_1; //时钟源选择ACLK,增计数模式TA设置 TACCTL1 = OUTMOD_7; //模式7 高电平PWM输出PWM设置 //TACCTL2 = OUTMOD_7; //模式7 高电平PWM输出 TACCR0 = 33-1; //PWM总周期=32个ACLK周期约等于1000Hz 设置PWM的周期 TACCR1 = 16; //TA1 占空比= 16/32=50% 设置占空比 //TACCR2 = 16; //TA2 占空比= 16/32=50% } 软件改变TACCR0即可改变PWM的周期,改变TACCR1或者TACCR2即可改变占空比

MSP430F149的定时器A操作

MSP430F149的定时器A定时操作 1)定时器A的图解 图1 定时器A图解 2)定时器A的四种计数模式。 1.停止模式。 2.增计数模式。(产生两个中断标志) 也就是当计数到跟TACCR0一样的时候,就返回0,重新计数。当计数到TACCR0的同时产生一个中断标志CCIFG,而当计数器溢出返回零的同时又同时产生一个中 断标志TAIFG。如图:

图2 增计数模式的波形图 3.连续计数模式。(产生一个中断标志) 也就是计数器将直接计数到计数器所能计数的最大值0FFFFH之后重新返回零,再次计数。返回零的同时产生一个TAIFG中断标志。如图: 4.增减计数模式。(产生两个中断标志) 也就是当计数器计数到跟TACCR0一样的之后,然后从TACCR0开始又减少,直到为零,然后又开始增。当计数跟TACCT0一样的时候产生一 个中断标志CCIFG,当减到为零的时候又产生一个中断标志TAIFG。如图: 注意:当重新写入TACCR0数值的时候,当新的数据大于原来的数值的时候,计数器将计数到新的数值才重新返回零;当新的数据小于原来的数值的时候,计数器将直接返回零重新计数。 3)定时器A的寄存器。 1.TACTL

●TASSELx:计时器A的时钟来源选择。 ●IDx:计时器A时钟的分频选择。 ●MCx:计时器A四种计数模式选择。 ●TACLR:计数器A的TAR计数清零,同时也可以清楚时钟分频器和计 数方向。 ●TAIE:TAIFG中断标志使能。在捕获模式下可以打开所有CCIFG的中 断使能。 ●TAIFG:中断标志位。 2.TAR 计数器的计数寄存器。 3.TACCTLx ●CMx:捕获模式选择。00:关闭;01:上升沿捕获;10:下降沿 捕获;11:上升下降沿捕获。 ●CCISx:捕获引脚选择。 ●SCS:选择捕获电平方式。0异步时钟;1同步时钟。 ●SCCI:锁存同步时钟输入端。也就是锁存EQUx的值,以供CPU 读取。 ●CAP:捕获模式和比较模式选择。0比较;1捕获。 ●OUTMODx:输出模式选择。 ●CCIE:CCIFG中断标志使能。 ●CCI:捕获当时输入信号的值。以供CPU读取。 ●OUT:当前输出的镜像,以供CPU读取。 ●COV:捕获溢出位,当第一次捕获的时候没有将寄存器里面的数 据读走,就又发生了一次捕获,所有溢出。(必须由软件清零) ●CCIFG:中断标志位。

MSP430 定时器A和B 中断定时 1秒操作

MSP430 定时器A 和B 中断定时1 秒操作 /********************TimerA0 1 秒定时TIMER B 1 秒定时溢出中断: MCLK = 2MHz DCOCLKLFXT1 = 32768Hz ACLK***********************/ #include unsigned int i;unsigned int times,times_b;unsigned int sec; /***** 定时器A 初使化*******/void TimerA_Init(void){TACTL = TASSEL_1 + ID0 + TACLR ; //ACLK=32768Hz ,清除tar ,2 分频CCTL0 = CCIE; //CCR0 = 819; // (1/32768)*819 =20 ms ??TACTL |= MC0; //增计数}/**** 定时器 B 初使化*****/void TimerB_Init (void){TBCTL = TBSSEL_1 + ID0 + TBCLR ; //ID_2 + ID1 +TBCCTL0 = CCIE; // INTERRUPT ENABLETBCCR0 = 819; //TBCTL |= MC0;}/***** 秒测试 1 秒响一下********/void Sec_Beep(void) //beep every second{ if(sec==1){ sec = 0; P5OUT – 0x10;}}void main( void ){times = 20;times_b = 20;WDTCTL = WDTPW + WDTHOLD;// SYstem clockDCOCTL = 0x60;BCSCTL1 = 0x86;//XT20FF ,XTS=0 LOW FREQ , RESEL=6 DCOCLK=2MHz// XT2on, XTS DIVA.1 DIVA.0 XT5V RSEL.2 RSEL.1 RSEL.0// 1 0 0 0 0 1 1 0BCSCTL2 = 0x00; //MCLK = DCOCLK, DIVM=0, SMCLK=CCOCLK ,DIVS =0P1DIR |= 0x02; //p1.2 OUTP5DIR |= 0x10; //P5.4 OUTTimerA_Init(); //定时器初使化TimerB_Init();_EINT(); // interrupt enablefor(;;) { _BIS_SR(LPM3_bits); _NOP();}} /****** 定时器 A 中断处理***********/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){ times--;if(times == 0){ times = 20; sec=1; Sec_Beep();}}/****** 定时器B 中断 处理***********/#pragma vector = TIMERB0_VECTOR__interrupt void Timer_B0 (void){ times_b--; if(times_b == 0) { times_b = 20; P1OUT – 0x02; }}

MSP430定时器A中文超级详解

文章转载自网络-----------------感谢原作者的辛勤奉献 MSP430的定时器中有比较捕获 比较模式: 这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx 置一,同时产生中断。若中断允许未开启则只将中断标志位CCIFGx置一。 例子:比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断处理。 捕获模式: 利用外部信号的上升沿、下降沿或上升下降沿触发来测量外部或内部事件,也可以由软件停止。捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC。完成捕获后相应的捕获标志位CCIFGx置一 捕获模式的应用: 利用捕获源的来触发捕获TAR的值,并将每次捕获的值都保存到TACCRx 中,可以随时读取TACCRx的值,TACCRx是个16位的寄存器,捕获模式用于事件的精确定位。如测量时间、频率、速度等 例子:利用两次捕获的值来测量脉冲的宽度。或捕获选择任意沿,CCISx=”11“(输入选择VCC),这样即当VCC与GND发生切换时产生捕获条件 结合利用:异步通讯

同时应用比较模式和捕获模式来实现UART异步通信。即利用定时器的比较模式来模拟通讯时序的波特率来发送数据,同时采用捕获模式来接收数据,并及时转换比较模式来选定调整通信的接受波特率,达到几首一个字节的目的 ---------------------------------------- 利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。 本例程用到了定时器A的CCI1A端口(例如MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。在实际应用中可根据例程中的start,end,overflow三个变量来计算脉冲宽度。此功能模块在实际产品应用中体现出有较高的应用价值。 2-例程 #include unsigned int start,end; unsigned char overflow; void main (void) { WDTCTL = WDTPW+WDTHOLD; //关闭看门狗定时器 P1DIR = BIT0+BIT4; //设置P1.0方向为输出 P1SEL = BIT2; //设置P1.2端口为功能模块使用 TACTL = TASSEL0+TACLR+TAIE+MC1; //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式

MSP430F149定时器B讲解

MSP430F149定时器B 1.定时器B模块: TimerB与TimerA大部分相同,不同点在于定时器B的捕获/比较单元增加了锁存器。 二者区别: (1)TimerB计数长度为8位,10位,12位,16位可编程,由TBCTL寄存器的CNTLx两位来配置,而定时器A的计数长度是固定的16位; (2)TimerB没有实现定时器A中的SCCI功能位的功能; (3)TimerB在比较模式下的捕获/比较寄存器功能与TimerA不同,增加了捕获比较锁存器; (4)有些芯片型号当中TimerB输出实现了高阻抗输出; (5)比较模式的原理有所不同:TimerA当中CCRx寄存器当中保存与TAR相比较的数据,而在TimerB 当中CCRx中保存要比较的数据,但并不直接与定时器TBR相比较,而是将CCRx当中的数据锁存到相应的锁存器之后,由锁存器与TBR相比较。从捕获/比较寄存器相比较锁存器传输数据的过程的时间也是可编程的,可以是写入比较捕获寄存器之后立即传输,也可有一个定时器来触发传输。(6)TimerB支持多种同步的定时功能,多重比较捕获功能和多重波形输出功能(PWM波)。而且,通过对比较数据的两级缓冲,可实现多个PWM波同步周期更新。 2.TimerB的逻辑结构图:

定时器B的逻辑结构基本与定时器A相同。 3.定时器B的寄存器: 寄存器相关位的配置过程参考定时器A和数据手册。

4.定时器B的比较功能 当定时器B工作在比较模式时,将数据写入捕获比较锁存器TBCCRx当中,当TBCCTLx当中的CLLDx位决定的装载事件的发生时,TBCCRx中的数据会自动地传输到比较寄存器当中。 5.TI提供的例程: // // // // // MSP430F149 // ----------------- // /|| XIN|- // | | | HF XTAL (455k - 8MHz) // --|RST XOUT|- // | | // | P4.1/TB1|--> CCR1 - 75% PWM // | P4.2/TB2|--> CCR2 - 25% PWM // // M. Buccini // Texas Instruments Inc. // Feb 2005 // Built with IAR Embedded Workbench Version: 3.21A //******************************************************************************

MSP430_定时器A的使用

第四讲定时器A 的使用 MSP430F413芯片中含有TimerA3模块,如图1-2所示。其常用的外引线有三条:TACLK 、 TA1 和 TA2。 TACLK :定时器_A 输入时钟(48脚),与P1.6和ACLK 输出共用同一引脚。 TA1 :定时器_A 的第一通道输入、输出引脚(51脚)。捕获方式:CCI1A 输入;比较方式: OUT1输出。 TA2 :定时器_A 的第二通道输入、输出引脚(45脚)。捕获方式:CCI2A 输入;比较方式: 0UT2输出。 1定时器A 功能及结构 定时器A 基本结构是一个十六位计数器,由时钟信号驱动工作,结构框图如图 4-1所示。 TPSSEL1 TPSSELO C CM 11 CCM 10 CCJ?A ―O CCIZB —0 C4M> —6 VCC "& 图4-1定时器A 结构图 定时器A 具有多种功能,其特性如下: (1) 输入时钟可以有三种选择,可以是慢时钟(ACLK )、快时钟(SMCLK 与单片机主时 钟同频)和外部时钟。 (2) 能产生的定时中断、定时脉冲和 PWM (脉宽调制)信号,没有软件带来的误差。 TACLK ― ACLK ―O >7 MCLK —-O 弄 INCL K ―O X ID1 II KJftCLR Carrjr'Zcr o Timer EquO ---------------- ? 设富TMFC CCISil J CCJ&4 —r CCJOB —c OID —13 Wx —13 CCISOO F —H 比投罟 o 比血 CCMD1 CCMOO CCIS11 CCIS10 CC11A —4 CC11B ―° GHD —0 vcc —° £ 炳捉,比戕餐存辭(riw QF.10? 3MOI m/mo LQUO 捕怩'比牧蒂存幣WIU OMI? OM11 CM10 CCI2 CCM21 CCM20 LUU?

msp430定时器控制led闪烁

第四讲定时器控制LED闪烁 一、定时器简介 定时器,简单的说,就像单片机内的一个闹钟。它以单片机的时钟作为计数基准,根据计数数值不同来改变定时时间,并可以设置使时间满足定时条件时进行一系列操作。 下面是msp430g2553的datasheet对其定时器的介绍: 从这里开始,我们介绍的部件往往会涉及很多寄存器,初学者往往由于配置不全,不能得到想要的效果。因此,学习这一部分,尽量参考用户手册和相关例程进行分析。 二、定时器A配置 我们要实现使用定时器控制LED闪烁,需要使用定时器中断来控制。定时器中断与外部中断的具体原理一样,都是从主程序中断,处理完中断服务函数再返回。区别只在于触发条件,定时器中断的触发条件是定时器计数溢出(计数数值达到设定数值)。 这是用户手册对定时器A的介绍: 16位定时/计数,4种计数模式,可选时钟源,2到3个捕获比较寄存器,异步输入输出锁存,定时中断寄存器。 16位定时/计数,是指计数数值范围是0-65535,与设置好的时钟源来组合成一定的定时时长。如时钟周期为1us,那么要定时1ms,计数数值就需要设置为1000。 上图是定时模式的介绍,一般采用增计数模式即可,即每次定时从0计数到设置的数值。 定时器配置最重要的部分在于TACLR寄存器,其16位所代表的含义如下图,具体配置内容可从用户手册和头文件内查出,这里不做一一介绍,在例程中再进行讲解。

三、实践操作 这里,由于我们的单片机默认时钟为DCO 1MHZ,16位定时器计数数值65536,所以最大定时时长为65.536ms。在这里我们进行0.05s的定时,每隔0.05s触发一次中断函数,使LED亮0.05s,灭0.05s,并交替进行。 为了方便调试,我们先使用延时的方法使LED闪烁,确认单片机以及LED工作正常。顺便复习一下对IO的操作。 下面就到定时器的核心配置了。 我们要设置定时器,核心部分当然是TACTL寄存器,它是定时器工作的关键,涉及到定时器所采用的时钟周期以及计数方式。 接下来设置定时时间,即计数数值TACCR0。 当然为了使用定时中断,要记得打开中断。 具体配置如下图所示,相关定义可从头文件中查出。其中CCIE是指打开定时器中断,最后的_EINT();是打开总中断,两者缺一不可。TASSEL_2可从头文件中查出,指定时器A采用子系统时钟SMCLK,在不做设置时为默认DCO(数控振荡器)的值1MHZ。MC_2指采用增计数模式。而数值50000*时钟周期1us=50ms,为我们的定时时长。

msp430的四种计时器程序

基于msp430g2553定时器详解1 已有2682 次阅读2012-8-10 21:11 | /*#include "msp430g2553.h" unsigned char num; void main() { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZ CCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断CCR0 =12000; //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1s TA0CTL = TASSEL_1 +TACLR+MC_1; // 设置定时器A控制寄存器, // TASSEL_1选择辅助时钟ACLK,TASSEL_2选择子系统时钟SMCLK,与dco有关; // TACLR=0x0004,清除定时器A计数器 //TACTL |= MC0; //设置定时器A控制寄存器,MC0=0x0010,使计数模式为增计数P1SEL&=~BIT6; //P1.6为I/O口 P1DIR |=BIT6; //P1.6为输出 _EINT(); //使能中断,这是一个C编译器支持的内部过程。 while(1); //无限次while循环 } #pragma vector=TIMER0_A0_VECTOR//固定的格式 __interrupt void Timer_A (void) //定时器A的CC0中断处理程序必须是没有返回值的{ P1OUT ^= BIT6; //将P3.7引脚取反,就是使发光二极管闪烁 }*/ //使用主系统做为时钟源时,可用用num配合使用,达到一秒定时, //也可以通过BCSCTL2 |= SELM_1 + DIVM_3; 选择MCLK并且8分频 #include "msp430g2553.h" unsigned char num; void main() { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; //主系统时钟切换为外部高速晶振 if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) {

Msp430定时器的介绍及其基本应用

Msp430定时器的介绍及其基本应用 Msp430单片机一共有5种类型的定时器。 看门狗定时器(WDT)、基本定时器(Basic Timer1)、8位定时器/计数器(8-bit Timer/Counter)、定时器A(Timer_A)和定时器B(Timer_B)。但是这些模块不是所有msp430型号都具有的功能。 1、看门狗定时器(WDT) 学过电子的人可能都知道,看门狗的主要功能就是当程序发生故障时能使受控系统重新启动。 msp430中它是一个16位的定时器,有看门狗和定时器两种模式。 2、基本定时器(Basic Timer1) 基本定时器是msp430x3xx和msp430F4xx系列器件中的模块,通常向其他外围提供低频控制信号。它可以只两个8位定时器,也可以是一个16位定时器。 3、8位定时器/计数器(8-bit Timer/Counter) 如其名字所示,它是8位的定时器,主要应用在支持串行通信

或数据交换,脉冲计数或累加以及定时器使用。 4、16位定时器A和B 定时器A在所有msp430系列单片机中都有,而定时器B在msp430f13x/14x和msp430f43x/44x等器件中出现,基本的结构和定时器A是相同的,由于本人最先熟悉并应用的是定时器A所以在这里就主要谈一下自己对定时器A的了解和应用。 定时器A是16位定时器,有4种工作模式,时钟源可选,一般都会有3个可配置输入端的比较/捕获寄存器,并且有8种输出模式。通过8种输出模式很容易实现PWM波。 定时器A的硬件电路大致可分为2类功能模块: 一:计数器TAR 计数器TAR是主体,它是一个开启和关闭的定时器,如果开启它就是一直在循环计数,只会有一个溢出中断,也就是当计数由0xffff到0时会产生一个中断TAIFG。 二:比较/捕获寄存器CCRX 如何实现定时功能呢?这就要靠三个比较/捕获寄存器了(以后用CCRx表示)。 当计数器TAR的计数值等于CCRx时(这就是捕获/比较中的比

MSP430_定时器Timer_A的讲解

电子设计大赛准备之msp430单片机定时器Timer_A Timer_A定时器: 注:MSP430有两个16位定时器Timer_A和Timer_B.二者基本相同。 主要有TACTL,TAR,CCTL0,CCR0,CCTL1,CCR1,CCTL2,CCR2,TAIV几个寄存器。其中最主要的是TACTL寄存器,它决定Timer_A的输入时钟信号,Timer_A的工作模式,Timer_A的开启与停止,中断的申请等。 定时器A大致可分为四个功能模块:计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2.计数器是主体,它是一个开启和关闭的定时器,如果开启它就是一直在循环计数,只会有一个溢出中断,也就是当计数由0xffff到0时会产生一个中断。那怎么实现定时功能呢?这就要靠三个比较/捕获寄存器了以后用CCRx表示。CCR0比较特殊,通过他可以改变计数器的最大计数值,也就是当计数器计数到CCR0的值时自动会将计数器清零。但这需要设置相应的工作模式,模式列表如下: 0——停止模式,用于定时器的暂停1——增计数模式,计数器计数到CCR0,再清零计数 2——连续计数模式,计数器增计数到0xffff,再清零计数3——增/减计数模式,增计数到CCR0,再减计数到0 当计数器计数到CCR0时,CCR0单元会产生一个中断。同样当计数器计数到CCR1和CCR2时,两个单元也都会个产生一个中断。这样我们可以通过定时器A得到三个定时时间了。 看程序中的定时器初始化模块。CCTLx是相应比较/捕获寄存器的控制寄存器。它可对比较/捕获寄存器进行设置,在这里只用到比较功能,也就是当计数到CCRx时产生中断,由于CCTLx 默认的是比较功能,所以一般也就只用到CCIE这个控制字,就是开启相应比较器的中断。CCRx就是相应比较器的值。 下面介绍几个Timer_A的重要寄存器: TACTL寄存器: 15~109876543210 未用SSEL1 SSEL0 ID1 ID0 MC1 MC0 未用CLR TAIE TALFG SSEL_1 SSEL_0 是时钟源的选择 0——TACLK,使用外部引脚信号作为输入 1——ACLK,辅助时钟 2——SMCLK,子系统主时钟 3——INCLK,外部输入时钟 对TACTL进行模式设置的同时也开启了定时器,要停止只需把MC_0赋值给TACTL就可以。 ID1 ID0 是时钟源的分频选择 00——不分频 01——2分频 10——4分频 11——8分频 MC1 MC0 是模式选择 0——停止模式,用于定时器的暂停 1——增计数模式,计数器计数到CCR0,再清零计数2——连续计数模式,计数器增计数到0xffff,再清零计数 3——增/减计数模式,增计数到CCR0,再减计数到0 CLR——————定时器清楚位

相关主题
文本预览
相关文档 最新文档