【MSP430趣谈】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;//设置按键的上拉电阻

第三步:配置中断

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的中断,其实中断还包括了很多内容,中断向量表,然后各种中断,一看你就头大的那种,这里我们暂时不说,只是给大家一个概念,之后我们用到的时候回在细细的说明!

欢迎观看

【MSP430趣谈】MSP430第一讲

【MSP430趣谈】MSP430第二讲

【MSP430趣谈】MSP430第三讲

(0)

相关推荐

  • CCS5.4+Proteus8的F28027实践课二、定时器0控制LED流水灯

    刚游泳回来,看到昨晚那篇博客访问量比较高,对我是莫大的鼓励,所以马不停蹄的去找了相关的手册准备我们今天的课程. 今天我们要说的是用定时器0产生的定时中断让LED闪烁. 大家都是大部分都是工科出身,应该 ...

  • STM32 ~ USART接收不定长数据

    IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断.什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据. ...

  • 【MSP430趣谈】MSP430第十二讲之ADC(下)

    Ksps的意思是每秒转换次数为多少. 这里插播一个细节的东西,德州仪器(TI)的官网不管对于库函数还是寄存器都给出了示例代码,我们通过我们CCS环境下面的TI Resource Explorer下面查 ...

  • 【MSP430趣谈】MSP430第十二讲之ADC(上)

    首先我们需要明白一个问题是什么是ADC,中文翻译过来就是模数转换器,从他的英文名的话我们会更加好记,Analog-to-Digital Converter. 简而言之就是将模拟量转换为数字量.在我们的 ...

  • 【MSP430趣谈】MSP430第十讲之SPI总线驱动OLED

    上次我们说到了430的UART的使用方法,当我们一步一步开始探索的时候会发现它的实际应用是十分复杂的,但是经过我们的慢慢的看下来,我们看到TI给了很多官方的参数供给我们进行选择,所以这里给我们带来了很 ...

  • 【MSP430趣谈】MSP430第九讲之串口使用

    上次一讲中我们说到了定时器的两种写法,一种是利用寄存器进行书写的,另外一种是利用官方库函数进行书写的.我们通过对比这两种写法,发现库函数居然写的要比寄存器还多,这不是更加不方便了吗.其实库函数和寄存器 ...

  • 【MSP430趣谈】MSP430第八讲之时钟设置

    写到现在已经是第八讲了,希望大家多多支持.可能我的行文风格和我们的标题不大符合,趣谈,对吧.但是希望能够仔细的讲到每一点,让所有初学者能够明白.如果大家有不懂的地方也麻烦留言一下,也有帮助我补充和完善 ...

  • 【MSP430趣谈】MSP430第二讲

    在上次我们说到了软件的安装以及相关的资料. 那么接下来我们即将进入"板子游戏"开发的过程咯! 首先打开我们的软件: 出现上面的对话框,我们可以选择我们自己的工程路径,一般下面的Us ...

  • 【MSP430趣谈】MSP430第一讲

    现在市面上属于单片机的有很多很多了,包括基础一点的51单片机,他出现的比较早,相对而言资料也稍微丰富一点.430也作为一款优秀的单片机,相信也有很多人运用这款单片机的作为自己的单片机入门的选项.但相对 ...

  • 【MSP430趣谈】MSP430第十三讲之DMA的应用

    本系列教程应该来说也已经基本接近尾声了,还会有几讲的内容,最后如果可以的话还回附上一个具体的案例让我们来看下具体该如何应用430这款产品.也将更加深入的探讨他的低功耗特性. 今天我们还是继续讨论430 ...

  • 【MSP430趣谈之六】时钟简介与图形化配置方式

    不知道大家现在有没有一点感觉步入单片机的感觉,这次我们来聊一聊关于单片机的"心脏基调",也就是单片的时钟.为什么说是心脏呢?也就是说单片机的运行步伐是靠这个时钟来决定的,按照时钟的 ...