一、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=TA0CCR0∗f,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产生的基本原理和配置方法,全部是自己的个人理解,如有错误请各位指出!