MSP430单片机中断嵌套,如何跳出中断?

MSP430单片机中断嵌套,如何跳出中断?,第1张

MSP430单片机中断嵌套跳出中断的方法:

如果是要求中断A->中断B这样的序列才会从中断B直接返回主程序的话,那必须要在中断A那里做个标志位表明发生了中断A,由中断B判断。中断B执行完,修改堆栈指针,指向中断A的堆栈地址(压栈后的),直接指令退出中断即可。

但要注意,若在中断A中开了总中断,则可以响应后来的中断B,B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开。

扩展资料:

MSP430单片机的相关要求规定:

1、MSP430单片机称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供“单片机”解决方案。该系列单片机多应用于需要电池供电的便携式仪器仪表中。

2、MSP430系列的部分产品具有Flash存储器,在系统设计、开发调试及实际应用上都表现出较明显的优点。TI公司推出具有Flash 型存储器及JTAG 边界扫描技术的廉价开发工具MSP-FET430X110,将国际上先进的JTAG技术和Flash在线编程技术引入MSP430。

3、MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。这些特点保证了可编制出高效率的源程序。

参考资料来源:百度百科-MSP430单片机

不管你使能与否,中断标志位在接收到中断信号的时候都会置位,只是如果没有使能的话,是不会进入到对应中断向量的中断处理函数的。换句话说就是,你在P1.4的中断函数里处理了P1其他端口的中断。

传一个例程给你看看

/***************************************************

程序功能:用中断方式读取四个独立式按键的键值,同时将

按键的键值在数码管上显示出来

----------------------------------------------------

测试说明:按动K1~k4四个按键,观察数码管显示

***************************************************/

#include <msp430x14x.h>

#include "BoardConfig.h"

#define keyin(P1IN &0x0f)

//数码管7位段码:0--f

uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

uchar KeyVal = 0 // 按键的键值

void delay(void)

/********************主函数********************/

void main( void )

{

WDTCTL = WDTPW + WDTHOLD //关闭看门狗

BoardConfig(0x88) //打开数码管,关闭流水灯和电平转换

P1IES = 0x0f // P1.0~P1.3选择下降沿中断,按键按下时为低电平

P1IE = 0x0f // 打开中断使能

P1DIR = BIT7 //设置P1.0~P.3为输入状态,P.7为输出

P1OUT = 0

P4DIR = 0xff

P5DIR = 0xff

P4OUT = 0x3f

P5OUT = 0xf7

_EINT() //打开全局中断控制位

while(1)

{

LPM1

P4OUT = scandata[KeyVal]

}

}

/*******************************************

函数名称:delay

功能:用于消抖的延时

参数:无

返回值 :无

********************************************/

void delay(void)

{

uint tmp

for(tmp = 12000tmp >0tmp--)

}

/*******************************************

函数名称:PORT1_ISR

功能:P1端口的中断服务函数

参数:无

返回值 :无

********************************************/

#pragma vector=PORT1_VECTOR

__interrupt void PORT1_ISR(void)

{

if(P1IFG &0x0f)

{

switch(P1IFG)

{

case 0x01:

if(keyin == 0x0e) //如果是第一个按键被按下

{

delay()

if(keyin == 0x0e)

{

while(keyin != 0x0f) //等待按键放开

KeyVal = 1

LPM1_EXIT

P1IFG = 0

return

}

}

case 0x02:

if(keyin == 0x0d) //如果是第二个按键被按下

{

delay()

if(keyin == 0x0d)

{

while(keyin != 0x0f) //等待按键放开

KeyVal = 2

LPM1_EXIT

P1IFG = 0

return

}

}

case 0x04:

if(keyin == 0x0b) //如果是第三个按键被按下

{

delay()

if(keyin == 0x0b)

{

while(keyin != 0x0f) //等待按键放开

KeyVal = 3

LPM1_EXIT

P1IFG = 0

return

}

}

case 0x08:

if(keyin == 0x07) //如果是第四个按键被按下

{

delay()

if(keyin == 0x07)

{

while(keyin != 0x0f) //等待按键放开

KeyVal = 4

LPM1_EXIT

P1IFG = 0

return

}

}

default:

while(keyin != 0x0f) //等待按键放开

//KeyVal = 0

//LPM1_EXIT

P1IFG = 0

return

}

}

}

//例程来自LT-1B的程序例子


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7758996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存