打印

MSP430使用指南- Timer定时器模块

[复制链接]
1769|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
定时器,作为MCU最重要也是最基本的功能集成在每一个MCU中。随着MCU功能的日渐强大,定时器的功能也越来越强大,因此配置和使用起来也就比较麻烦,下面我们针对MSP430的Timer模块进行详细讲解,配合多种可以直接使用的例程,方便用户直接移植和深入理解。

首先,普及一下定时器知识:本质上就是一个计数器,可以由用户自定义计数的值,同时到达计数值后可以执行相应的动作,因此可以时间周期性动作,采集捕捉动作等,用于实时控制及多种功能实现。

MSP430 MCU中有三种定时器:Timer_A   Timer_B   Timer_D.

首先 Timer_D定时器基本没有集成在MCU中,很少很少使用,是一个高分辨率的定时器,因此我们不做讲解(内部寄存器和使用与Timer_A/B很是相似,如果有用户用到,可以直接参考,如果有人需要可以留言,我会开贴再次单独讲解Timer_D)。

因此本次内容主要讲解一下Timer_A和Timer_B定时/计数器。首先先说一下MSP430 MCU内部Timer的主要功能:

16位定时/计数器,支持四种工作模式/计数模式:STOP  UP Continuous UP/DOWN
输入捕捉功能
输出比较功能,即PWM波功能
主要就这三种功能,用户在使用过程中也就是这三种功能,然后Timer有一些自己的特点:

时钟源可以选择
异步输入,输出所存
中断向量寄存器等

使用特权

评论回复

相关帖子

沙发
无法去污粉|  楼主 | 2023-10-19 15:33 | 只看该作者
那么为什么MSP430会有两种定时器呢:A和B,有什么区别呢:

B可以配置成8,10,12,16位模式,A只能用16位模式
B的CCRn寄存器是双缓冲,即Double-buffered,可以形成组
B的每一个输出口都可配置成高阻态
B中没有SCCI位

使用特权

评论回复
板凳
无法去污粉|  楼主 | 2023-10-19 15:34 | 只看该作者
首先先了解一下Timer_A的内部结构图,从下图可以看到,内部的定时器位数是16位,同时支持TAxCLK,ACLK,SMCLK,INCLK作为时钟源,后可以进行进一步的分频使用,同时拥有7个比较输出模块,可用于输出PWM波(注意 一个Timer只能输出6个PWM波,因为有一路计数器需要作为base使用:在可以调节PWM频率和占空比的情况下)

使用特权

评论回复
地板
无法去污粉|  楼主 | 2023-10-19 15:34 | 只看该作者
本帖最后由 无法去污粉 于 2023-10-19 15:36 编辑

使用特权

评论回复
5
无法去污粉|  楼主 | 2023-10-19 15:36 | 只看该作者
内部结构图决定的是模块的实现方式,因此可以清晰地看出实现的原理和寄存器中每个位的作用,因此最好养成观看内部结构图的习惯,这样有利于高效地调试自己的程序,当然现在刚开始看起来有点懵,不太理解也比较正常,但当学习完整个Timer后,对比着程序来看就会恍然大悟。

好啦,下面开始进入Timer地核心内容区域:使用模式。

使用特权

评论回复
6
无法去污粉|  楼主 | 2023-10-19 15:37 | 只看该作者
简单来说就是如何使用它,怎么使用,有几种使用方法。对于MSP430 Timer_A定时器来说,总共有四种工作模式,如下图所示,由寄存器TAxCLT中MC位决定,如下图所示:

使用特权

评论回复
7
无法去污粉|  楼主 | 2023-10-19 15:39 | 只看该作者
模式0:默认模式,即Stop,此模式下定时器内部不会开始计数,处于停止状态。
模式1:Up模式,此模式下定时器从0开始计数,一直计数到TAxCCR0寄存器中地值为止产生中断(如果使能了中断)并重新回到0,再次开始计数,如下图所示:

使用特权

评论回复
8
无法去污粉|  楼主 | 2023-10-19 15:39 | 只看该作者
在使用这种模式下,中断在什么时候产生呢?这时候就要弄清楚一个问题:Timer_A模块  有两种中断:TAxIFG(定时器中断)和TAxCCRx(捕捉/比较中断),TAxIFG时定时器的基本中断,一个定时器模块只有一个,就是当内部计数到设定值后就会产生,TAxCCRx时输入/比较中断,其实内部就一个定时器在计数,但是有不同通道的几个值可以设定,也就是TAxCCRx寄存器,因此当相对应的通道设定了值之后,则会触发相应的中断。

使用特权

评论回复
9
无法去污粉|  楼主 | 2023-10-19 15:40 | 只看该作者
触发中断的时间如下图所示:

使用特权

评论回复
10
无法去污粉|  楼主 | 2023-10-19 15:41 | 只看该作者
TAxIFG是在计数完CCR0后会产生的,TAxCCR0中断时在计数完CCR0-1后产生的,两者相差一个时钟位。不过在使用过程中,基本可以忽略了,只是在理论上了解一下更好。

