MSP430G2433定时器开启1秒计时
- 格式:docx
- 大小:10.48 KB
- 文档页数:1
第四讲定时器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)停止模式:停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。
当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。
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同步/异步捕获模式选择位,然后连接到捕获比较寄存器。
对于学习新的单片机来说,就我个人意见在知道基本功能后应该先掌握定时器的用法,可以能帮助你很快的掌握单片机的用法并尽快能进行单片机的应用,所以对于430我也同样先掌握定时器的用法。
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的基本用法。
程序如下:void init_TimerA ( void ){CCTL0 = CCIE; // 开启比较器0中断CCR0 = 32768; // 1S秒的定时CCTL1 = CCIE; // 开启比较器1中断CCR1 = 100; // 3.66mS显示延迟TACTL = TASSEL_1 + MC_1; // 开启定时器}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0(void){time_flag = 1; // 时间变动标志if(time_stop == 1) // 设置模式标志time[0] ++; // 秒加1start_ADC12(); // 开启AD}#pragma vector = TIMERA1_VECTOR__interrupt void Timer_A1 ( void ){unsigned char tmp;tmp = TAIV;if ( tmp == 2 ) // 比较器1中断{led_flag = 1; // 刷新显示标志CCR1 += 100; // 3.35mSif ( CCR1 >= 32768 )CCR1 -= 32768;}if ( tmp == 4 ) // 比较器2中断{keyread_flag = 1; // 读取键值标志CCR2 += 5000; // 152.6mS长按键自加间隔if ( CCR2 >= 32768 )CCR2 -= 32768;}LPM3_EXIT; // 退出低功耗}定时器A大致可分为四个功能模块:计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。
程序说明:由于DS18B20的时序要求比较严格,即使同一程序,在不同平台或者在同一平台不同晶振频率下,都很容易出现调试出现错误,最好的解决办法就是通过示波器查看其驱动时序是否按照说明书的要求。
本程序使用的平台是MSP430G2433,使用内部晶振1M频率,MSP430G2433有内部上拉电阻,DS18B20可以不用接上拉电阻。
#include "io430.h"#include "in430.h"#include <stdlib.h>#include "DS18B20.h"unsigned int temperature;void UartPutchar(unsigned char c);unsigned char UartGetchar();//-----------------------------------------------------------------------------//主函数void main (void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 = CALBC1_1MHZ; // Set DCODCOCTL = CALDCO_1MHZ;_EINT(); //使能全局中断while(1){temperature=Do1Convert();}}///////DS18B20.hvoid DelayNus(unsigned int n);unsigned char Init_18B20(void);void Write_18B20(unsigned char wdata);unsigned char Read_18B20(void);void Skip(void);void Convert(void);void Read_SP(void);unsigned int ReadTemp(void);unsigned int Do1Convert(void);unsigned char DS18B20_ReadBit(void);void DS18B20_WriteBit(unsigned char Data);//DS18B20.c#include "io430.h"#include "in430.h"typedef unsigned char uchar;typedef unsigned int uint;#define DQ1 P1OUT |= BIT0#define DQ0 P1OUT &= ~BIT0#define DQ_in P1DIR &= ~BIT0#define DQ_out P1DIR |= BIT0#define DQ_val (P1IN & BIT0)/*******************************************函数名称:DelayNus功能:实现N个微秒的延时参数:n--延时长度返回值:无说明:定时器A的计数时钟是1MHz,CPU主频8MHz 所以通过定时器延时能够得到极为精确的us级延时********************************************/void DelayNus(uint n){CCR0 = n;TACTL |= MC_1; //增计数到CCR0while(!(TACTL & BIT0)); //等待TACTL &= ~MC_1; //停止计数TACTL &= ~BIT0; //清除中断标志}/*******************************************函数名称:Init_18B20功能:对DS18B20进行复位操作参数:无返回值:初始化状态标志:1--失败,0--成功********************************************/ uchar Init_18B20(void){uchar Error;DQ_out;_DINT();DQ0;DelayNus(500);DQ1;DelayNus(55);DQ_in;if(DQ_val){Error = 1; //初始化失败}else{Error = 0; //初始化成功}DQ_out;DQ1;_EINT();DelayNus(400);return Error;}/******************************************* 函数名称:Write_18B20功能:向DS18B20写入一个字节的数据参数:wdata--写入的数据返回值:无********************************************/ void Write_18B20(uchar wdata){uchar i;_DINT();DQ_out;DQ1;for(i = 0; i < 8;i++){DQ0;if(wdata & 0X01) DQ1;else DQ0;wdata >>= 1;DelayNus(50); //延时50usDQ_out;DQ1;_NOP();_NOP();_NOP();}_EINT();}/******************************************* 函数名称:Read_18B20功能:从DS18B20读取一个字节的数据参数:无返回值:读出的一个字节数据********************************************/ uchar Read_18B20(void){uchar i;uchar temp = 0;_DINT();for(i = 0;i < 8;i++){temp >>= 1;DQ0;_NOP();_NOP();DQ1;_NOP();DQ_in;if(DQ_val) temp |= 0x80;DelayNus(10); //延时45us_NOP();_NOP();_NOP();_NOP();DQ_out;DQ1;_NOP();_NOP();_NOP();_NOP();DelayNus(10); //延时10us }_EINT();return temp;}/******************************************* 函数名称:Skip功能:发送跳过读取产品ID号命令参数:无返回值:无********************************************/ void Skip(void){Write_18B20(0xcc);}/******************************************* 函数名称:Convert功能:发送温度转换命令参数:无返回值:无********************************************/ void Convert(void){Write_18B20(0x44);}/******************************************* 函数名称:Read_SP功能:发送读ScratchPad命令参数:无返回值:无********************************************/ void Read_SP(void){Write_18B20(0xbe);}/******************************************* 函数名称:ReadTemp功能:从DS18B20的ScratchPad读取温度转换结果参数:无返回值:读取的温度数值********************************************/ uint ReadTemp(void){uchar temp_low;uint temp;temp_low = Read_18B20(); //读低位temp = Read_18B20(); //读高位temp = (temp<<8) | temp_low;return temp;}/*******************************************函数名称:ReadTemp功能:控制DS18B20完成一次温度转换参数:无返回值:测量的温度数值********************************************/ uint Do1Convert(void){uchar i;for(i = 20;i > 0;i--)DelayNus(60000); //延时800ms以上do{i = Init_18B20();}while(i);Skip();Convert();for(i = 20;i > 0;i--)DelayNus(60000); //延时800ms以上do{i = Init_18B20();}while(i);Skip();Read_SP();uint t=0;float tt=0;t=ReadTemp();tt=t*0.0625; //精确到0.0625t= tt*10; //放大100倍输出return t;}。
#include "msp430g2553.h"//定时一秒unsigned char num;void main(){WDTCTL = WDTPW + WDTHOLD;BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZCCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断CCR0 =12000; //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1sTA0CTL = TASSEL_1 +TACLR+MC_1; // 设置定时器A控制寄存器,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引脚取反,就是使发光二极管闪烁}#include "msp430g2553.h"unsigned int times,time1;void TimerA_Init(void){TACTL = TASSEL_1 + ID0 + TACLR ;CCTL0 = CCIE;CCR0 = 16432;TACTL |= MC0;}int main( void ){WDTCTL = WDTPW + WDTHOLD; TimerA_Init(); //定时器初使化P1DIR=0x01;_EINT(); // interrupt enablefor(;;);}#pragma vector = TIMER0_A0_VECTOR __interrupt void Timer_A (void){times++;if(times == 2){times = 0;P1OUT^=BIT0;}。
第四讲定时器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)停止模式:停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。
当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。
MSP430单片机"秒表" 程序(完整)/*******************************************************基于MSP430F449单片机的秒表*功能:秒计时,8位数码管显示,包括小时、分钟、秒和毫秒*此程序同样适用于其他系列单片机*by:duyunfu1987******************************************************/#include "msp430x44x.h"#define DPYOUT P3OUT //数码管的段选输出口#define DPYCOM P2OUT //38译码器的ABC输入#define OPENOUT P2OUT |= BIT3 //74HC573使能锁存段选#define CLOSEOUT P2OUT &= ~BIT3//74HC573无效int hour,min,sec,ms; //缓冲区定义,小时、分钟、秒、毫秒int count = 0; //2ms计数,计到5时ms增1//共“阴”极数码管的码表unsigned char LED7CC[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//延时n(us)void delay_us(int n){ while(n-- >0)_NOP();}//延时n(ms)void delay_ms(int dms){ int i;while(dms-- >0){ for(i=0;i<250;i++);}}//初始化缓冲区与IO口void Init(){hour = 0;min = 0;sec = 0;ms = 0;P2SEL = 0;P3SEL = 0;P2DIR |= BIT0+BIT1+BIT2+ BIT3;//A B C 使能位P2DIR &= ~(BIT4+BIT5+BIT6); //按键P3DIR = 0xff;P3OUT = 0x00;}//8位数码管动态显示函数void display(){DPYOUT = 0;_NOP();DPYOUT = LED7CC[ms%10]; DPYCOM = 7;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[ms/10]; DPYCOM = 6;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec%10]|0x80; DPYCOM = 5;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[sec/10]; DPYCOM = 4;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min%10]|0x80; DPYCOM = 3;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[min/10]; DPYCOM = 2;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour%10]|0x80; DPYCOM = 1;OPENOUT;CLOSEOUT;DPYOUT = LED7CC[hour/10]; DPYCOM = 0;OPENOUT;CLOSEOUT;}//按键处理函数void key_deal(int key){switch(key){case 0x60: //START--开始计时{ BTCTL = BT_ADL Y_2;IE2 |= BTIE;_EINT();}break;case 0x50: //STOP -- 停止BTCTL |= BTHOLD; break;case 0x30: //CLEAR--缓冲区清零{ hour = 0;min = 0;sec = 0;ms = 0;}break;default : break;}display();}//主函数void main( void ){int key;// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;FLL_CTL0 |= XCAP18PF;Init();while(1){if((key = P2IN & 0x70)!=0x70){delay_ms(10);if((key = P2IN & 0x70)!=0x70){ key_deal(key);}}display();}}//BT中断服务程序,2ms计时#pragma vector = BASICTIMER_VECTOR__interrupt void BT_ISR(){count ++;if(count == 5){ count = 0;ms ++;}if(ms == 100){ms = 0;sec ++;if(sec == 60){sec = 0;min ++;if(min == 60){min = 0;hour ++;if(hour == 24)hour = 0;}}}}。