MSP430学习总结——定时器

发布于:2023-01-20 ⋅ 阅读:(163) ⋅ 点赞:(0)

一、MSP430定时器是什么?

和STM32类似,MSP430定时器也有定时、输入捕获、输出比较以及产生PWM等功能,下面就来一一介绍这些功能以及怎么去使用。
首先,我们应该知道MSP430的定时器模式分为比较模式和捕获模式,个人理解比较模式就是定时中断、计时等一些常规的功能,捕获模式是PWM输出,捕获外部信号,用于测量时间和脉冲数量等。MSP430默认为比较模式。
MSP430的TA1的寄存器如下图
在这里插入图片描述

二、MSP定时器的功能

1. 定时器中断

定时器中断就是间隔一定的时间,执行一次中断服务函数,我们通过一段程序来上手定时器中断,毕竟例程也是学习单片机的一大工具。

    WDTCTL = WDTPW + WDTHOLD;           //关闭看门狗
    TA1CCR0 = 25000 ;
    TA1CCTL0 = CCIE;                    // CCR0中断允许
    TA1CTL= TASSEL_2+ID__8+TAIE+TACLR+MC_1;   //使用SMCLK时钟,开启中断并清零,递增模式;
    TA1CTL&=~TAIFG;//清楚中断标志位
    _EINT();    //开启总中断

MSP430有一个计数寄存器——TAxR Register,这个16位寄存器记录的是定时器的当前计数值,也有一个16位的输出/比较寄存器TAxCCRn Register。在比较模式下,TAxCCRn 记录的是一个比较值,这个比较值和TAxR 中的计数值相比较,这个比较值我理解为STM32中的最大重装载值,由于是16位的,所以最大值还是65535.
在上面这段程序中,显示把TA1CCR0 寄存器的值写成了25000,这是设置了比较值为25000,然后通过修改TA1CCTL0的位,开启定时器中断,然后修改定时器控制寄存器TA1CTL选择时钟源和分频系数等,最后开启总中断(开启总中断是MSP430使用中断的一个必要步骤)。
在这里插入图片描述
之所以设置的是TA1CCR0 ,而不是设置的是TA1CCR1和TA1CCR2,这个问题也困惑了我很久,后来才知道TA1由两个定时器中断向量,用的是不同的比较匹配通道,也就是说一个定时器有两个中断,这里我们使用的中断向量是TIMER1_A0_VECTOR,所以要配置TA1CCR0 和TA1CCTL0。

在这里插入图片描述
这里还参考了另一篇博客,这里的总结比较清晰。
https://blog.csdn.net/xukai871105/article/details/9045555
在这里插入图片描述

在这里插入图片描述

定时器TA1的中断服务函数如下,中断服务函数一定要清楚标志位

#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
{
    if(TA1CTL&TAIFG)
    {
      TA1CTL&=~TAIFG; //清楚中断标志位
    }
}
#endif

== 我们总结一下定时中断的使用步骤==

  • 配置TAxCTL寄存器选择时钟源和分频系数
  • 设置TA1CCR0来确定比较值,也就是最大重装载值
  • 配置TA1CCTL0使能中断,
  • _EINT(); 开启总中断

2. PWM输出

定时器控制输出产生PWM也是输出比较功能,话不多说,马上上代码

void PWM0_Config(void)
{
    WDTCTL = WDTPW + WDTHOLD;  // 关闭看门狗
    P1DIR |=BIT2;              // 设置 P1.2为输出
    P1SEL |=BIT2;              // 设置 P1.2为TA0.2输出,外设功能模式
    P1DS |=BIT2;               //全力驱动,否则可能无法驱动电机
    TA0CCR0 = PWMPeriod;       // 设置PWM 周期
    TA0CCTL1 = OUTMOD_7;       // 设置PWM 输出模式为:7 - PWM复位/置位模式,即输出电平在TAR的值等于CCR2时复位为0,当TAR的值等于CCR0时置位为1,改变CCR2,从而产生PWM。其实模式2也可以
    TA0CTL= TASSEL_2 +MC_1;    // 设置TIMERA的时钟源为SMCLK, 计数模式为up,到CCR0再自动从0开始计数
    TA0CCR1=0;
}

定时器TA0有5个输出通道[0:4],这个定时器最多可以产生5路PWM。和基本的定时器配置类似,我们也需要设置时钟源、计数方式、以及比较值,在这里的这个比较值比较重要,它可以理解为PWM的周期,实际的
T = T A 0 C C R 0 ∗ f T=TA0CCR0 *f T=TA0CCR0f,f是定时器的计数频率。然后我们要设置另一个值TA0CCRx(CCR0是周期,CCR1是通道1的比较值,以此类推),这个值可以理解为PWM中高低电平的分割点,我们改变这个分割点的值就能改变高低电平的时间,这样就能改变占空比了。
这段程序中,先是设置了TA0的通道1的引脚P1.2为外设功能输出模式,然后TA0CCR0中写入计数最大值,也就是计数周期,接着TA0CCTL1设置为 OUTMOD_7,即下图中的111模式,从User’s Guide 中看到,当计时器计数到TAxCCRn值时,输出为低电平,当计时器计数为TAxCCR0值时,输出为高电平。
在这里插入图片描述
当然,仅凭这一段程序是不能产生脉冲波形的,因为我们还需要设置前面提到的TA0CCRx,来调整占空比,程序如下

int PWM0_State(unsigned int n)
{
    unsigned int v = 0;
    v = (n*PWMPeriod)/100;
    TA0CCR1=v;
    return 0;
}

总结

关于MSP430定时器部分就记录到这里,写了关于定时器中断和PWM产生的基本原理和配置方法,全部是自己的个人理解,如有错误请各位指出!

本文含有隐藏内容,请 开通VIP 后查看