MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验

发布者:JFET最新更新时间:2021-01-20 来源: eefocus关键字:定时器A  LED灯闪烁 手机看文章 扫描二维码
随时随地手机看文章

实验内容:上电点亮MSP430F5529 Launch Pad 上板载的红色LED,同时使用定时器让绿色LED闪烁

实验准备:
1、硬件:MSP430F5529 Launch Pad
2、软件:Code Composer Studio集成开发工具(CCS)
3、CCS的使用安装方法可参考 《Windows环境Code Composer Studio 下载和使用教程》 文章链接:link
4、本次实验使用到的物理层的分析可参考文章:link

一、定时器——Timer_A

  在进入正题之前,我们先来了解一下MSP430F5529的定时器,本次实验我们使用Timer_A定时器,这里需要注意的是MSP430F5529一共有3个A类定时器,分别是Timer0_A5、Timer1_A3、Timer2_A3
在这里插入图片描述

在这里需要提一下的是Timer_A定时器有6种寄存器,都是以TAx开头,如果该寄存器涉及捕获比较单元的后面会有个n

在这里插入图片描述

  上面我们大致了解了一下MSP430F5529有关定时器Timer_A的相关寄存器个数和A类定时器的个数,下面我们就寄存器配置方法进行分析:

1、Timer_A框图
  在学习使用Timer_A之前我们一定要先大致了解一下Timer_A的流程框图,这有助于我们理解定时器的工作原理,框图如下:
在这里插入图片描述

  在Timer_Ax控制寄存器(TAxCTL)中TASSEL位用来选择Timer_A的时钟来源,ID位选择分频系数,TACLR位的置位可对IDEX和ID分频系数进行清除同时清除计数,TAxR寄存器控制Timer_A的计数,MC位设置计数模式,当计数到指定数值时可产生定时器中断从而进入中断服务函数,进而实现我们想要的实现效果。
在这里插入图片描述

2、捕获比较单元
  这里我们讲一下捕获比较单元TAxCCRn,定时器A的捕获比较单元一共有5个 —> TA0CCR0~TA0CCR4
  在这5个比较捕获单元中,只有TA0CCR0支持增计数,TA0CCR0单独使用一个中断向量,且优先级最高,其他TA0CCR1~TA0CCR4共用一个中断向量。

假设主频时钟为1Mhz,那么产生1个计数就是1 1 M h z dfrac{1}{1Mhz}1Mhz1us ,若要产生1s的时间延时,就需要计数1000,000次,则配置TA0CCR0 = 1000,000

3、MC工作模式
  查阅《MSP430x5xx and MSP430x6xx Family User Guide》可知,MC一共有4种模式
在这里插入图片描述
①MC_0 :系统默认的工作模式,该模式下Timer_A禁止工作,停止之后不会发生复位,重新计数时以暂停之前的配置进行计数,相当于暂停功能

②MC_1:向上计数模模式
    ----该模式下禁止从0xFFFF开始计数;
      ----该模式下从0向上增计数到ATxCCR0,实际计数个数是ATxCCR0+1,计满后重新从0开始向ATxCCR0计数
      ----当定时器计数到ATxCCR0时,中断标志位CCIFG(捕获比较中断信号标志)会自动置位,当定时器的TAxCCR0返回0时TAIFG(溢出中断标志)置位,TAIFG置位后一定要手动清0
      ----当TAxR的计数值大于TAxCCR0时,定时器立刻从0开始计数;
      ----在定时器运行时修改TACCR0,如果新的周期值大于或等于旧的周期值,或大于当前的定时器计数值,那么定时器立刻开始执行新周期计数。如果新周期小于当前的计数值,那么定时器回到0。但是,在回到0之前会多一个额外的计数。

③MC_2:连续计数模式
     ----在该模式下,定时器重复计数到0xFFFH,然后从0重新开始增计数(除非每次重装计数初值),当TAxCCR0计数值从0xFFFF计数到0的时候产生一个TAIFG(溢出中断标志)

连续模式的应用:
  应用: 连续模式下利用捕获/比较器产生需要的时间间隔.
  原理: 计数在一直进行,捕获器TACCRX中存有第一个计数终值,每次捕获器计到TACCRX时,会产生中断标志,我们可以在中断服务函数中写入一个计算好的下一个的计数终值,这样无限计算和中断下去,那么该捕获器就会产生一个稳定的时间间隔序列。