那么还有一个问题:当前的计数值是在寄存器TAxR(看内部结构框图可以发现)中的,TAxCCR0只是设定一个值,那么当模式从Stop开始到Up模式时,TAxR的值不一定为0,那么设定就会出现两个情况:

当设定CCR0值时,TAxR值小于CCR0的值,那么定时器从当前值(TAxR)开始计数,计数到CCR0值后产生中断,回到0,从新开始计数。。。。。
当设定CCR0值时,TAxR值大于CCR0的值,那么计数器会直接回到0,从0开始计数。

使用特权

评论回复
11
无法去污粉|  楼主 | 2023-10-19 15:42 | 只看该作者
因此这个时候就会出现两种情况,然而你在设定时如果不去检查TAxR的值,那么可能对于第一个周期,就会出现不同的结果。为了避免这个情况,建议在设定CCR0值的时候,将MC设置成Stop模式(TI建议),其实这时候不仅仅应该设置成Stop模式,最重要的是要将TACLR设置成1(注意这个位是TAxR清除位,直接设置成1后会自动清0,去读的话 也都是0)。

使用特权

评论回复
12
无法去污粉|  楼主 | 2023-10-19 15:42 | 只看该作者
模式2:Continuous模式,此模式下定时器从0开始计数,一直计数到0xFFFF为止产生中断(如果使能了中断)并重新回到0,和Up模式地区别就是Up是计数到TAxCCR0(用户自己设定)值,而Continuous模式是直接计数到0xFFFF,这个值是固定的,不能设置,这样的话,定时器溢出的之间只能由计数频率决定了。如下图所示:

使用特权

评论回复
13
无法去污粉|  楼主 | 2023-10-19 15:43 | 只看该作者
这种模式下,仅有TAxIFG中断会用到,因为没有设定CCR寄存器,也不需要这个寄存器,产生中断的时刻如下图所示:

使用特权

评论回复
14
无法去污粉|  楼主 | 2023-10-19 15:43 | 只看该作者
在完成0xFFFF计数后才会产生中断。那么当工作在Continuous模式下 CCRx就不能使用了吗?

使用特权

评论回复
15
无法去污粉|  楼主 | 2023-10-19 15:44 | 只看该作者

NO,也可以使用,而且可以根据客户的需求来定义不同占空比 不同形状的波形,如下图所示,使用两个CCRx时可以产生的中断(加上TAxIFG中断会更多,灵活使用):

使用特权

评论回复
16
无法去污粉|  楼主 | 2023-10-19 15:44 | 只看该作者
上图可以看到,在CCR0和CCR1处都会产生中断,同时TAxIFG也是存在的。这种模式下在设定CCRx值时就仅有一种情况了,因为TAxR一直在计数,因此设定CCRx值时并不影响计数,只是看什么时候会产证中断而已,如果当前计数到10000,你设定10001,那么下一个时钟就会中断,如果当前10000,你设定9999,那么需要等下一次TAxR值等于9999时才能产生中断了,与Up模式不同的时,设定CCRx的值,不会改变或影响TAxR的值。

使用特权

评论回复
17
无法去污粉|  楼主 | 2023-10-19 15:48 | 只看该作者
模式3:Up/down模式,这个模式下和Up比较类似,唯一的区别是Up模式下计数到TAxCCR0时会产生中断并再次从0开始,但是Up/down模式下则不会从0开始,而是从现在值开始往下计数(减计数),如下图所示:

使用特权

评论回复
18
无法去污粉|  楼主 | 2023-10-19 15:49 | 只看该作者
TAxIFG会在计数到0(计完1)后触发,CCIFG会在计数完CCR0-1后触发。

那么改变CCRx值时是什么状况呢?

当设定CCR0值时,TAxR值小于CCR0的值,那么定时器从当前值(TAxR)开始计数,不影响TAxR的值。
当设定CCR0值时,TAxR值大于CCR0的值,那么计数器会立刻开始递减,进行减计数,减到0后再开始递增计数,最后正常工作。

使用特权

评论回复
19
无法去污粉|  楼主 | 2023-10-19 15:49 | 只看该作者
因此此时设定CCRx值时,推荐和Up模式下保持一致。

使用特权

评论回复
20
无法去污粉|  楼主 | 2023-10-19 15:49 | 只看该作者
上图显示的是在Up/down模式下CCRx使用方式,当然 这个也是PWM的输出方法,由CCR0通道作为base计数,用于调节PWM的频率,CCRx则用来调节占空比,而且还支持多种输出模式。这个模式的区别,后面会详细讲解。

到此处位置,Timer_A的四种工作模式,其实就三种(除去Stop)已经全部讲解完成,本质上也就是每个定时器模块内有一个计数器,一直在计数,然后有一些CCRx寄存器,可用于用户设定相应的值,当计数到这个值时产生相应的中断,去执行相应的操作。那么如何使用描述的这些功能呢? 我认为需要了解五块内容,会和你的使用息息相关:

中断方式,寄存器,输入捕捉,输出比较(PWM),例程。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

735

帖子

1

粉丝