历史上的今天
返回首页

历史上的今天

今天是: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还具有广泛的中断功能。在溢出条件下,可以从计数器和每个捕获/比较寄存器中生成中断

定时器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被添加到捕获/比较寄存器。在这种情况下,时间间隔由硬件而不是软件控制,不会受到中断延迟的影响。使用所有三个捕获/比较寄存器可以产生最多三个独立的时间间隔或输出频率。
11-6
其他模式也可以产生时间间隔,其中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用于确定是什么中断
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


推荐阅读

史海拾趣

API Delevan公司的发展小趣事

1947年,API Delevan公司在电子行业的浪潮中应运而生。创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借创始团队对电感技术的深刻理解和坚定信念,API Delevan迎难而上,积极研发新产品,逐步在市场中站稳脚跟。初创期的奋斗历程为公司的长远发展奠定了坚实的基础。

Amkor公司的发展小趣事

为了进一步扩大市场份额,API Delevan公司积极寻求与国内外合作伙伴的合作,共同开拓市场。通过参加国际电子展会、举办技术研讨会等方式,公司不断提升品牌知名度和影响力。同时,API Delevan还注重客户关系管理,为客户提供优质的产品和服务,赢得了客户的信任和忠诚。

Amphenol Nexus公司的发展小趣事

作为一家专注于电气元件和连接器制造的公司,Amphenol Nexus Technologies始终致力于技术创新和产品升级。公司投入大量资源用于研发,不断推出具有创新性和高性能的新产品。例如,在高速连接器领域,Amphenol Nexus Technologies成功研发出了112G高速背板连接器,这一产品满足了人工智能等前沿技术对高速传输的需求,为公司带来了新的增长点。

深圳杜因特(DOINGTER)公司的发展小趣事

为了进一步提升自身实力和市场竞争力,杜因特积极寻求与国内外一流芯片代工厂、封装测试代工厂的合作。通过紧密的合作关系,杜因特不仅获得了先进的技术支持,还实现了产品质量的稳步提升。同时,公司还积极与国内外知名电子企业建立战略合作关系,共同开拓市场,实现共赢发展。

Calmos Systems Inc公司的发展小趣事

随着国内市场的饱和,Calmos Systems Inc公司开始将目光投向国际市场。公司制定了详细的国际化战略,包括市场调研、产品定位、销售渠道建设等方面。公司派遣专业团队前往海外市场进行考察和交流,了解当地市场需求和文化特点。同时,公司还积极寻求与国际知名企业的合作机会,共同开拓国际市场。在国际化战略的推动下,公司的业务范围不断扩大,国际市场份额逐年提升。

亿宝科技(CNIBAO)公司的发展小趣事

在技术创新的基础上,亿宝科技积极拓展市场。公司通过与国内外知名企业的合作,将产品打入国际市场。同时,亿宝科技还注重品牌建设,通过参加各类展会、举办技术研讨会等方式,提升品牌知名度和影响力。在一次国际电子展上,亿宝科技的产品凭借其卓越的性能和品质,赢得了众多客户的青睐,成功打开了国际市场的大门。

问答坊 | AI 解惑

干扰对CDMA手机接收器测试的影响

在对行动电话进行测试时,了解可能的干扰讯号源及其在手机前端所表现出来的效果是很重要的,它可以有助于确定接收器测试对RF干扰的感应情况,并找出消除干扰讯号的可行方法。本文介绍CDMA手机接收器在测试时遇到的干扰特性,并加以详细分析,提出参 ...…

查看全部问答>

音频的基本知识

本文档主要包括: 第一部分 模拟声音-数字声音原理 第二部分 音频压缩编码 第三部分 和弦铃声格式 第四部分 单声道、立体声和环绕声第五部分 3D环绕声技术 第六部分 数字音频格式和数字音频接口…

查看全部问答>

LED卡片灯

此款卡片灯和银行卡大小一样,超薄、超轻、方便携带。就像放银行卡一样放钱包里即可,晚上照明也较方便取放。 该灯电子部分采用的高容量锂电池,卡片中露出的部分向上折起,底部的LED就会发光照明,相反合并的话就会自动关闭。 …

查看全部问答>

wince应用层动态显示问题

我在做主界面,在主界面显示之前,我要有很多初始化过程,当然就会耗时,所以在主界面显示之前,我要做个动态图片显示。我是这么实现的,主窗口用的是模式对话框,动态显示用非模式对话框。 mfc vs2005 C++ wince5.0 建立一个线程如下 static D ...…

查看全部问答>

请教嵌入式高手

请教嵌入式视频高手!本人现在正在做一个在DSP芯片驱动的单片机上用LCD显示一段视频文件的课题,现在有MPEG4的编解码(C程序源码),请教各位大虾,我要怎么做才能完成这个功能,谢谢!…

查看全部问答>

求关于硬件编程方面的教材资料

最近看了点数据手册,有NOR,NAND ,内存等数据手册。但是,看了后还不是会些程序,,不知道如何操作。 一方面自己英文太差了,读的不太懂,现在想求点关于这方面的资料。。。。。。。 内容关于:(时序方面、硬件编程等(要求最好有数据手册和原 ...…

查看全部问答>

不良驾驶习惯很危险 车主请注意!

经常在路上开车的车主朋友可能注意到了,近期由于市区道路在四处挖开维修,部分路段封闭,加剧了车辆拥堵的紧张局面。另外,在一些新修的道路上由于没有及时标上交通指示线,也令一些车主要么无所适从,要么随意变线,追尾、刮擦之类的小事故频频出 ...…

查看全部问答>

XS128的nrf24l01的收发程序

本帖最后由 paulhyde 于 2014-9-15 03:29 编辑   前一阵子在写XS128的nrf24l01的收发程序 还是挺难写的 网上的代码都没有XS128的  现在都弄通了  所以把自己的成果传上来 希望大家共同学习    …

查看全部问答>

【高手指点】vhdl 进程嵌套循环过程

【高手指点】vhdl 进程嵌套循环过程 在进程中嵌套循环过程的语法问题,代码如下: procedure (signal c : integer;            signal d : integer  ) is begin    ......(省略) ...…

查看全部问答>