4-MSP430定时器_定时器中断

一开始没写好就上传了,,,,,,,,这次来个全的

自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上PID真的很经典,PLC设备上大多是模块式的,拿来就是参考说明书设置,设置,,,而对于单片机而言就是程序!!!只有自己写出来PID算法,才能对PID有更深刻的理解,..二来感觉自己已经好久都没有写一篇让自己感到满意的文章了......

这些天,,,,今天终于解除了我的很大疑惑了,,,,,,,终于可以完成这篇普通普通定时器中断的文章了,,,,,,其实说普通也不普通,,MSP430的定时器确实设计的很强悍,,,,,,,,

其实对于普通定时器吧!不外乎,,,,定时,,,,产生中断,,,,细节问题就不说了,,,,看我下面的理论介绍部分,,其实写文章一部分是为了分享,最重要的是考验自己到底有没有真正的学会,真正的深入理解了自己所学的东西,自己学东西是一步一个脚印,这倒是高中的班主任的功劳,现在想想自己自学从高三就开始了,没想到当年的班主任的一段话对自己的影响竟然如此的大..如果文章有问题希望亲们给意见哈,,,

CCR0   和  TACCR0  是一个哈,,,,,,,,别在别处看到CCR0就蒙了哈,,,这是设置的计数比较值,,

430的定时器能选择时钟来源,,具体看下面,,,如果不选择那么就是用一个引脚(特定的)的输入PWM作为他的时钟了

先上菜----外部引脚来四个上升沿就进入下面的中断函数  

实质----内部计数器TAR在计数到CCR0(TACCR0)时就进来了

__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  P4OUT ^= BIT1; //P4_1引脚反转
}

然后再来一个上升沿,,就会进入---溢出中断-------可以取消,不让他有溢出中断   

实质----内部计数器TAR在计数到CCR0后,,再来一个上升沿就变成 0 了,,,然后就就进来了

__interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进
{
  switch( TAIV )
  {
  case  TAIV_TAIFG://溢出中断
             P4OUT ^= BIT1; //P4_1反转
             break;
  }
}

下面是完整的程序

P1_0引脚,来四个上升沿TAR变为4,,P4_1反转,,,再来一个沿TAR变为0,再来四个,TAR变为4,,P4_1反转,再来一个沿TAR变为0,再来四个,TAR变为4,,P4_1反转,,,循环

所以发现第一次来四个P4_1反转,,,,后来的都是来5个再反转了,,所以如果你想来四个反转,,那么TACCR0应该为3

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  
  P4DIR |= BIT1; 
  
  TACTL |= TASSEL_0 + MC_1+ TAIE + TACLR;//时钟外部引脚输入,增计数模式,产生溢出中断(可以取消),清除一下溢出,,其实严谨一点嘛,先清除再说

  TACCR0 = 3;//计数值3
  TACCTL0 = CCIE;//允许中断
  
  __enable_interrupt();//打开总中断
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  P4OUT ^= BIT1; 
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进
{
  switch( TAIV )
  {
  case  TAIV_TAIFG://溢出中断
             P4OUT ^= BIT1; 
             break;
  }
}

现在去掉溢出中断

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  
  P4DIR |= BIT1; 
  
  TACTL |= TASSEL_0 + MC_1+TACLR;//外部引脚模式,,增计数模式

  TACCR0 = 3;//计数值3,其实是4,,因为有一个溢出变为0
  TACCTL0 = CCIE;//允许中断
  
  __enable_interrupt();//打开总中断
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  P4OUT ^= BIT1; 
}

下面是一些具体解释

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  
  P4DIR |= BIT1+BIT2; 
  
  TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式

  TACCR0 = 4;//计数值4
  TACCTL0 = CCIE;//允许中断
  
  __enable_interrupt();//打开总中断
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  P4OUT ^= BIT1; 
}

可以这样

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  
  P4DIR |= BIT1+BIT2; 
  
  TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式

  TACCR0 = 4;//计数值4
  TACCTL0 = CCIE;//允许中断
  
  __enable_interrupt();//打开总中断
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  TACCR0 = TACCR0 + 4;//******这里,这里***********//
  P4OUT ^= BIT1; 
}

