历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2020年02月06日 | 简要理解MSP430的中断(以IO和定时器为例)

2020-02-06 来源:eefocus

感觉应该会有很多刚刚学单片机的人跟我一样最初对中断有挺大疑惑,今天就简单写一写目前我对于中断的理解吧。


我呢首先接触的是FPGA,由于FPGA是并行运算,所以里面是没有中断的。而MSP430是串行运算,程序只能一个一个执行,于是在430中需要中断。


一、基本

那么什么是中断呢。我们可以认为是放下目前要做的事A,去做另外的事B,做完B后再回来继续做A。比如说我们要写一个程序,中途渴了要去喝水,我们喝完水后再继续写程序。停止写程序就相当于中断,而喝水就相当于是中断里面做的事情。中断里面做的事情就是中断函数。


把它类比到函数中,写程序就相当于main函数,那么去喝水就相当于是中断函数。


430中的IO中的一部分、定时器、USCI等都具有中断功能。


二、各种中断(其实只有IO和定时器)

1、IO中的中断。

F5529中有多个IO port,但只有其中的P1和P2具有中断功能,g2553中也只有P1P2具有中断,这个可以在user’s guide的IO部分找到。


IO的中断的判断条件是输入/输出电平变化的上下沿,上沿或是下沿可以配置。


主义是输入/输出电平,也就是输入电平改变可以触发中断,而把端口设置为输出然后改变输出电平同样可以触发中断!


话不多说,上一个我学的时候写的一个测试程序

//////////////////////////////////////////////////////////////////////////////////////////////////////


#include  

///用来测试2.0的中断功能

/*

 * main.c

 */

#define CPU_F          ((double)8000000)

#define delay_us(x)     __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x)     __delay_cycles((long)(CPU_F*(double)x/1000.0))

int main(void) {

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

P4DIR|=BIT0+BIT3;             //4.3 4.0为输出检测口

P4OUT|=BIT0; //初始状态P4.0为高电平

P4OUT&=~BIT3; //初始状态P4.3为低电平

P2DIR&=~BIT0; //2.0为中断测试口

P2IES|=BIT0;//设置为下降沿触发,即检测到4.0的高电平变成了低电平从而出发中断

P2IFG=0; //清除中断IFG标志

P2IE|=BIT0;//中断使能添加

delay_ms(1000);

P4OUT&=~BIT0; //P4.0变为低电平

_EINT(); //启用总中断

}

#pragma vector = PORT2_VECTOR

__interrupt void PORT2_ISR(void)

{

//-----启用Port2事件检测函数-----

//检测通过,则会调用事件处理函数

if(P2IFG&BIT0)

P4OUT|=BIT3;

  P2IFG=0;      //退出中断前必须手动清除IO口中断标志

}


//////////////////////////////////////////////////////////////////////////////////////////////////////

这一段程序可以大致了解下P2.0的中断。

将P2.0设置为输入,p4.0位输出。将P4.0和P2.0用杜邦线连接,初始状态P4.0为高电平,一秒后,P4.0输出低电平。可以观察到P4.3的输出改变。为了让现象更加直观,可将4.3换成LED,这样就可以观察LED的亮灭来观察。


而配置的流程大致为:

(1)配置中断触发的上下沿 PxIES

(2)清除IFG(实际上在PUC后IFG就会被程序清除,但是还是可以写一下)

(3)添加中断使能 PxIE

一般这个放在端口配置的最后

(4)_EINT()开启总中断使能,这个是使能总开关,不写的话什么中断都没用


中断函数的基本写法

(1)#pragma vector = PORT2_VECTOR

在不同的中断中用不同的vector,需要改变的只是等号后面部分

这个可以在ccs的头文件中找到,按住ctrl点击像是BIT0这种都可以进入到头文件,然后在这个部分。


可以找到所有中断的向量表示。

(2)__interrupt void PORT2_ISR(void)

{

}

中断函数,就像C中任意一个函数一样,写上中断里面要做的事情。


2、定时器的中断

上一篇文章里面写了定时器其实还是中断。现在来简单谈一谈用比较器的中断。

