定时器Timer_A(TA)
基本寄存器
TA控制寄存器 TACTL
TASSELx:时钟源选择(TACLK00 ACLK01 SMCLK10 ~TACLK11)
IDx:第一次分频控制(ID0一分频 ID1二分频 ID2四分频 ID3八分频)
MC:工作模式控制(停止00 增01 连续10 增减11)
TACLR:定时器清零,复位TA寄存器、时钟分频和计数方向;会自动复位并置0
TAIE:定时器中断使能(0中断禁止 1中断允许)
TAIFG:中断标志位(0没有中断 1有中断挂起)
计数值存放寄存器TAR
扩展寄存器TAEX0
控制时钟源的二次分频,000-111表示1-8分频
捕获/比较寄存器 TACCR0-TACCR4(5个)
比较模式:设定计数终值
捕获模式:将捕获的TAR值存入TACCRx中
捕获比较模块
一、 两个相关寄存器
1、TACCTL0-TACCTL6寄存器
2、TAIV寄存器
1、TACCTL0-6
2、TAIV寄存器
存储中断代号(TACCR0优先级最高,故没有其中断标志)需要手动清零
二、比较模式(CAP=0,也称定时计时模式)
TA启动时默认为比较模式
定时器模式选择
计数模式
四种
向上
连续:即使时间固定值
加减:定时周期为2倍
增模式、连续模式计数到TACCR0的值时,中断标志CCIFG置位,返回0时,TAIFG中断标志位置位
工作模式
两种:捕捉/比较
三种用途:定时、产生PWM波(脉冲宽度调制)、测量频率(两个信号时间间隔)
<一>定时功能
1、查询实现定时功能
/*查询实现定时功能*/
#include #include "stdint.h" /* * main.c */ int main(void) { uint8_t cnt = 0; //定义一个变量 WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer /*配置DCO频率为1MHz*/ DCOCTL = CALDCO_1MHZ; BCSCTL1 = CALBC1_1MHZ; /*设置P1.6为输出*/ P1DIR |= BIT6; /*设置时钟源为SMCLK*/ TA1CTL |= TASSEL_2; // TASSEL_2为选择SMCLK /*TACLK默认为A0;A1要打出来*/ /*设置工作模式为Up Mode*/ TA1CTL |= MC_1; //Up Mode模式下,16bit Timer计数器 TAR会从0递增到TACCR0,然后回到0,重复这个过程 /*设置定时间隔*/ TA1CCR0 = 49999; //1MHz 计 50000个数,1/1MHz * 50000 20Hz 0.05s /*采用TACCR0 CCIFG标志位则产生+1个数即50000;TAIFG标志位则是本身*/ /*默认比较工作模式,捕捉模式不能用来计时*/ while(1) { if(TA1CTL & TAIFG) //TAIFG为标志位;查询方式实现计数 { cnt ++; //计数器变量 TA1CTL &= ~TAIFG; //清除标志位 if(cnt == 20) //0.05s * 20 = 1s { P1OUT ^= BIT6; cnt = 0; } } } return 0; } 2、中断法实现定时功能 #include #include "stdint.h" /* * main.c */ uint8_t flag = 0; int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer InitSystemClock(); InitUART(); /*设置P1.6为输出*/ P1DIR |= BIT6; /*设置时钟源为SMCLK*/ TA1CTL |= TASSEL_2; /*设置工作模式为Up Mode*/ TA1CTL |= MC_1; /*设置定时间隔*/ TA1CCR0 = 49999;// 50ms 1MHz 1/1MHz 1ns 50ms / 1ns = 50000 50000 - 1 = 49999 /*开启TAIFG中断,相当于一个溢出中断*/ TA1CTL |= TAIE; /*打开全局中断*/ __bis_SR_register(GIE); while(1) { if(flag == 1) { flag = 0; P1OUT ^= BIT6; PrintTime(currenttime); } } return 0; } <二>PWM波的输出 利用比较模式(CAP=0)TAR计数到TACCRx时,输出管脚由内部信号EQUx决定 输出单元 几种模式:输出/置位set/翻转goggle/复位reset(若为两个描述则 捕捉比较寄存器/最大值,可用于调整占空比,产生PWM波;若为一个描述则 捕捉比较寄存器) 捕捉比较寄存器TACCRx从对应管脚x输出 代码实例 /*输出产生PWM波*/ #include /* * main.c */ int main(void) { unsigned int cnt = 0; WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer /*配置DCO频率为1MHz*/ DCOCTL = CALDCO_1MHZ; BCSCTL1 = CALBC1_1MHZ; /*初始化P1.6为输入*/ P1DIR &= ~BIT6; /*设置时钟源为SMCLK*/ TA1CTL |= TASSEL1; /*设置工作模式为Up&Down*/ TA1CTL |= MC0|MC1; /*设置TA1CCR0为0x00FF*/ TA1CCR0 = 0x00FF; /*设置TA1CCR2为0x00FF*/ TA1CCR2 = 0x00FF; //占空比(TACCR0 - TACCR2) / TACCR0(由于是up/down模式,看半个周期即可);频率=SMCLK/(TACCR0+1)/2 /*改变占空比可以改变TACCR0/TACCR2,但改变前者会影响频率,故改变后者*/ /*设置为比较模式*/ TA1CCTL0 &= ~CAP; TA1CCTL2 &= ~CAP; /*设置比较输出模式*/ TA1CCTL2 |= OUTMOD_6; //模式6为Toggle/Set /*设置IO复用*/ P2SEL |= BIT5; P2DIR |= BIT5; /*到此为止输出占空比为0%*/ while(1) { for(cnt = 0;cnt < 0x00FF;cnt ++) { TA1CCR2 = cnt; __delay_cycles(5000); //值增大,占空比减小 } for(cnt = 0x00FF;cnt > 0;cnt --) { TA1CCR2 = cnt; __delay_cycles(5000); //值减小,占空比增加 } } return 0; }
上一篇:MSP430笔记3——串口发送数据
下一篇:MSP430笔记1——I/O口的设置(点亮LED)
推荐阅读最新更新时间:2024-11-11 14:23
设计资源 培训 开发板 精华推荐
- ST7LITE0 MCU镇流器应用电路
- AD9516-0/PCBZ,AD9516-0 评估板,2800 MHz 极低噪声 PLL 时钟合成器
- KIT20XS4200EVBE,具有 MC20XS4200 双高边开关的评估板
- SINOMCU
- 使用 Embedded Planet 的 P5010 的参考设计
- LT3976 演示板、40V、5A、2MHz 降压型开关稳压器,具有 3.3A 静态电流
- AM3G-4805SZ 5V 3 瓦 DC/DC 转换器的典型应用
- 【涂鸦智能】环境温湿度智能监测
- STM32 Nucleo基于LED1642GW的16通道LED驱动器扩展板
- AM2G-2412SZ 12V 2 瓦 DC/DC 转换器的典型应用