历史上的今天
今天是:2024年09月04日(星期三)
2019年09月04日 | cc2530裸机编程系列笔记5--中断
2019-09-04 来源:eefocus
中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU 暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。
中断处理过程:
(1)保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态和程序计数器PC 等的值。
(2)分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。
(3)恢复被中断进程的现场,CPU 继续执行原来被中断的进程。
【本实验的设计思路】
开发板上已把S1 按键与P0.1 相连,本实验想要达到的效果就是,通过按键S1 触发P0.1的中断,进而在中断服务子程序中控制LED1 的亮/灭。与外部中断相关SFR 寄存器有3 个SFR:EA、IEN1、PICTL(各SFR 详细介绍请查阅《CC2530 中文手册》),开启各级中断使能,涉及:
EA —— 总中断使能;(第一级使能)
打开中断总开关和使能P0_1 口中断EA = 1;这个是总开关,18 个中断源对应着有18 个独自的中断开关,只有将总开关打开,然后再打开相应的小开关,这样你想要允许的总开关才能奏效。
IEN1 —— P0 中断使能;(第二次级能)
PICTL.3 —— P0.1 口中断使能;(第三级使能)
设置P0_1 口中断使能P0IEN |= 0x02;CC2530 单片机共有18 个中断源,每一个中断都有一个相应的中断使能特殊功能寄存器,对应位设置为1,使能中断位,当设置为0 屏蔽相应的中断位;这里我们使用的是P0_1,所以我们通过P0IEN |= 0x02 将p0_1 置一。
PICTL.0 —— 设置P0.1 口输入下降沿引起中断触发。



然后在主函数中使用 while(1) 等待中断即可。代码如下:
#include #define led1 P1_0 #define led2 P1_1 #define uchar unsigned char #define uint unsigned int /***************************************** //io 及LED 初始化 P01 *****************************************/ void Init_IO_AND_LED(void) { P1DIR = 0x03; //0 为输入(默认),1 为输入 led1 = 1; led2 = 1; P0IEN |= 0x02; //P01 口中断使能 PICTL |= 0x01; //P01 下降沿 EA = 1; IEN1 |= 0X20; //P0 口中断使能 P0IFG &= 0x00; //P0 口中断状态,如果有中断发生,相应位置1 } /***************************************** //主函数 *****************************************/ void main(void) { Init_IO_AND_LED(); while(1); } #pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void) { if(P0IFG == 0x02) //按键中断 { P0IFG = 0; led1 = !led1; } P0IFG = 0; //清中断标志 }
中断服务程序的编写有其固定格式,这在前面讲定时器Timer中断方式的使用时也已经使用过了。在中断服务程序中首先进行了判断,到底是哪个中断标志被置位了。然后先清除中断标志,然后对LED灯进行反转。中断服务程序(格式)如下:
#pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void) { if(P0IFG == 0x02) //按键中断 { P0IFG = 0; led1 = !led1; } P0IFG = 0; //清中断标志 }
CC2530 中断格式
格式如下:
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
a)P0INT_VECTOR——设定 的中断向量名
史海拾趣
|
这两个都是DSP/BIOS中的,先大概介绍一下 tsk: task,任务.在Scheduling中,其优先级高于IDL(背景程序),低于SWI(软中断)和HWI(硬中断).可以被软硬中断打断,也可以被其它事件阻塞(blocked),顺便说一下,SWI和HWI是不能阻塞的.(阻塞和中 ...… 查看全部问答> |
|
各位大虾,本人使用的s3c2410的芯片,在裸机下编程时出现了一个问题,我写了一段程序用于触发CPU的异常中断,但是CPU中断时没有进入中断服务函数中,不知道各位大虾有没有碰到过这种情况,如何才能够让CPU异常中断进入我的中断服务函数中?… 查看全部问答> |
|
我要用MFC编写PC端蓝牙软件,有搜索、连接、加密和传输文件的功能,希望大虾们能给我点MFC关于蓝牙编程的资料,如果有源代码参考的话就更好了。我能给的分不多,还请大虾们能无私的帮小弟个忙。感激,感激! … 查看全部问答> |
|
以下出错信息: Error[e72]: Segment FIQ_STACK must be defined in a segment definition option (-Z, -b or -P) 我是这样定义的 MODULE ?CSTARTUP RSEG&nbs ...… 查看全部问答> |
|
scancodetovirtualkey,我看了源码是调用*puiVk = MapVirtualKey(*puiSc, MAP_SC_TO_VK); 但这个函数我没找到。有谁知道的,帮忙解答下```… 查看全部问答> |




