历史上的今天
返回首页

历史上的今天

今天是:2025年05月17日(星期六)

2020年05月17日 | MSP430单片机的中断机制

2020-05-17 来源:eefocus

msp430教程之四

上次和大家聊到了GPIO的使用,但是讲的不是很全面,要是全面涉及的话就是我们后面要讲的内容了,这里我们就不多加描述。在后期的讲解中也会慢慢涉及我们没有讲到的一些功能的。今天我们要涉及一个对于单片机来说非常重要的一个概念和功能。

 

什么是中断?

 

我们不以专业术语来描述这个东西,我们以一个比较好理解的方式来讲。首先大家要有一个理解就是我们单片机是按照程序一步一步的执行的,通过仿真的时候大家也可以看出来我们点击单步运行我们就可以看到光标向下移动一步,也就是单片机向下移动一步。就是单步运行的。就像我们人一样,你只能在一个时刻内做一件事情,没有办法说一边吃饭一边喝水吧(极短的时刻内你不行的吧),当你要做另外一件事的时候,你需要把手上这件事停下来去做另外一件事,对吧,这样子我们就产生了一个中断的概念,但我们在写作业的时候需要去把烧开的水关掉,就需要停止手头的事情去关掉开水。对于单片机来说也是这样的,我们看到我们之前写的程序中,都会有一个死循环,for(;;),这个是C语言的东西我们就不在过多描述了,在这个死循环里面做我们的动作,但是这是如果系统告诉我们需要去点亮一个灯,那单片机就需要停止死循环里面的动作,先去点灯,然后在跑回来继续执行死循环里面的代码。通过图示我们可以更加了解他的机制。


就如上图中描述的一样,当然我们也可以进行中断嵌套,也就是说在一个中断中间又进行中间又来一个优先级更高的中断,这是就会在中断当中又产生一个中断。这个我们在后头会继续再说,这里大家先知道一下他可以有这么个功能。

好了接下来我们进入中断的学习了,那么关于中断的知识我们该去哪里找呢?

 

还是那份文档,MSP430FR58xx, MSP430FR59xx, MSP430FR68xx, and MSP430FR69xx Family User's Guide.pdf。这份文档是十分重要的,我希望大家在写程序的时候需要打开它,查找到我们需要的那部分内容。


在第十章的10.2.6中有一个章节是Port Interrupts,这里就是讲到中断了。

插曲:


为什么我想写一个关于430的教程,前面也说到说他的资料较少,学的人感觉好像也不多,很少有人选择他作为入门的单片机学习,所以想打破这个局面。另外一个方面是他的很多资料是英文的,这个对大家是很有帮助的,在你以后进公司的时候可能面临的很多资料都不会是中文的,所以从一开始打破大家对中文的一种依赖性我觉得是很好的。虽然这样子明显难度就会大一些,我会尽量减少这个门槛的。

 

大家点击到这里的话就可以看到文档对中断的一个描述,我这里简单吧重点说一下,其他的大家就慢慢看一下,打开有道不懂的单词就查一下,不要觉得很烦,但是真的对你有很大的帮助。


对于430来讲,P1和P2口都是可以作为单片机的中断入口的,是由三个寄存器进行控制的。具体是Pxifg,PxIE,PxIES。有些器件可能会有些不同,具体要看他们的数据手册。


那么这三个寄存器分别是什么呢?

PxIFG(Port x Interrupt Flag register)端口x中断标志寄存器

PxIE(Port x Interrupt Enable Register)端口x中断使能寄存器

PxIES(Port x Interrupt Edge Select Register)端口x中断边沿选择寄存器


接下来我们看下怎么用它来写代码。


所限我们需要明白使用中断的一个具体的步骤是什么?(这里我们使用的是端口中断,下次我们还会谈到定时器中断)

1.配置端口,设置端口的方向,也就是设置PxDIR的方向,设置上拉下拉等

        注意:如果外部硬件上面没有上下拉电阻的话,这里一定要进行配置,否则将导致输入电平不稳定

        2.设置中断的触发模式,上升沿还是下降沿或者两者均可以产生中断

        3.开启中断,就是设置PxIE

        4.编写中断子函数

        5.清除中断标志位,设置PxIFG

大概是这样的一个操作流程,但是也可能中间还会有些不同的地方。要根据具体的使用情景和方式。


