历史上的今天
今天是:2025年02月28日(星期五)
2020年02月28日 | MSP430系列嵌入式实验教程---中断
2020-02-28 来源:eefocus
中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。简单来说就是CPU停止执行正在执行的任务,去处理突发事件,然后再回来继续执行当前任务。中断在单片机中可以起到定时,外部信号检测等作用。
预备知识
把引起中断的原因或者能够发出中断请求的信号源统称为中断源。中断首先需要由中断源发出中断请求,并征得系统允许后才会发生。在转去执行中断服务程序前,程序需保护中断现场;在执行完中断服务程序后,应恢复中断现场。
中断源一般分成两类:外部硬件中断源和内部软件中断源。外部硬件中断源包括可屏蔽中断和不可屏蔽中断。内部软件中断源产生于单片机内部,主要有以下3种:①由CPU运行结果产生;②执行中断指令INT3;③使用DEBUG中单步或断点设置引起。
多个中断同时等待时优先响应高优先级的中断。

不可屏蔽中断通常是系统产生的,不受通用中断使能位(GIE)位影响,如时钟中断。可屏蔽的中断由外围模块产生,每个中断源都有单独的中断位控制,同时也受全局状态寄存器的GIE位控制。
当发生中断后,如果外围模块独立的使能位打开,并且全局总中断位(GIE)允许,将执行中断服务程序。
从接收中断请求到执行中断服务程序的第一条指令需要延迟六个周期,在此期间完成了以下操作:
完成当前所有的指令
指向下一条指令的PC被压入堆栈
SR压入堆栈
选择最高优先级的中断
复位单源中断标志,多源标志需要后手动清除
清除除SCG0之外的所有SR,终止低功耗模式。清除GIE位,不再响应其他中断
加载中断向量中的内容到PC中,开始执行中断服务程序。

烣复中断需要5个周期。SR将会从从堆栈中拉出,以前的各种GIE、CPUOFF等设置参数将会烣复,但在中断服务程序里边配置的将会被忽略。
从上边进栈过程可能看出,MSP430单片机在进入中断服务程序后复位了SR寄存器,会自动清除GIE位,也就是说此时不允许响应其他中断,如果需要实现中断嵌套,则需在中数服务函数里使能GIE位即可。
注意:避免在EINT全局中断使能和DINT紧临着使用,可能会导致CPU运行异常
端口中断寄存器
MSP430单片机的P1和P2端口具有中断功能(有些系列可能其他端口也具有中断功能),包含了PxIFG、PxIE、PxIEX等寄存器。
PxIFG表示对应位的IO的中断标志,在中断允许位PxIE置位并且总中断位GIE允许的情况下,输入口出现触发信号后会将PxIFG置位.当进入中断服务程序,访问PxIV寄存器后,最高优先级的PxIFG会自动复位.修改IO端口的其他寄存器可能会导致PxIFG位改变.
PxIES定义了触发边沿:
PxIES 触发方式
0 上升沿触发
1 下降沿触发
当对PxIES写操作时,可能会使PxIFG置位:
PxIES PxIN PxIFG
0–>1 0 set
0–>1 1 unchanged
1–>0 0 unchanged
1–>0 1 set
下边是一个示例,在P2.0端口出现边沿信号时会中断正常执行的程序,进入中断服务程序,闪烁一次LED:
P2IE |= BIT0; //P2.0中断
P2DIR &= ~BIT0;//P2.0 输入
P2REN |= BIT0;//使能上下拉电阻
P2OUT |= BIT0;//选择使用上拉电阻
P2IES |= 1; //下降沿触发
#pragma vector=PORT2_VECTOR
__interrupt void p2Interrupt()
{
P2IES ^= BIT0; //翻转边沿方向
blinkLED();//闪烁LED
P2IFG = 0; //清除中断标志
}
使能对应的中断允许位后,一定要指定中断向量的入口函数地址,否则系统会找不到中断服务函数。
输入端口在使用时不要悬空,不然会造成误触发,在接入外部按键等输入信号时应设计上下拉电阻,也可以使用内部的上下拉电阻,确保有一个非零即一的稳定电平.
PxREN定义了是否引入内部上下拉电阻。默认值PxREN.y=0时不接入内部电阻。
当配置PxREN.y=1时内部电阻被接入电路。电阻一端固定接在了IO输入端,至于另一端是接在VCC还是GND则由PxOUT.y决定。
当PxIN.y=0,PxREN.y=1时:
PxOUT 内部电阻
1 上拉输入
0 下拉输入
注意:
外部如果连接有机械类的传感器(如机械按键,光电检测)时,在触发时可以出现很多边沿信号,需要用一些手段进行滤波消抖.
史海拾趣
|
2.4G无线智能灯控方案 一, 方案概述 本方案解决家庭、小区智能灯光控制。针对日渐繁多的室内灯光种类,以及开关连线复杂的状况,采用无线控制灯光,实现灯光情景模式设定以及开关位置灵活摆放。ZG1100采用串口与上位 ...… 查看全部问答> |
|
;-------------------1543对应的管脚接线方式----------------------- ;1543AT89C52 ;EOCP1.5 ;I/O CLOCKP1.6 ;ADDRESSP1.7 ;DATAOUTP3.0 ;CSP3.1 ;=========================================== ...… 查看全部问答> |
|
case \"$board_name\" in assabet) board_name=\"Intel Assabet\" AC_DEFINE(ASSABET) ...… 查看全部问答> |
|
想做个基于蓝牙应用的嵌入式项目,想法是 开发板+单独蓝牙模块,操作系统用linux,因为对硬件不熟悉,不知道选择那个平台的什么型号的开发板,恳请赐教,谢谢~~~… 查看全部问答> |
|
LM3s8962体验之二----------- Keil µVision 4 目标工具选项详解 一、目标工具选项(Target Options …) µVision可以设置目标硬件的选项。通过下图1中的工具栏2区域按钮或1区域菜单项Project -> Options for Target打开Options for Target对话框。 & ...… 查看全部问答> |
|
小弟新手,在画PCB的时候碰到一些问题,我们设定板子边框的时候本来应该用机械层的, 但是很多时候我们用禁止布线层也可以,原因是因为PCB厂家知道我们的意思。 假设我们想在板子中间开一 ...… 查看全部问答> |
|
请问Freescale MPC8377VRALG 的架构和CPU类型是什么? 我用的芯片是Freescale MPC8377VRALG,现在想用crosstool-ng编用在这块芯片上的交叉编译工具链。在crosstool-ng menuconfig配置中“Target options”下有几项不知道填写什么,请大家提供帮助。谢谢! Target options ---> &nbs ...… 查看全部问答> |