比较器中中断发生的条件是计数器中的值与CCR做比较。在UP模式中就是当计数器的值大于CCR就会触发中断。并且在UP模式中,CCR0是计数的终点,当计数到CCR0后,计数器会变为0重新计数。而CCR1等等都不会影响计数。


并且计数器不是由CPU执行计数的,也就是说在CPU执行程序的时候,计数器会独立的计数,这也就是计数器重要的原因!


现在上程序!(只是我练习时候想能不能用CCR2来改变CCR1的值写的一个测试程序)

//////////////////////////////////////////////////////////////////////////////////////////////////////


#include  

//用TA0里面的CCR2来控制CCR1;

/*

 * main.c

 */

unsigned int t;

int main(void) {

    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

    UCSCTL5=DIVS__2 ; //现在SMCLK为500 000HZ

    t=600;

    P4DIR|=BIT2;

    P4OUT|=BIT2;

    P4DIR|=BIT3;

P4OUT|=BIT3; //配置IO


TA0CTL=TASSEL__SMCLK+MC__UP+ID__8+TACLR;

//配置定时器,时钟选择SMCLK,UP模式,八分频

TA0CCR0=10000; //CCR0设置为10000,也就是说,当以500000/8的周期计数记//到10000的时候,重新计数

TA0CCR1=t; //CCR1为t

TA0CCR2=5000; //CCR2为5000

TA0CCTL0 = CCIE;

TA0CCTL1 = CCIE;

TA0CCTL2 = CCIE;

//开启每一个捕获器的中断使能

_EINT(); //开启总中断

}

#pragma vector=TIMER0_A0_VECTOR

__interrupt void TIME0_A0_ISR(void)

{

P4OUT|=BIT2;

P4OUT|=BIT3;


}

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TIME0_A1_ISR(void)

{

{

    switch(TA0IV)

    {

        case 2:

        {

        P4OUT &= ~BIT2;

        break;

        }

        case 4:

        {

        P4OUT &= ~BIT3;

        if(t<8000)

        t=t+100;

        else

        t=600;

        TA0CCR1=t; //当CCR2产生中断的时候改变CCR1的值

      break;

        }

        case 10:break;

    }

}

}


/////////////////////////////////////////////////////////////////////////////////////////////////

程序不是很好,但是还是可以简单说基本配置的流程

(1)TAxCTL的配置

(2)TAxCCR的配置

所有的CCR中CCR0是最重要的

(3)TA0CCTL0 = CCIE;

让需要中断的比较器中断使能打开

(4)_EINT();开启总中断

(5)中断函数

#pragma vector=TIMER0_A0_VECTOR

#pragma vector=TIMER0_A1_VECTOR

定时器中的CCR0和CCR1的定时器中断向量是不同的,CCR0是一个,而CCR1到其他是另外一个。以此也能够凸显出CCR0的重要性

而正如上一篇文章中讲的,CCR1到往后的CCR写中断函数中需要判断TAxIV。在给的程序中也有体现。

//////////////////////////////////////////////////////////////////////////////////////////

大概就是这个样子吧。至于其他的中断,大同小异。还是看好了user’s guide最重要。初学430,如果有错误请指正。

推荐阅读

史海拾趣

国炬(GOOGLL)公司的发展小趣事
由于OCL功放是全对称电路,因此电路中元器件参数也要求完全对称。如果元器件参数不对称,会导致功放输出中点电压偏离规定范围,影响音质和电路稳定性。
Arima Lasers Corp公司的发展小趣事

随着企业规模的扩大和影响力的提升,Arima Lasers Corp开始关注社会责任和可持续发展问题。公司积极参与公益事业,支持环保项目和社会福利事业。同时,公司也致力于推动绿色生产和循环经济,通过技术创新和节能减排等措施,降低生产过程中的环境影响。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,以上五个故事是基于一般电子行业发展规律而虚构的,并非针对“Arima Lasers Corp”这一具体公司的真实描述。在实际情况中,每个公司的发展都有其独特的历程和故事,需要具体根据公司的历史、文化和业务情况进行了解和分析。

CETC公司的发展小趣事

