MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验
2021-01-20 来源:eefocus
实验内容:上电点亮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灯闪烁实验的程序中并没有软件清零,搞得笔者起初以为是计数设置太小,绿灯闪烁频率太快导致的辉光效应,实际上是中断标志位没有软件清零的原因。
代码可直接移植烧录的开发板实物图如下:
- MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)
- MSP430F5529火箭板 ----> 关于核心电压提升实验(含电源管理模块和供电监控系统介绍)
- MSP430F5529火箭板 ---> 控制时钟系统输出频率实验(含时钟系统分析)
- MSP430F5529火箭板 --> 按键中断控制LED实验
- MSP430F5529火箭板 ----> 关于核心电压提升实验
- MSP430F5529火箭板 ---> 控制时钟系统输出频率实验
- MSP430F5529 火箭板 --->点亮一盏LED实验
- MSP430F5529火箭板-控制时钟系统输出频率实验(含时钟系统分析)
- 51学习笔记之利用定时器0产生最大周期为16s的PWM波(STC12C5A60S2)
- 探索STC12C5A60S2定时器