因为是连续计数模式,所以可以用TACCR1了,,,,

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  
  P4DIR |= BIT1+BIT2; 
  
  TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式

  TACCR0 = 4;//计数值4,TAR==TACCR0进入它的中断函数
  TACCTL0 = CCIE;//允许中断
  
  TACCR1 = 6;//计数值6,TAR==TACCR1进入它的中断函数
  TACCTL1 = CCIE;//允许中断
  
  __enable_interrupt();//打开总中断
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  TACCR0 = TACCR0 + 4;//******这里,这里***********//
  P4OUT ^= BIT1; 
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进(共用)
{
  switch( TAIV )
  {
  case  TAIV_TACCR1://计数"  TACCR1 "的中断
             TACCR1 = TACCR1 + 6;
             P4OUT ^= BIT2; 
             break;
  }
}

既然有溢出中断那么再加上溢出中断吧

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  
  P4DIR |= BIT1+BIT2+BIT3; 
  
  TACTL |= TASSEL_0 + MC_2 + TAIE +TACLR;//外部引脚模式,,增计数模式

  TACCR0 = 4;//计数值4,TAR==TACCR0进入它的中断函数
  TACCTL0 = CCIE;//允许中断
  
  TACCR1 = 6;//计数值6,TAR==TACCR1进入它的中断函数
  TACCTL1 = CCIE;//允许中断
  
  __enable_interrupt();//打开总中断
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定时器A0中断服务程序
{
  TACCR0 = TACCR0 + 4;//******这里,这里***********//
  P4OUT ^= BIT1; 
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进(共用)
{
  switch( TAIV )
  {
  case  TAIV_TACCR1://计数"  TACCR1 "的中断
             TACCR1 = TACCR1 + 6;
             P4OUT ^= BIT2; 
             break;
  case  TAIV_TAIFG://溢出中断,,,,ffff变0时
             P4OUT ^= BIT3; 
             break;           
  }
}

下面是理论知识的介绍,,,看了上面再看一下下面,,,,,

通俗来讲,430F249有三个振荡器,LFXT1,,XT2,,DCO,

内部的主时钟MCLK,,子系统时钟SMCLK和辅助时钟ACLK是由这三个振荡器来源提供的.

MCLK:主时钟

可以选择3个振荡器(LFXT1、XT2、DCO)之一,或它们1/2/4/8分频后作为其信号源;

SMCLK:子系统时钟

可以选择2个振荡器(XT2、DCO),或它们1/2/4/8分频后作为其信号源;

ACLK:辅助时钟

只能由LFXT1时钟信号或1/2/4/8分频后作为其信号源。

有三个呢!!!真多

自从博客可以复制粘贴图片,感觉真是太方便了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏梦里茶室

sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow

这是sqlite在Android系统上的一个bug,在需要建立索引的sql语句频繁执行时,会发生这个异常。

1012
来自专栏Java3y

Hibernate【映射】知识要点

前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的…因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地...

3127
来自专栏GopherCoder

『No19: Gorm 上手指南』

如果你是做后端开发的,日常工作中,除了熟悉编程语言之外,数据库怕是最常用的技术了吧。

6321
来自专栏Java成神之路

分布式_事务_02_2PC框架raincat源码解析

上一节已经将raincat demo工程运行起来了,这一节来分析下raincat的源码

2071
来自专栏Android 研究

APK安装流程详解2——PackageManager简介

俗话说的好,得中原者,得天下,那么想要了解Android的安装了流程就不得不提及一个重要的类"PackageManager"我们就先来了解这两个类

2943
来自专栏Kubernetes

深度解析Kubernetes Local Persistent Volume(二)

摘要:上一篇博客”深度解析Kubernetes Local Persistent Volume(一)“对local volume的基本原理和注意事项进行了分析,...

1.3K3
来自专栏腾讯Bugly的专栏

不给“爸爸”添麻烦 - iTOP iOS 动态库改造

苹果官方文档 对提交商店 APP 的二进制文件中__TEXT段大小有限制,超过大小限制的应用在提交评审的时候会被拒绝...

5869
来自专栏梦里茶室

sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow

这是sqlite在Android系统上的一个bug,在需要建立索引的sql语句频繁执行时,会发生这个异常。

591
来自专栏梦里茶室

sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow

12-14 19:51:30.346 17770-18098/com.company.product W/System.err: com.company.pr...

4819
来自专栏MasiMaro 的技术博文

使用FormatMessage函数编写一个内核错误码查看器

在编写驱动程序的时候,常用的一个结构是NTSTATUS,它来表示操作是否成功,但是对于失败的情况它的返回码过多,不可能记住所有的情况,应用层有一个GetLast...

952

扫码关注云+社区

领取腾讯云代金券