×
单片机 > 其他资讯 > 详情

cc2530裸机编程系列笔记5--中断

发布时间:2020-07-10 发布时间:
|

      中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使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——设定 的中断向量名

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
硅整流二极管的检测方法