教学内容与重难点
【内容01】中断相关的基础概念与执行过程。
【内容02】CC2530中断系统的结构与工作机理。
【内容03】CC2530中断服务函数的编写格式。
【内容04】外部中断的工作机理及相关寄存器定义。
【内容05】外部中断的初始化和中断服务函数设计。
【内容06】专创融合专题。
【重点】CC2530中断系统的结构与工作机理。
【重点】CC2530中断服务函数的编写格式。
【重点】外部中断的工作机理及相关寄存器定义。
【难点】外部中断的工作机理、初始化函数设计、中断服务函数设计。
教学单元核心内容与学习资源
中断相关的基础概念
【1】内核与外设之间的主要交互方式有两种:轮询和中断。轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断系统使得内核具备了应对突发事件的能力。
【2】在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行。 这种程序在执行过程中由于外界的原因而被中间打断的情况,称为中断。
【3】每个中断源都对应一个固定的入口地址。当内核响应中断请求时,就会暂停当前的程序执行,然后跳转到该入口地址执行相关的代码,即中断服务函数。
【4】中断相关的重要概念:中断源、中断向量/中断入口地址、中断服务函数、中断使能控制位、中断标志位。
CC2530的中断系统的结构与工作机理
CC2530具有18个中断源,每个中断源都由各自的一系列特殊功能寄存器来进行控制。可以编程设置相关特殊功能寄存器,设置18个中断源的优先级以及使能中断申请响应等。
三个中断使能控制寄存器:IEN0、IEN1、IEN2。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【22】【23】【24】。
CC2530中断服务函数的格式
#pragma vector = <中断向量>
__interrupt void 函数名称()
{
中断服务函数的具体逻辑实现。
}
【1】在每一个中断服务函数之前,都要加上一句起始语句:#pragma vetcor = <中断向量>
<中断向量>表示接下来要写的中断服务函数是为那个中断源服务的,该语句有两种写法:
#pragma vector = 0x7B 或 #pragma vector = P1INT_VECTOR
前者是中断向量的入口地址,后者是头文件“ioCC2530.h”中的宏定义。
【2】_ _interrupt关键字表示该函数是一个中断服务函数,<函数名称>可以自定义,函数体不能带有参数,也不能有返回值。
外部中断理论知识
【1】CC2530的P0、P1和P2端口中的每个引脚都具有外部中断输入功能,要使某些引脚具有外部中断功能,需要对IENx寄存器、PxIEN寄存器和PICTL寄存器进行适当的设置。
【2】P0、P1和P2端口分别使用P0IF、P1IF和P2IF作为中断标志位,任何一个端口组上的引脚产生外部中断时,都会将对应端口组的中断标志自动置位。注意,外部中断标志必须在中断服务函数中手工清除,否则CPU会反复进入中断。
【3】端口状态标志寄存器P0IFG、P1IGF和P2IFG,分别对应3个端口中各引脚的中断触发状态,当某引脚发生外部中断触发时,对应的标志位会自动置位,该标志同样需要手工清除。
【特别注意】:在中断服务函数中,先清除完PxIFG,再清除PxIF。
外部中断工作原理。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【17】。
外部中断使能寄存器INE1和IEN2。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【15】【16】。
端口输入寄存器PxIEN。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【18】【19】【20】。
端口输入信号控制寄存器PICTL。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【21】。
端口中断状态标志寄存器PxIFG。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【22】【23】【24】。
外部中断初始化函数与中断服务函数设计举例
【例】:设计外部中断初始化函数,将P1_2设置成外部中断输入,下降沿触发。
void Init_Exit()
{
P1IFG = 0x00; //清除P1端口中断状态标志
PICTL |= 0x02; //设置P1_2输入信号下降沿触发
P1IEN |= 0x04; //设置P1_2 引脚为外部中断输入
IEN2 |= 0x10; //使能P1端口外部中断
EA = 1; //打开总中断
}
【例】:设计外部中断服务函数,当P1_2有下降沿触发时,将D4灯的开关状态翻转。
#pragma vector = P1INT_VECTOR
__interrupt void IRQ_EXIT1()
{
if((P1IFG & 0x04) == 0x04) //判断是否为P1_2引脚产生外部中断请求
{
D4 = ~D4; //翻转D4灯的开关状态
}
P1IFG = 0x00; //清除P1端口中断状态标志
P1IF = 0; //情除P1端口中断标志
}
本课习题
【1】CC2530芯片有____个中断源。
【2】使能总中断的C语言代码是______________。
【3】设置外部中断触发信号类型的寄存器是__________。
【4】P1_2和P1_5引脚产生设定的外部中断触发信号,P1IFG寄存器的值为________。
【5】P1IEN寄存器的值为0x23,当P0_2和P0_5引脚产生设定的外部中断触发信号,P1IFG寄存器的值为______,P1IF标志位的值为____。
【6】P1IEN寄存器的值为0x23,当P1_3和P1_4引脚产生设定的外部中断触发信号,P1IFG寄存器的值为______,P1IF标志位的值为____。