历史上的今天
返回首页

历史上的今天

今天是: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——设定 的中断向量名


推荐阅读

史海拾趣

Ark-Les Connectors公司的发展小趣事

随着公司规模的扩大和产品线的丰富,Ark-Les Connectors公司开始积极寻求市场拓展。公司制定了针对不同区域和行业的市场拓展策略,通过参加国际电子展会、建立销售网络、开展合作伙伴计划等方式,不断扩大品牌影响力。同时,公司还根据市场需求调整产品策略,推出定制化解决方案,满足不同客户的个性化需求。这些举措使得Ark-Les的市场占有率稳步提升,公司业绩也实现了稳步增长。

BELLING LEE公司的发展小趣事

在激烈的市场竞争中,BELLING LEE公司始终坚持品质至上的原则。公司从原材料采购、生产制造到售后服务都严格把关,确保每一款产品都能达到高品质标准。这种对品质的执着追求赢得了客户的信任和好评,也为公司赢得了良好的口碑和品牌形象。

风华(FH)公司的发展小趣事

为了进一步扩大市场覆盖和品牌影响力,福斯特半导体积极寻求战略合作。2023年2月,福斯特半导体与世强先进(深圳)科技股份有限公司签署授权代理协议,借助世强先进在技术分销和互联网推广方面的丰富经验,布局线上和线下功率器件渠道市场。这一合作不仅拓宽了福斯特半导体的产品应用领域,还提升了公司在新能源汽车、储能、照明等市场的知名度。通过世强硬创平台,福斯特半导体的功率MOS和二极管等产品得以快速覆盖目标市场,进一步降低了客户供应链成本。

上海晶丰明源(BPS)公司的发展小趣事

近年来,晶丰明源在电源管理芯片领域取得了多项技术突破。公司成功研发出多款高性能、低功耗的芯片产品,广泛应用于智能手机、平板电脑、智能家居等领域。同时,公司还积极拓展海外市场,与多家国际知名厂商建立了合作关系,产品出口至全球多个国家和地区。这些技术突破和市场拓展的成果,进一步巩固了晶丰明源在行业内的领先地位。

得倍(DBIC)公司的发展小趣事

倍(DBIC)公司自创立之初,就致力于在电子行业中进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有革命性的产品,如高效能芯片和智能传感器。这些产品不仅提高了生产效率,还满足了市场对智能化、高效能电子产品的需求。随着技术的不断进步,倍(DBIC)公司逐渐在行业中树立了技术领先的形象,吸引了众多合作伙伴和客户。

Elytone Electronics Co Ltd公司的发展小趣事

Elytone Electronics Co Ltd成立于XXXX年,最初是一家仅有几名员工的小型电子产品加工厂。公司创始人凭借对电子技术的热爱和对市场敏锐的洞察力,带领团队开始了艰苦的创业之路。在资源有限的情况下,他们不断研发新产品,优化生产工艺,逐步在行业内建立起了一定的知名度。

问答坊 | AI 解惑

arm知识

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 大家看看..  …

查看全部问答>

tsk和mbx的区别

这两个都是DSP/BIOS中的,先大概介绍一下 tsk:     task,任务.在Scheduling中,其优先级高于IDL(背景程序),低于SWI(软中断)和HWI(硬中断).可以被软硬中断打断,也可以被其它事件阻塞(blocked),顺便说一下,SWI和HWI是不能阻塞的.(阻塞和中 ...…

查看全部问答>

各类天线简介

文章内容是TI的一些简单介绍~~·…

查看全部问答>

关于总线的问题?

比如wishbone总线到AMBA总线的用Verilog写的转换协议; AMBA对NAND flash控制器的操作程序…

查看全部问答>

关于ARM CPU异常中断的问题?

各位大虾,本人使用的s3c2410的芯片,在裸机下编程时出现了一个问题,我写了一段程序用于触发CPU的异常中断,但是CPU中断时没有进入中断服务函数中,不知道各位大虾有没有碰到过这种情况,如何才能够让CPU异常中断进入我的中断服务函数中?…

查看全部问答>

请大虾们给我点MFC蓝牙编程方面的资料!

我要用MFC编写PC端蓝牙软件,有搜索、连接、加密和传输文件的功能,希望大虾们能给我点MFC关于蓝牙编程的资料,如果有源代码参考的话就更好了。我能给的分不多,还请大虾们能无私的帮小弟个忙。感激,感激! …

查看全部问答>

触摸屏校准程序!

现在是直接调用系统自带的校准程序,方法如下: 首先在头文件里加入函数指针定义: typedef  BOOL  (WINAPI *_TouchCalibrate)(); 然后使用如下代码,就会出现屏幕校准画面了。 HINSTANCE  hinstance = LoadLi ...…

查看全部问答>

IAR Embedded Workbench问题

以下出错信息: Error[e72]: Segment FIQ_STACK must be defined in a segment definition option (-Z, -b or -P) 我是这样定义的 MODULE        ?CSTARTUP         RSEG&nbs ...…

查看全部问答>

wince 读取xml 问题

我是用Visual Studio C#建的解决方案 我想读与exe文件同目录下的XML,怎么读取? 之前没接触过WINCE,请各位多指教…

查看全部问答>

键盘 scancodetovirtualkey

scancodetovirtualkey,我看了源码是调用*puiVk = MapVirtualKey(*puiSc, MAP_SC_TO_VK); 但这个函数我没找到。有谁知道的,帮忙解答下```…

查看全部问答>