这里我们要实现的是按键按下触发中断然后点亮led。这里我们使用FR5969板子上的按键S2和LED2。


      第一步:还是和之前一样,需要关闭看门狗。关闭低功耗模式

      WDTCTL = WDTPW + WDTHOLD;

       PM5CTL0 &= ~LOCKLPM5;  

       第二步:设置端口方向

       P1DIR |= BIT0; //设置LED的方向

       P1OUT &= ~BIT0;//设置LED的默认输出,为低电平不点亮

       P1DIR &= ~BIT1;//这一步可以省略,但是我们最好都写,默认端口为输入

       P1REN = BIT1;//设置按键的tid=418719&page=2" rel="nofollow" target="_blank" class="relatedlink">上拉电阻

       第三步:配置中断

        P1IES |= BIT1;//设置按键中断为下降沿触发

         P1IE |= BIT1;//使能中断

         最后我们还要使能总中断:

          _enable_interrupts();

          第四步:

         我们要编写中断子函数:

        #pragma vector = PORT1_VECTOR

        __ interrupt void PORT1_ISR(void)

       {

              unsigned int Key = 0;

              Key = P1IFG & (~P1DIR);

              __delay_cycles(10000);

              if((P1IN&Key) == 0)

              {

                     switch(Key){

                         //Case BIT0: P10_Onclick();break;

                            Case BIT1: P11_Onclick();break;

                         //Case BIT2: P12_Onclick();break;

                         //Case BIT3: P13_Onclick();break;

                         //Case BIT4: P14_Onclick();break;

                         //Case BIT5: P15_Onclick();break;

                         //Case BIT6: P16_Onclick();break;

                         //Case BIT7: P17_Onclick();break;

                }

          }

          P1IFG = 0;//清除中断标志位

       }

        void P11_Onclick()

       {

            P1OUT ^= BIT0;//翻转LED的电平

       }


大家可以看到我们使用了一个switch的语句进行了Key的跳转,这里因为我们输入的引脚是P1.1所以我们对应的中断服务函数是P11_Onclick(),这样子有一个什么好处呢?就是我们可以封装我们的一个函数,可以写的更加方便,写一个函数我们达到P1端口任意一个引脚的按键输入。(这一段代码参考的是从零开启大学生电子设计之路一书)

 

这样子我们就完成了整个的一个中断函数的的编写,也完成了我们预期想要达到的一个目的,按下按键点亮LED。


我们大概说一下代码的书写,其实大家发现,这次代码的书写没有只写在main函数中,我们分成了几个函数,分别称为主函数和子函数,那么程序开始都是从主函数中执行的。现在我们的工程还不大,所以在一个c文件我们就可以达到我们想要的功能,但是等你的代码很复杂的话,就需要进行模块化的搭建,需要一个框架来整理整个代码结构。下一讲我们会具体讲到如何应用该方法。

 

#pragma vector = PORT1_VECTOR


这个中断向量定义,是固定的写法,具体为什么这么写,我们来看看。


所先#pragma是一个预处理指令,和我们#define有点类似,具体的话我也不懂希望大家给一下解释。

vector = PORT1_VECTOR


这一句我的理解是指定中断向量表的入口地址,那么这些地址定义在哪里呢?还是一样的办法,右键找到定义。在msp430FR5969.h文件中找到。


跟着下面就是我们要写的中断函数了,__ interrupt前面是两个下划线,表示该函数为中断服务函数这种特殊的函数。关于函数名字则大家可以自己取。


好了,本次就说这么多了,下次我们将更加具体的讲解如何利用TI官方给的库函数进行编写。


这一讲中我们只是简单介绍了IO的中断,其实中断还包括了很多内容,中断向量表,然后各种中断,一看你就头大的那种,这里我们暂时不说,只是给大家一个概念,之后我们用到的时候回在细细的说明!

推荐阅读

史海拾趣

APLUS Products公司的发展小趣事

随着国内市场的不断饱和,APLUS Products公司开始寻求国际化发展的道路。在XXXX年,公司成功打入欧洲市场,并在当地建立了分支机构。通过深入了解欧洲消费者的需求和偏好,公司不断优化产品设计和营销策略,逐渐赢得了欧洲消费者的认可和喜爱。

Hosiden Corporation公司的发展小趣事

近年来,Hosiden在技术创新方面取得了显著成果。特别是在汽车市场,公司积极参与并推动了MIPI A-PHY标准的验证与应用。Hosiden与Valens Semiconductor等领先企业合作,完成了其连接器和电缆对Valens VA7000芯片组的验证,这是市场上首个符合MIPI A-PHY的芯片组。这一里程碑式的成就不仅展示了Hosiden在技术创新方面的实力,也进一步巩固了其在汽车电子市场中的领先地位。

ECS公司的发展小趣事

