当前位置: 代码迷 >> 综合 >> 【MSP430】MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)
  详细解决方案

【MSP430】MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)

热度:2   发布时间:2024-02-25 09:39:44.0

实验内容:上电点亮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个计数就是11Mhz\dfrac{1}{1Mhz}1Mhz1?us ,若要产生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 <msp430.h> 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灯闪烁实验的程序中并没有软件清零,搞得笔者起初以为是计数设置太小,绿灯闪烁频率太快导致的辉光效应,实际上是中断标志位没有软件清零的原因。

代码可直接移植烧录的开发板实物图如下:
在这里插入图片描述