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

[复制链接]
3727|58
 楼主| 无法去污粉 发表于 2023-10-19 15:50 | 显示全部楼层
中断方式,寄存器,输入捕捉,输出比较(PWM),例程。

下面按照这种方法来进行讲解(比较乱,但是我认为这种方式比较合理,先搞清楚定时器原理及模式,在进一步细看寄存器,中断实现方式,在面向使用去了解输入捕捉和输出比较,最后进行例程的学习)。

Timer_A定时器的中断
在细看完上面的讲解后,你可能会有个印象,Timer_A模块有两种中断:TAxIFG和TAxCCRx中断,那么中断向量如何呢?(中断向量是中断的入口)

如果拆开看有8个中断:TAxIFG,CCR0IFG-CCR6IFG,每个都分配一个中断向量? 太浪费了吧! 因此MSP430只分配了两个中断向量:

TAxCCR0自己单独一个中断向量,名字叫做:TIMER0_A0 (TimerA0),这个不需要记,去看工程下的cmd文件即可。
 楼主| 无法去污粉 发表于 2023-10-19 15:50 | 显示全部楼层
剩下的TAxIFG和TAxCCRx共同享用一个中断向量:TIMER0_A1 (TimerA0),因此你会发现每个定时器仅有两个中断向量,也就够使用了,那么如何用呢?

对于CCR0中断:
  1. // Timer0_A0 interrupt service routine
  2. #pragma vector = TIMER0_A0_VECTOR
  3. __interrupt void Timer0_A0_ISR (void)
  4. {
  5.   P1OUT ^= BIT0;
  6. }
 楼主| 无法去污粉 发表于 2023-10-19 15:50 | 显示全部楼层
对于其他中断,进入中断后需要进行中断类型判断:
  1. // Timer0_A1 Interrupt Vector (TAIV) handler
  2. #pragma vector=TIMER0_A1_VECTOR
  3. __interrupt void TIMER0_A1_ISR(void)
  4. {
  5.   switch(__even_in_range(TA0IV, TA0IV_TAIFG))
  6.   {
  7.     case TA0IV_NONE:   break;               // No interrupt
  8.     case TA0IV_TACCR1: break;               // CCR1 not used
  9.     case TA0IV_TACCR2: break;               // CCR2 not used
  10.     case TA0IV_TACCR3: break;               // reserved
  11.     case TA0IV_TACCR4: break;               // reserved
  12.     case TA0IV_TACCR5: break;               // reserved
  13.     case TA0IV_TACCR6: break;               // reserved
  14.     case TA0IV_TAIFG:                       // overflow
  15.       P1OUT ^= BIT0;
  16.       break;
  17.     default: break;
  18.   }
  19. }
 楼主| 无法去污粉 发表于 2023-10-19 15:51 | 显示全部楼层
注意:并不是所有的Timer_A都有6个CCR寄存器,具体有几个看每个芯片的datasheet。

Timer_A寄存器
先看一下总共有多少寄存器:18个寄存器,但是只有六类寄存器,其他都是相同的。
QQ截图20231019155145.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:52 | 显示全部楼层
TAxCTL寄存器
QQ截图20231019155218.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:52 | 显示全部楼层
TASSEL :  时钟源选择,如上图所示,有四种时钟源。
ID : 时钟源分频,对选中的时钟源进行分频后再输入Timer用于计数。
MC : 定时器模式选择,设定上述所讲的四种模式。
TACLR : 计数器清零位,写1会清除当前计数值,会自动复位。
TAIE : Timer_A中断使能位。
TAIFG : Timer_A中断标志位,即使中断不使能,当产生中断信号时,标志位也会置位。
 楼主| 无法去污粉 发表于 2023-10-19 15:53 | 显示全部楼层
TAxR寄存器
QQ截图20231019155305.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:53 | 显示全部楼层
TAxR : 计数器当前计数的值,可以进行读写操作。
 楼主| 无法去污粉 发表于 2023-10-19 15:54 | 显示全部楼层
TAxCCTLn寄存器
QQ截图20231019155353.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:54 | 显示全部楼层
 楼主| 无法去污粉 发表于 2023-10-19 15:54 | 显示全部楼层
CM : 捕捉边沿类型,这个用于捕捉外部的信号,可以选择上升沿,下降沿,上升/下降沿。
CCIS :  捕捉输入通道选择,可以选择成A, B, GND, VCC,每个通道对应的GPIO口不同,具体看datasheet。
SCS : 同步捕捉还是异步捕捉,是否将输入信号与时钟信号进行同步,看结构图可以看到内部就是使用了一个与门,可以实现时钟信号与输入信号的同步,这个根据客户需要进行选择,一般来说两种模式都可以,具体看客户使用场景,在学习是注意一下有这个点即可,当遇到问题时,如果可能是时序问题的话,查看一下这个。
SCCI : 同步输入信号加载紧EQU失能位选择,就是给EQU多一个输入源CCI。
CAP : 输入捕捉模式还是输出比较模式选择。
OUTMOD : 输出模式类型,总共有7中模式,也就是再不同中断情况下进行不同的操作,可能是置位,也可能是复位,或者反转等,很多模式都可以输出PWM波,用户自己看就可以。
 楼主| 无法去污粉 发表于 2023-10-19 15:54 | 显示全部楼层
给出一个再Up模式下不同模式的波形图:

模式1(001) :   CCR1中断时直接置位。

模式2(010)  :     CCR1中断时反转,CCR0中断时复位。

模式3(011)  :     CCR1中断时置位,CCR0中断时复位。

模式4(100)  :     CCR1中断时反转。

模式5(101)  :     CCR1中断时复位。

模式6 (110):      CCR1中断时反转,CCR0中断时置位。

模式7 (111):      CCR1中断时复位,CCR0中断时置位。
 楼主| 无法去污粉 发表于 2023-10-19 15:55 | 显示全部楼层
 楼主| 无法去污粉 发表于 2023-10-19 15:55 | 显示全部楼层
CCIE : 输入捕捉或输出比较使能。
CCI : 只读寄存器,可以读取被选中通道的点评状态。
OUT : 输出比较模式时初始输出状态。当OUTMOD=000时,就直接一致输出这个状态。
COV : 输入捕捉overflow产生,即溢出了,当输入的数大于0xFFFF时会溢出,这一位必须软件复位。注意,在计算输入捕捉到的脉冲数量时,需要检测这一位,否则会出现溢出情况导致捕捉到的脉冲是负数或者差一个0xFFFF。
CCIFG : 输入捕捉/输出比较中断标志位。
 楼主| 无法去污粉 发表于 2023-10-19 15:56 | 显示全部楼层
TAxCCRn寄存器
QQ截图20231019155559.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:56 | 显示全部楼层
TAxCCRn : 输出比较时使设定值,输入捕捉时是当收到捕捉信号时定时器的值。
 楼主| 无法去污粉 发表于 2023-10-19 15:56 | 显示全部楼层
TAxIV寄存器
QQ截图20231019155643.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:57 | 显示全部楼层
TAIV : 只读寄存器,中断类型标志位,用来识别是哪个中断源引起的中断(因为除了TAxCCR0,其他中断源共享一个中断向量)
 楼主| 无法去污粉 发表于 2023-10-19 15:57 | 显示全部楼层
TAxEX0寄存器
QQ截图20231019155731.jpg
 楼主| 无法去污粉 发表于 2023-10-19 15:57 | 显示全部楼层
TAxIDEX : 输入时钟分频寄存器,和TAxCTL寄存器中ID位效果一致,用来对所选的时钟进行分频后再输入给Timer_A。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部