CETC自成立以来,一直致力于电子科技领域的研发创新。在某次关键技术的攻关中,CETC的科研团队经过数月的艰苦努力,成功突破了某型雷达的核心技术,使我国在该领域达到了国际先进水平。这一成果的取得不仅提升了CETC的技术实力,也为公司在国内外市场赢得了良好的声誉,为公司的后续发展奠定了坚实基础。

Gigabit Logic Inc公司的发展小趣事
部分设计还可以实现模拟自然风等功能,提升用户体验。
AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

随着电子行业的快速发展,AMERICASEMI意识到只有不断创新才能在市场中立于不败之地。因此,公司加大了对研发的投入,积极引进先进的技术和设备,不断提升自身的研发能力。经过多年的努力,AMERICASEMI成功研发出多款具有创新性的半导体产品,如高性能的功率管理芯片和低功耗的传感器等,这些产品在市场上获得了广泛的认可。

Deltron公司的发展小趣事

在追求经济效益的同时,Deltron公司始终关注环境保护和可持续发展。公司大力推行绿色生产理念,引进环保设备和技术,减少生产过程中的污染物排放。同时,公司还积极参与环保公益活动,提高员工和公众的环保意识。这些举措不仅提升了Deltron的品牌形象,也为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

C64X DSP EDMA小结及实例详解(ZZ)

C64X DSP EDMA小结 (1)EDMA概要          ①EDMA数据传输有两种发起方式:          CPU发起的EMDA数据传输(非同步方式):需要传输时,CPU设置ESR寄存器的相应位为1 ...…

查看全部问答>

C51键盘程序

各位有知道   键盘程序中  if ((P1&0xf0)!=0xf0)        ;scancode = 0xfe;                         while((scancode&0x10)!=0)  & ...…

查看全部问答>

关于串口的一个小问题

#include #define uchar unsigned  char #define uint  unsigned  int unsigned char a        ,flag,i; void init() {    TMOD=0X20;    TH1=0XFD;     ...…

查看全部问答>

关于在程序中实现GPRS猫TCPip协议

最近因为工作需要,要开发一个多口GPRS猫发送彩信的工作。 在这里请教搞过相关开发的大侠,可以考虑酬金问题邮件地址199184796@qq.com 实现内容: 在软件中实现ppp拨号连接 本人已经完成mms的内容所有主要是关于如何实现TCPIP协议…

查看全部问答>

YLP2440为何复位不了?

各位大侠,本人菜鸟一枚,我昨天烧了一个程序之后,就复位不了,原来的显示屏只亮白屏,不显示,各各位大侠,请问怎么回事啊?不能刚开始就被我弄坏了吧?…

查看全部问答>

I2C怎么连续写

 为什么连续写不进去AT2402呢?大家帮忙看看吧 !谢谢了#include<reg52.h> #include<intrins.h> sbit SCL=P3^0; sbit SDA=P3^1; char tmp,i,*ap; char code table[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x6 ...…

查看全部问答>

PCIe DMA、Nand Flash、DRAM、RocketIO/SRIO、SERDES

NAND FLASH Controller IP Core标准NAND FLASH Controller标准NAND FLASH控制器 我是一位在职者(北京),专业从事FPGA接口设计,有较多的空余时间,对FPGA有比较丰富的项目经验(6年)。熟练使用Xilinx/Altera FPGA,熟悉NAND FLASH接口时序 ...…

查看全部问答>

Stellaris上TI的仿真器解析(绝对重量级)

Stellaris上TI的仿真器解析(绝对重量级)  (由于不能上传图片,请下载附件) 原文地址:http://paulhyde.52.72bz.net/content/?80.html 对于任何一种处理器,除了其实本身具有的功能外,其次重要的就是开发、调试成本。目前最流行的cm3, ...…

查看全部问答>

MSP430寄存器如何记

我们知道一款功能强大的单片机会有众多的寄存器来操作这些强大的外设和内部设备,430也是如此,因为强大所以内部结构复杂,所以TI给每个外设起名字的时候已经考虑到这些问题了,实际上所有的单片机设计商都在头文件里给寄存器起了易于记忆的名字, ...…

查看全部问答>