随着云计算技术的不断发展,ECS公司意识到只有不断创新才能保持竞争优势。他们投入大量研发资源,对ECS服务进行了多次技术升级和产品优化。例如,他们引入了智能调度算法,实现了计算资源的自动分配和负载均衡;同时,他们还加强了数据安全性和隐私保护措施,确保客户的数据安全。这些技术突破和产品升级使得ECS公司的服务更加稳定、可靠和高效。

Digital Equipment Corp公司的发展小趣事

2001年,惠普公司与康柏公司宣布合并,DEC作为康柏的一部分也随之并入惠普。这次合并进一步扩大了DEC的业务范围和市场影响力。在合并后,DEC的计算机产品和技术被整合到惠普的产品线中,同时DEC的品牌也逐渐淡出市场。然而,DEC在计算机行业中的贡献和影响力仍然被广泛认可,其技术遗产和创新精神在惠普及其他科技公司中得到了传承和发展。

Cornell Dubilier公司的发展小趣事

随着时间的推移,Cornell Dubilier公司不断致力于技术创新和产品升级。在电力电容领域,公司取得了显著的成果,其产品广泛应用于飞机、激光医学技术、替代能源、电焊机及发电机等多个领域。这些技术的突破和应用,不仅提升了公司的市场竞争力,也为电子行业的发展做出了贡献。

CML公司的发展小趣事

CML公司成立于1968年,那是一个半导体技术刚刚起步的年代。公司创始人们洞察到单芯片解决方案的巨大潜力,决心打破当时标准组件组装的常规,着手创建创新的单芯片产品。初创时期,CML面临着资金短缺、技术瓶颈以及市场竞争等多重挑战。然而,正是在这样的环境下,CML凭借对技术的执着和对市场的敏锐洞察,成功推出了首款产品——频率敏感开关。这款产品凭借其卓越的性能和稳定性,迅速在消费产品市场赢得了口碑,为CML的发展奠定了坚实的基础。

问答坊 | AI 解惑

过来人指点下~~~~~~~

小弟研究生刚通过,估计是要搞模拟IC了,专业是微电子,向过来人请教下,要想搞明白模拟电路,要看哪些书了? 先谢过达人了!!!!…

查看全部问答>

向一个已经很简单的电路仅仅添加两个电阻

实习的时候发现几年前的好东西:基极电流补偿电路, 对于电流放大能力不强的三极管而言,普通恒流源电路存在较大的误差,原因是基极电流不能够忽略, 而mos管却不适用于更高速的场合, 向电路添加两个精度为1%的电阻,输出电流的精度提高了100倍 ...…

查看全部问答>

送分100分:关于串口通讯的小问题

串口通讯时,比如我发送了10个字节,接收端是如何接收这每一位的数据的,又是如何区分开每个位,并把它划归到相应的字节中的。谢谢。…

查看全部问答>

做过电力规约的请进

《山东省用电现场服务与管理系统通信规约》、《江西省用电现场服务与管理系统配变监测子系统(江西电网配电变压器综合监测管理系统)通讯规约(试行稿)》、《大客户电力负荷管理系统通讯规约(第二版)》都有“任务”这个功能参数 8 1 X X 它的长 ...…

查看全部问答>

USB IEEEE1284.4

大家快来帮帮忙,进行USB IEEEE1284.4通讯时如何实现?各位拜托了,着急!谢谢!…

查看全部问答>

超声波防盗系统的程序

以下是51单片机芯片汇编程序的接口;******************************** ;遥控开锁指示:    P2.1 ;遥控关锁指示:    P2.2 ;定时溢出指示:  P1.1 ;超近距离指示:    P1.5 ;超远距离指示:    P1.6 ;定 ...…

查看全部问答>

关于Windows Media Player OCX的问题

三个问题, 1,在http://msdn.microsoft.com/en-us/library/ee487211.aspx上我看到说Windows Media Player OCX control 7.0需要Windows Embedded 6.0 FP6,这个Windows Embedded 6.0 FP6是什么东西? 2,Windows Media Player OCX control默认 ...…

查看全部问答>

arm bank的问题

我在网上看到S3C2410A将系统的存储空间分成8个bank,每个bank的大小是128M字节。 每个bank都有一个nGCSx对应 nGCSx被叫做片选,片选上可以连接内存 那是不是一个256M的内存链接到上述一个片选上,因为一个片选对应的bank的大小只有128M,就会浪费 ...…

查看全部问答>

求助高手,推荐一款便宜的带agc的芯片,对音质无要求

求助高手,推荐一款便宜的带agc的芯片,对音质无要求,只用来放大。…

查看全部问答>

关于系统初始化

系统初始化时,怎么根据实际使用振荡器?如内部振荡器1和2。…

查看全部问答>