历史上的今天
今天是:2025年02月01日(星期六)
2021年02月01日 | MSP430 精准延时之定时器 TIMERA 0.5实现LED闪烁
2021-02-01 来源:eefocus
在经历过上一章的粗暴for()循环进行延时和简单的delay_ms(),delay_us()精准延时之后,本章介绍另一种精准延时定时器
定时器基本可以分为四种定时器
本章为大家着重介绍定时器timerA进行定时
Timer_A是一个16位计时器/计数器,有三个捕获/比较寄存器。分别为CCR0,CCR1,CCR2。
Timer_A可以支持多个捕获/比较、PWM输出和间隔计时。Timer_A还具有广泛的中断功能。在溢出条件下,可以从计数器和每个捕获/比较寄存器中生成中断

1 定时器A的时钟源和分频比
定时器A的时钟源可以是TACLK,ACLK,SMCLK,INCLK,四种时钟。使用ID_X进行1/2/4/8分频
2 定时器模式
<1>停止模式
停止使用
<2>增模式
向CCRx写入数值计数器会从0增加到TACCRx发生中断,进入中断服务程序
写入CCRx的值必须与0XFFFFH不相同
注意
当程序运行时如果我们改变CCRX的值,新值>=CCRX计数器会计数到新值发生中断,新值<=CCRX,计数器计数到新值,额外计数到CCRX在计数到0发生中断下一次以后将会从0计数到新的CCRX然后产生中断。
<3>连续模式
计数器从0计数到最大值0XFFFFH,发生中断
连续模式可以用来产生独立的时间间隔和输出频率。每次间隔结束时,就会产生一个中断。下一个时间间隔被添加到中断服务程序中的TACCRx寄存器中。图11 - 6显示了两个单独的时间间隔t0和t1被添加到捕获/比较寄存器。在这种情况下,时间间隔由硬件而不是软件控制,不会受到中断延迟的影响。使用所有三个捕获/比较寄存器可以产生最多三个独立的时间间隔或输出频率。
其他模式也可以产生时间间隔,其中TACCR0被用作周期寄存器。它们的处理更加复杂,因为旧TACCRx数据和新时期的总和可能大于TACCR0值。当前一个TACCRx值加上tx大于TACCR0数据时,必须减去TACCR0值以获得正确的时间间隔
<4>上下模式
上下模式计数器TACCRX从0计数到TACCRX然后反向计数到0,计数器的值必须不同于0XffffH
当我们在程序运行中想要改变TACCRX的值(例如使用串口添加新的值)新的周期变化和增模式一样,请参考增模式!
5 比较捕获模块
①捕获模块:当CAP=1时选择捕获模式,设置CMX位可以选择上升沿或者下降沿捕获,如果发生捕获
<1> 定时器值会被复制到TACCRX寄存器当中
<2> 发生捕获中断标志位CCIFG会被置位
<3> 读取CCI位获取捕获的电平状态。
②比较模块:当CAP=0时选择比较模块,比较模块可以用来生产PWM和产生特定的时间间隔
<1> 中断标志位CCIFG被置位
<2> 内部信号EQUX=1
<3> EQUX根据输出模式对输出产生影响
<4> 输出信号CCI被所存到SCCI
6 输出单元
每个输出模块都配有一个输出单元,主要常见的用途是用来输出PWM波,每个输出有8种模式可以选择根据EQU0和EQUX进行设定
输出模式有OUTMODX为设置,输出模式2,3,6,7对于输出单元0是无用的,因为EQUX=EQU0。
<1>定时器增模式下输出范例
本范例来自开发手册,使用CCR0和CCR1
TACCR0是周期,TACCR1是控制占空比,8种模式对应输出不同的高低电平(如图)
<2>定时器连续模式下输出范例
本范例来自开发手册,使用CCR0和·CCR1
0~0Xffff是周期,TACCR0和TACCR1分别控制占空比,8种模式对应不同的高低电平(如图)
<3>定时器增减模式下输出范例
本范例来自开发手册,使用CCR0和·CCR2
TACCR0不等于0XFFFF
TACCR0和TACCR2分别控制占空比,8种模式对应不同的高低电平(如图)
7 定时器A中断向量
定时器A有两个中断向量,CCR0专用一个TIMERA0_VECTOR中断,CCR1,CCR2两个用一个TIMERA1_VECTOR中断
TAIV用于确定是什么中断
8 操作定时器A的各种寄存器
TACTL, Timer_A Control Register定时器控制寄存器
TAR 定时器计数器
TACCTLx, Capture/Compare Control Register 比较捕获控制寄存器
TAIV, Timer_A Interrupt Vector Register 定时器中断向量寄存器
这些寄存器我就不详细的解释了,大家可以点击我下方的的用户指导手册链接,获取用户指导手册,进行学习
9 实战
上面我叭叭这么多下载进入实战吧!
使用定时器A进行50MS精准延时乘10 就是0.5S 然后操作IO
为什么要设置定时器A为50MS,这就涉及到定时器是16位(最开始说过),如果直接设置0.5秒,计数器每次加一是一个定时器的时钟周期,我的设置是1MHZ每次加计数器加一就是1US,TACCR0 =500000 大于最大值65536,所以代码里取巧一下。
之后会为大家介绍IAR里面各种数据类型占多少位!
/**********渃畔***********/
/*
芯片: MSP430F169
功能: 使用定时器A设置0.5S时间间隔使LED等亮灭
芯片 8/9引脚外接8MHZ晶振作为时钟
*/
#include "msp430x14x.h"
void basic_clock(void);
void timerA_init(void);
typedef unsigned int uint;
uint FLAG,count;
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
basic_clock();
timerA_init();
P6DIR |= BIT4;
_EINT();
while(1)
{
if(FLAG==1)
{
FLAG=0;
count++;
if(count==10) //乘10 500MS 0.5S
{
P6OUT ^= BIT4; //取反IO
count=0;
}
}
}
}
void basic_clock(void)
{
unsigned int iq0;
BCSCTL1&=~XT2OFF; //基本定时器1 默认关闭T2CLK 开启T2CLK
do
{
IFG1&=~OFIFG; //等待开启晶振
for(iq0=0xff;iq0>0;iq0--);
}
while((IFG1&OFIFG)!=0);
BCSCTL2=0x88; //基本时钟状态寄存器2 MCLK8MHZ SMCLK 8MHZ
}
void timerA_init(void)
{
TACTL |= TASSEL_2 + TACLR + ID_3 + MC_1 + TAIE; //选择时钟为SMCLK 清除寄存器 8分频() 增计数模式
TACCR0 = 50000-1; //65536 //设置定时间隔 50MS
}
#pragma vector = TIMERA1_VECTOR
__interrupt void timer_A (void)
{
switch(TAIV)
{
case 10:FLAG=1;break;
}
}
推荐教学视频
https://www.bilibili.com/video/BV1cE411Z79d?from=search&seid=15656799615629348503
https://www.bilibili.com/video/BV1rE41167yG?from=search&seid=6968580456886645765
MSP430 C语言例程
链接:https://pan.baidu.com/s/1z-q4JGVUzTmJrgeurAExYw
提取码:t2qa
链接:https://pan.baidu.com/s/12bALa0_v6j4bAIcULMtzJQ
提取码:0xv9
TI官网提供例程
链接:https://pan.baidu.com/s/1GBXAUFL5opM9LbreQ7zsNw
提取码:1gn6
史海拾趣
|
在对行动电话进行测试时,了解可能的干扰讯号源及其在手机前端所表现出来的效果是很重要的,它可以有助于确定接收器测试对RF干扰的感应情况,并找出消除干扰讯号的可行方法。本文介绍CDMA手机接收器在测试时遇到的干扰特性,并加以详细分析,提出参 ...… 查看全部问答> |
|
我在做主界面,在主界面显示之前,我要有很多初始化过程,当然就会耗时,所以在主界面显示之前,我要做个动态图片显示。我是这么实现的,主窗口用的是模式对话框,动态显示用非模式对话框。 mfc vs2005 C++ wince5.0 建立一个线程如下 static D ...… 查看全部问答> |
|
最近看了点数据手册,有NOR,NAND ,内存等数据手册。但是,看了后还不是会些程序,,不知道如何操作。 一方面自己英文太差了,读的不太懂,现在想求点关于这方面的资料。。。。。。。 内容关于:(时序方面、硬件编程等(要求最好有数据手册和原 ...… 查看全部问答> |
|
【连载】【ALIENTEK MiniSTM32 开发板】STM32不完全手册-RTC实时时钟实验(实验11) 开发板购买地址:http://shop62103354.taobao.com/… 查看全部问答> |
|
经常在路上开车的车主朋友可能注意到了,近期由于市区道路在四处挖开维修,部分路段封闭,加剧了车辆拥堵的紧张局面。另外,在一些新修的道路上由于没有及时标上交通指示线,也令一些车主要么无所适从,要么随意变线,追尾、刮擦之类的小事故频频出 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:29 编辑 前一阵子在写XS128的nrf24l01的收发程序 还是挺难写的 网上的代码都没有XS128的 现在都弄通了 所以把自己的成果传上来 希望大家共同学习 … 查看全部问答> |
|
【高手指点】vhdl 进程嵌套循环过程 在进程中嵌套循环过程的语法问题,代码如下: procedure (signal c : integer; signal d : integer ) is begin ......(省略) ...… 查看全部问答> |