在这里插入图片描述

④MC_3:向上/向下计数模式(常用于产生PWM波)
    ----先递增计数到TAxCCR0,再从TAxCCR0递减计数到0,重复执行
      ----该模式下,计数方向是固定的,即让定时器停止后再重新启动定时器,它就沿着停止时的计数方向和数值开始计数。如果不希望这样,就需要将TACLR置位来清除方向。TACLR位能清除TAR的值和定时器的时钟分频以及计数方向。
      ----当定时器运行时,改变TACCR0的值,如果正处于减计数的情况,定时器会继续减到0,新的周期在减到0后开始; 如果正处于增计数状态,新周期大于等于原来的周期,或比当前计数值要大,定时器会增计数到新的周期;如果新周期小于原来的周期,定时器立刻开始减计数,但是,在定时器开始减计数之前会多计一个数。

4、TAxCCTLn 寄存器功能介绍

在这里插入图片描述

捕获模式
设置CAP(位8),当CAP =1 时,选择捕获模式,所谓捕获,就是我们来检测外围的信号跳变时刻(此时刻理解为数字信号,即脉冲),此信号乃为我们捕获的对象,可以测量信号的脉冲宽度,即频率等;捕获模式可用于记录时间事件,比如速度估或时间测量等;

利用外部信号的上升沿、下降沿或上升下降沿触发来测量外部或内部事件,也可以由软件停止。捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC。完成捕获后相应的捕获标志位CCIFGx置一,当输入信号的触发沿来到时,捕获事件发生:
   ----定时器的TAR值复制到TACCRX寄存器中
   ----中断标志位CCIFG置位
在这里插入图片描述

应用:
 利用捕获源的信号来触发捕获TAR的值,并将每次捕获的值都保存到TACCRx中,可以随时读取TACCRx的值,TACCRx是个16位的寄存器,捕获模式用于事件的精确定位。如测量时间、频率、速度等

例子:
 利用两次捕获的值来测量脉冲的宽度。或捕获选择任意沿,CCISx=”11“(输入选择VCC),这样即当VCC与GND发生切换时产生捕获条件

说明:
①捕获信号可能会和定时器时钟不同步,并导致竞争条件的发生。将SCS位置位可以在下个定时器时钟使捕获同步
②如果第二次捕获发生时,第一次捕获的TAR值还没有及时被存到TACCRx,捕获比较寄存器就会产生一个溢出逻辑,COV位在此时置位, COV位必须软件清除

比较模式
这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx置一,同时产生中断。若中断允许未开启则只将中断标志位CCIFGx置一

例子:
 比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断处理。

说明:
当Timer_A要用到TACCR0的值作为终值来计数(也就是增模式或者增减模式),很显然TACCR0的值一定要大于其TACCRx的值,否则那些比TACCR0大的计数值就没有存在的意义了

以向上向下计数模式为例,有如下图:
在这里插入图片描述

总结:
1、相应的中断标志CCIFG置位
2、内部信号EQUx= 1
3、EQUx根据输出模式来影响输出信号
4、输入信号CCI锁存到SCCI中

输出模式
输出模式由OUTMODx位来确定,相应设置如下表:
在这里插入图片描述

说明:
在模式转换的时候,一定要保持OUTMOD至少一位置位,除非转向0模式。所以最好的做法是:先把OUTMOD置为7,然后再清除掉不需要的位

比较模式下,当计数器TAR中的值和TACCRX中的设计值相等时,相应捕获/比较器的EQUx就会置位。那么EQU0、EQUx和OUTMOD是怎么来影响输出的呢?
  以模式2为例,该模式的定义是这样的:当定时器计数到TACCRX值时,输出翻转。当定时器计数到TACCR0值时,输出复位。于是,这句话就也可以理解成在模式2的条件下,当EQUx=1时,输出翻转;当EQU0等于1的时候,输出复位。这两个信号这里相当于两个触发(使能)信号了。

二、源代码

#include  


int main(void)

{

 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer

 

 //点亮红灯

 P1DIR |= BIT0;          //P1^0设置为输出

 P1OUT |= BIT0;          //点亮红灯

 

 P4DIR |= BIT7;          //P4^7设置为输出

 P4OUT &= ~BIT7;         //熄灭绿灯


 TA0CTL = TASSEL_2 + ID_2 + TACLR + MC_1 + TAIE;

 TA0CCR0 = 65534;

 TA0CCTL0 =CCIE;         //捕获/比较中断使能


 _EINT();

 return 0;

}


