MSP430单片机定时器A结构及其应用范例
1-简介
简介MSP430单片机定时器A结构及其应用范例。
2-定时器模块
在MSP430系列单片机中带有功能强大的定时器资源,这定时器在单片机应用系统中起到重要的作用。利用MSP430(以下称为430)单片机的定时器可以用来实现计时,延时,信号频率测量,信号触发检测,脉冲脉宽信号测量,PWM信号发生。另外通过软件编写可以用作串口的波特率发生器。后面我们将用定时器A作为一个波特率发生器,来编写一个串口例程给初学者参考。以加强初学者对定时器A的理解和应用。
在430的大系列产品中,不同的子系列产品定时器资源有所不同;在F11X,F11X1中是不带定时器B资源的。430的定时器主要分为3部分模块:看门狗定时器,定时器A,定时器B。定时器A主要资源特点有16位定时计数器,其计数模式有4种。多种计数时钟信号供选择。3个可配置输入的捕获/比较功能寄存器和8种输出模式的3个可配置输出单片。以上各块定时器资源可作多种组合使用,以实现强大的功能。
定时器资源功能说明
(1)看门狗定时器(WDT):主要用于程序在生错误时用作单片机系统复位重起的。另外,也可作为一个基本定时器使用。
(2)定时器A:作基本定时器使用,结合捕获/比较功能模块可实现时序控制,可编程波形信号发生输出。可作串口波特率发生器使用。
(3)定时器B:作基本定时器使用,与定时器A基本相同,但是功能方面有某些功能会比A增强些。详情请看关于定时器B应用范例。
3-定时器A模块结构
4-定时器A--基础应用例程(1)
//例程描述:利用定时器定时功能,实现P1.0方波输出。
#include
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗WDT,不使用内部看门狗定时器。
P1DIR |= 0x01; //设置P1.0口方向为输出。
CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。
CCR0 = 50000; //捕获/比较控制寄存器CCR0初值为5000。
TACTL = TASSEL_2 + MC_2; //设置定时器A控制寄存器TACTL,使时钟源选择为SMCLK辅助时钟。
_BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断
}
//定时器A 中断服务程序区
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; //P1.0取反输出
CCR0 += 50000; //重新载入CCR0捕获/比较数据寄存器数据
}
//例程1结束--------------------------------------------------------------------------
基础应用例程(2)
//例程描述:利用定时器定时功能,实现P1.0方波输出。
// 需要注意的是定时器中断程序,采用向量查询方式。
#include
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗WDT
P1DIR |= 0x01; // 设置P1.0口方向为输出。
TACTL = TASSEL_2 + MC_2 + TAIE; // 时钟源选择为SMCLK,选择计数模式,定时器中断开
_BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断
}
// Timer_A3 中断向量(TAIV)处理
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch( TAIV )
{
case 2: break; //CCR1不使用
case 4: break; //CCR2不使用
case 10: P1OUT ^= 0x01; //溢出
break;
}
}
MSP430单片机学习小记1--基础定时器
基于MSP430单片机,TI公司采用的是模块化的内部结构,每个模块,在各个不同型号的单片机内都是相同的,相同的寻址,相同的操作方式,模块有限,于是一个一个开始进行整理。
本文引用地址:http://www.eepw.com.cn/article/201608/295905.htm
第一个模块:基础定时器
参考资料:数据手册 ,使用手册 ,示例程序,以及那份特别特别有用的头文件。
Exampli Code:
进入中断示例程序
/************************************************************/
1;时钟源为ACLK,为单片机提供1/4S定时中断,LCD提供512HZ刷新频率
BTCTL=BT_ADLY_250+BT_fLCD_512; //250MS延时加512HZ刷新频率。
备注:MSP430上电复位后,BT的寄存器值并不会恢复成一个默认值
而是保持不变,因此,每次上电的时,均要进行配置,而且最好直接采用赋值
语句。一条语句足矣
/************************************************************/
/************************************************************/
/************************************************************/
/************************************************************/
Void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //close the wdtdog
FLL_CTL0&= ~XTS_FLL; //可省略,默认选择低频晶振
FLL_CTL0|=XCAP18PF; //配置内部晶振
P1DIR|=BIT0; //OUTPUT
BTCTL=BT_ADLY_250+BT_fLCD_512; //250MS延时加512HZ刷新频率。
IE2|=BTIE; //打开中断
__EINT();
While(1)
{;}
}
/************************************************************/
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer_ISR(void)
{
P1OUT ^= 0x01; // Toggle P1.0
}
/************************************************************
参考的头文件:
* BASIC TIMER 基础定时器的功能概述
BASIC TIMER 能在无需CPU干扰的情况下产生2的N次方个定时周期
如果我们采用32768KHZ =1/2^15次方,所以,最长的定时时间可以达到
2S钟
************************************************************/
#define __MSP430_HAS_BT__ /* Definition to show that Module is available */
#define BTCTL_ (0x0040u) /* Basic Timer Control * /SFR
DEFC( BTCTL , BTCTL_)
/* 位定义The bit names have been prefixed with "BT" */
#define BTIP0 (0x01)
#define BTIP1 (0x02)
#define BTIP2 (0x04)
#define BTFRFQ0 (0x08)
#define BTFRFQ1 (0x10)
#define BTDIV (0x20) /* fCLK2 = ACLK:256 */
#define BTHOLD (0x40) /* BT1 is held if this bit is set *,如果这个位置1,则暂停/
利用 BTCTL|=BTHOLD; //可以使其暂停。
#define BTSSEL (0x80) /* fBT = fMCLK (main clock) 位定义*/
备注:BTSSEL ,与BTDIV 确定是否对信号源进行分频。分频后它的最长延时如果使用32768KHZ的话,可以达到2S
注:为LCD提供的刷新频率没有使用分频。
快捷定义:
#define BTCNT1_ (0x0046u) /* Basic Timer Count 1 */
DEFC( BTCNT1 , BTCNT1_)
#define BTCNT2_ (0x0047u) /* Basic Timer Count 2 */
DEFC( BTCNT2 , BTCNT2_)
/* Frequency of the BTCNT2 coded with Bit 5 and 7 in BTCTL */
#define BT_fCLK2_ACLK (0x00)
#define BT_fCLK2_ACLK_DIV256 (BTDIV)
#define BT_fCLK2_MCLK (BTSSEL)
/* Interrupt interval time fINT coded with Bits 0-2 in BTCTL */
#define BT_fCLK2_DIV2 (0x00) /* fINT = fCLK2:2 (default) */
#define BT_fCLK2_DIV4 (BTIP0) /* fINT = fCLK2:4 */
#define BT_fCLK2_DIV8 (BTIP1) /* fINT = fCLK2:8 */
#define BT_fCLK2_DIV16 (BTIP1+BTIP0) /* fINT = fCLK2:16 */
#define BT_fCLK2_DIV32 (BTIP2) /* fINT = fCLK2:32 */
#define BT_fCLK2_DIV64 (BTIP2+BTIP0) /* fINT = fCLK2:64 */
#define BT_fCLK2_DIV128 (BTIP2+BTIP1) /* fINT = fCLK2:128 */
#define BT_fCLK2_DIV256 (BTIP2+BTIP1+BTIP0) /* fINT = fCLK2:256 */
/* Frequency of LCD coded with Bits 3-4 */
#define BT_fLCD_DIV32 (0x00) /* fLCD = fACLK:32 (default) */
#define BT_fLCD_DIV64 (BTFRFQ0) /* fLCD = fACLK:64 */
#define BT_fLCD_DIV128 (BTFRFQ1) /* fLCD = fACLK:128 */
#define BT_fLCD_DIV256 (BTFRFQ1+BTFRFQ0) /* fLCD = fACLK:256 */
/* LCD frequency values with fBT=fACLK */
#define BT_fLCD_1K (0x00) /* fACLK:32 (default) */
#define BT_fLCD_512 (BTFRFQ0) /* fACLK:64 */
#define BT_fLCD_256 (BTFRFQ1) /* fACLK:128 */
#define BT_fLCD_128 (BTFRFQ1+BTFRFQ0) /* fACLK:256 */
//ACLK提供时钟源,来提供LCD的刷新频率。
/* LCD frequency values with fBT=fMCLK */
#define BT_fLCD_31K (BTSSEL) /* fMCLK:32 */
#define BT_fLCD_15_5K (BTSSEL+BTFRFQ0) /* fMCLK:64 */
#define BT_fLCD_7_8K (BTSSEL+BTFRFQ1+BTFRFQ0) /* fMCLK:256 */
////MCLK提供时钟源,来提供LCD的刷新频率。
/* with assumed vlues of fACLK=32KHz, fMCLK=1MHz */
/* fBT=fACLK is thought for longer interval times */
#define BT_ADLY_0_064 (0x00) /* 0.064ms interval (default) */
#define BT_ADLY_0_125 (BTIP0) /* 0.125ms " */
#define BT_ADLY_0_25 (BTIP1) /* 0.25ms " */
#define BT_ADLY_0_5 (BTIP1+BTIP0) /* 0.5ms " */
#define BT_ADLY_1 (BTIP2) /* 1ms " */
#define BT_ADLY_2 (BTIP2+BTIP0) /* 2ms " */
#define BT_ADLY_4 (BTIP2+BTIP1) /* 4ms " */
#define BT_ADLY_8 (BTIP2+BTIP1+BTIP0) /* 8ms " */
#define BT_ADLY_16 (BTDIV) /* 16ms " */
#define BT_ADLY_32 (BTDIV+BTIP0) /* 32ms " */
#define BT_ADLY_64 (BTDIV+BTIP1) /* 64ms " */
#define BT_ADLY_125 (BTDIV+BTIP1+BTIP0) /* 125ms " */
#define BT_ADLY_250 (BTDIV+BTIP2) /* 250ms " */
#define BT_ADLY_500 (BTDIV+BTIP2+BTIP0) /* 500ms " */
#define BT_ADLY_1000 (BTDIV+BTIP2+BTIP1) /* 1000ms " */
#define BT_ADLY_2000 (BTDIV+BTIP2+BTIP1+BTIP0) /* 2000ms " */
//注:ACLK提供定时频率,利用宏定义进行设置延时。
/* fCLK2=fMCLK (1MHz) is thought for short interval times */
/* the timing for short intervals is more precise than ACLK */
/* NOTE */
/* Be sure that the SCFQCTL-Register is set to 01Fh so that fMCLK=1MHz */
/* Too low interval time results in interrupts too frequent for the processor to handle! */
#define BT_MDLY_0_002 (BTSSEL) /* 0.002ms interval *** interval times */
#define BT_MDLY_0_004 (BTSSEL+BTIP0) /* 0.004ms " *** too short for */
#define BT_MDLY_0_008 (BTSSEL+BTIP1) /* 0.008ms " *** interrupt */
#define BT_MDLY_0_016 (BTSSEL+BTIP1+BTIP0) /* 0.016ms " *** handling */
#define BT_MDLY_0_032 (BTSSEL+BTIP2) /* 0.032ms " */
#define BT_MDLY_0_064 (BTSSEL+BTIP2+BTIP0) /* 0.064ms " */
#define BT_MDLY_0_125 (BTSSEL+BTIP2+BTIP1) /* 0.125ms " */
#define BT_MDLY_0_25 (BTSSEL+BTIP2+BTIP1+BTIP0)/* 0.25ms " */
//选择fCLK2=fMCLK (1MHz)来提供时钟源而产生的时钟延时。适合比较短的延时。但是单片机就不能进入LPM3状态了。
/* Reset/Hold coded with Bits 6-7 in BT(1)CTL */
/* this is for BT */
//#define BTRESET_CNT1 (BTRESET) /* BTCNT1 is reset while BTRESET is set */
//#define BTRESET_CNT1_2 (BTRESET+BTDIV) /* BTCNT1 .AND. BTCNT2 are reset while ~ is set */
/* this is for BT1 */
#define BTHOLD_CNT1 (BTHOLD) /* BTCNT1 is held while BTHOLD is set */
#define BTHOLD_CNT1_2 (BTHOLD+BTDIV) /* BT1CNT1 .AND. BT1CNT2 are held while ~ is set */
/* INTERRUPT CONTROL BITS */
/* #define BTIE 0x80 */ 位于IE2中断控制位
/* #define BTIFG 0x80 */
相关问答
msp 430 看门狗 定时器 的定时时间可以自己设置吗,可以的话如何设置(请附程序,谢谢)?它的定时间隔是只有4个选项,是定死的。这个你看下用户指南寄存器就知道了。定时时间不一样的话,1是靠你的选项,二,就只能靠你选择的看门狗时钟快慢来调了。...
一般学汽车 单片机 需要哪些基础知识?以下内容,仅供参考:掌握定时器的使用,就可以用单片机实现时序电路,时序电路的功能强大,在工业和家用电气设备的控制中有很多应用。使用按钮输入信号...以下...
单片机 ,什么是串行口,什么是并行口? - 小葵的杂货铺 的回...串口数据是按1位为单位传输数据的口,51单片机是P3.0、P3.1组成串口。并口是以1字节为单位传输数据的口,51单片机一般以P0口扩展并口。两种接口都是...
老师们,可以推荐一下!气体脉冲检测哪家好,脉冲检测效果怎...[回答]即捕获交流信号的零点,并借助MSP430单片机内部的16位定时器A(TimerA)的脉冲捕获功能便能得到该交流信号的周期进而能得到它的频率。天津生产试验台...
钟表上,有时针,分针,秒针,还有什么针?为什么我看我家的表上有...[回答]估计还有一个闹钟的指针,用来设置闹钟时间的!
职工医保和居民医保有什么不同?参保对象不一样。职工医保的参保对象是所有用人单位职工。而居民医保,覆盖的是职工医保和新型农村合作医疗保险(农村户口)之外的所有居民。缴费方式及费用不...
得了食管癌出现咳嗽的现象之后要怎么办?_千问健康这个,有一位朋友的老母亲,最近米食不进,吃什么到喉咙处就咽不下去了,一直喊疼,还不停地咳嗽,有时还会咳出些血来,到医院检查后,说是得了食道癌,需要住院治疗才行...
小米三自动开关机在哪设置 - Augus痞哥 的回答 - 懂得小米手机没有自动关机,,开机到时可以通过关机闹钟来实行,,第一步,在小米3手机桌面打开“安全中心”图标进入。。第二步,点击电池符号进入。第三步,...
胃炎可以吃葡萄干吗_千问健康我性别女,32岁,由于长年作息不规律,吃饭也不定时,早饭经常没吃,胃疼很久了。我平时喜欢吃葡萄干,胃炎可以吃葡萄干吗?
小米三自动开关机在哪设置 - 159****3281 的回答 - 懂得小米手机没有自动开关机功能第一步,在小米3手机桌面打开“安全中心”图标进入。。第二步,点击电池符号进入。第三步,点击齿轮符号进入。第四步,选...