MSP430学习总结——定时器

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

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
msp430f5529lp定时器的输出模式可以通过设置captureOutputMode参数来实现。根据引用\[2\]中的描述,可以选择以下几种输出模式: - TIMER_A_OUTPUTMODE_OUTBITVALUE:定时器输出电平由OUT位控制。 - TIMER_A_OUTPUTMODE_SET:定时器输出电平为高电平。 - TIMER_A_OUTPUTMODE_TOGGLE_RESET:定时器输出电平在每次比较中切换一次。 - TIMER_A_OUTPUTMODE_SET_RESET:定时器输出电平在每次比较中先置高再置低。 - TIMER_A_OUTPUTMODE_TOGGLE:定时器输出电平在每次比较中切换一次。 - TIMER_A_OUTPUTMODE_RESET:定时器输出电平为低电平。 - TIMER_A_OUTPUTMODE_TOGGLE_SET:定时器输出电平在每次比较中切换一次。 - TIMER_A_OUTPUTMODE_RESET_SET:定时器输出电平在每次比较中先置低再置高。 根据你的需求,选择适合的输出模式即可。 #### 引用[.reference_title] - *1* *2* [MSP430F5529库函数定时器A——捕获实验](https://blog.csdn.net/qq_63922192/article/details/127779050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MSP430F5529库函数定时器A——硬件PWM](https://blog.csdn.net/qq_63922192/article/details/127778390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值