#pragma vector = TIMER0_A0_VECTOR

__interrupt void Timer0A()

{

 if(TAIFG)

    {

        P4OUT ^= BIT7;

        TA0CTL ^= TAIFG;        //TAIFG一定要手动清除,不然会卡在中断服务函数中跳不出去,导致绿灯常量

    }

}


  这里特意强调说明一下,进入中断以后TAIFG一定要软件清0,否则会卡在中断服务程序中出不来,这里我郁闷了很久,看了很多博主有关LED灯闪烁实验的程序中并没有软件清零,搞得笔者起初以为是计数设置太小,绿灯闪烁频率太快导致的辉光效应,实际上是中断标志位没有软件清零的原因。


代码可直接移植烧录的开发板实物图如下:

关键字:定时器A  LED灯闪烁 引用地址:MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验

上一篇:MSP430F5529 flash 读写 详解
下一篇:MSP430F5529 火箭板 --->点亮一盏LED实验

推荐阅读最新更新时间:2024-11-17 02:23

C语言实现LED灯闪烁控制
/********* C语言实现LED灯闪烁控制配套51单片机开发板 **********/ #include reg51.h //包含单片机寄存器的头文件 /**************************************** 函数功能:延时一段时间 *****************************************/ void delay(void) //两个void意思分别为无需返回值,没有参数传递 { unsigned int i; //定义无符号整数,最大取值范围65535 for(i=0;i 20000;i++) //做20000次空循环 ; //什
[单片机]
PIC16F877A 看门狗定时器实验
//*******************PIC16F877A 看门狗定时器实验******************* // //PORTA,PORTB,PORTC,PORTD,PORTE复位时为输入状态 //PORTA.4(RA4)为开漏输出 // //WDT运行于独立的内部RC振荡器,即使器件时钟停振,WDT仍正常工作 //PIC16F877A单片机的WDT只能在烧写芯片时通过配置位启动或停止 //WDT基本溢出时间为18ms,由于温度影响,该值在7-33ms之间变化 //WDT和TMR0共用一个预分频器 //PSA=1; //预分频器分配给WDT使用 //PS2 PS1 PS0 WDT //
[单片机]
PIC单片机在ICD1上做LED灯的循环闪烁程序
;************************************************* ;* FLASH.ASM * ;************************************************* ;************************************************* ;* 本程序是一个LED灯的循环闪烁程序,用INT键来切换* ;* 闪烁模式 * ;************************************************* include p16f877.inc ;*---- MODESEL equ 20h MODESELB equ 21h
[单片机]
单片机MSP430入门理论⑧--定时器模块-定时器A
上期大概给大家汇总介绍了,定时器模块中定时器A的TACTL控制寄存器,TACTL是用来设置时钟,定时器模式,清除,定时器中断等基础功能的 本期将继续介绍定时器A,这次将整理一些关于定时器A的,其他寄存器的用法以及功能 1.0 下面要说的是TAR寄存器,这个寄存器很简单,就是定时器A用来计数的,也可以读写,只不过要注意当计数时钟不是MCLK时,写入前应停止计数,因为他与CPU时钟不同步,可能引起时间竞争 2.0 相对应的TACCRx寄存器,当比较模式时,TACCRx保存着你设置的用来跟定时器A实际计数值TAR比较的值,而当捕获模式时,TACCRx的就会被TAR的值覆盖 3.0 捕获/比较寄存器TACCTLx
[单片机]
单片机MSP430入门理论⑧--<font color='red'>定时器</font>模块-<font color='red'>定时器</font><font color='red'>A</font>③
MSP430单片机16 位定时器Timer_A 操作
/**********(一)定时器A 比较模式*************/ int main( void ) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 BCSCTL1 =CALBC1_1M Hz ; //设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR |=BIT0; //LED 使能 TACTL=TASSEL1+TACLR; //定时器A 时钟源为SMCLK,并清TAR CCTL0 |=CCIE; //CCR0 中断使能 CCR0 =50000; //计数值为50000 个SMCLK 周期 TACTL |=MC1; //启动定时器A 为连续计数模式 _BIS_SR(GIE+CP
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved