概述
目录
前言
一、实验相关电路图
二、实验相关理论与寄存器
1.中断相关的基础概念
2.CC2530 的中断系统
3.CC2530 的中断处理函数编写方法
4.CC2530 的外部中断
三、源码分析
前言
本实验用于学习CC2530芯片:
- GPIO的配置方法及中断概念与方法
- Led驱动电路及开关Led的原理
- 通过按键S1产生外部中断改变LED1状态
一、实验相关电路图
由于发光二级管单向导电性,即只有在正向电压(二极管的正极接正,负极接负)下才能导通发光。P1.0引脚输出低电平D1亮,P1.0引脚输出亮电平D1熄灭。当按下按键会产生中断,P0IFG寄存器为中断状态标志。
实验结果:P1.0 输出低电平时 D1 被点亮。 S1 按下时 P0.1 产生外部中断从而控制 LED1 的亮灭。
二、实验相关理论与寄存器
1.中断相关的基础概念
内核与外设之间的主要交互方式有两种: 轮询和中断。 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断系统使得内核具备了应对突发事件的能力。
在执行 CPU 当前程序时,若系统中出现了某种急需处理的情况,CPU 会暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU 自动返回到原来暂停的程序中去继续执行。 这种程序在执行过程中由于外界的原因而被中间打断的情况,称为中断。
两个重要的概念:
<1> 中断服务函数: 内核响应中断后执行的相应处理程序。
<2> 中断向量:中断服务程序的入口地址。每个中断源都对应一个固定的入口地址。当内核响应中断请求时,就会暂停当前的程序执行,然后跳转到该入口地址执行代码。
2.CC2530 的中断系统
CC2530 有18个中断源,每个中断源都由各自的一系列特殊功能寄存器来进行控制。可以编程设置相关特殊功能寄存器,设置 18 个中断源的优先级以及使能中断申请响应等。常用的中断源有下面几个:
3.CC2530 的中断处理函数编写方法
中断服务函数与一般自定义函数不同,有特定的书写格式:
#pragma vector=<中断向量>
_ _interrupt void<函数名称>(void)
{/*在这里编写中断处理函数的具体程序*/}
在每一个中断服务函数之前,都要加上一句起始语句:
#pragma vector = <中断向量>
<中断向量>表示接下来要写的中断服务函数是为那个中断源服务的,该语句有两种写法:
#pragma vector = 0x7B 或者 #pragma vector = P1INT_VECTOR
前者是中断向量的入口地址,后者是头文件“ioCC2530.h”中的宏定义。
_ _interrupt 关键字表示该函数是一个中断服务函数,<函数名称>可自定义,函数体不能带有参数,
也不能有返回值
4.CC2530 的外部中断
CC2530 的 P0、P1 和 P2 端口中的每个引脚都具有外部中断输入功能,要使某些引脚具有外部中断功能,需要对 IENx 寄存器、 PxIEN 寄存器和 PICTL 寄存器进行适当的设置。 除了各个中断源都有自己的中断使能开关之外,中断系统还有一个总开关,可以用“EA = 1;”来打开总中断。
P0、P1 和 P2 端口分别使用 P0IF、 P1IF 和 P2IF 作为中断标志位,任何一个端口组上的引脚产生外部中断时,都会将对应端口组的中断标志自动置位。注意,外部中断标志必须在中断服务函数中手工清除,否则 CPU 会反复进入中断。 端口状态标志寄存器 P0IFG、 P1IGF 和 P2IFG,分别对应 3 个端口中各引脚的中断触发状态,当某引脚发生外部中断触发时,对应的标志位会自动置位,这个标志同样需要手动清除。
CC2530外部中断寄存器说明如下表所示:
寄存器 | 作用 | 描述 |
P0IEN(0xAB) | 端口 0 中断屏蔽 | 端口P0.7到P0.0中断使能 0:中断禁用 1:中断使能。 |
PICTL(0x8C) | 端口中断控制 P0ICON(Bit0) | 端口0、1、2输入模式下的中断配置,更详细参考手册。 |
P0IFG(0x89) | 端口 0 中断状态标志 | 端口 0,位 7 到位 0 输入中断状态标志。 当输入端口中断请求未决信号时,其相应的标志位将置 1。 |
IEN1 (0xB8) | 中断使能 1 | 端口0中断使能 0: 中断禁止 1: 中断使能 |
按照表格寄存器的内容,对 P1.0 口进行配置,当 P1.0 输出低电平时 D1 被点亮。 S1 按下时 P0.1 产生外部中断从而控制 LED1 的亮灭,配置如下:
P1DIR |= 0x01; // P1.0 定义为输出
按键S1配置如下:
P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能
PICTL |= 0x1; //端口 0 下降沿触发
IEN1 |= 0x20; //允许 P0 口中断;
P0IFG = 0x00; //初始化中断标志位
EA = 1; //打开总中断
P0口中断函数名称默认为:P0_ISR ,该函数名称可修改(在名称上右击后Go to definition of P0_ISR)。中断处理函数配置如下:
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
DelayMS(10); //延时去抖
LED1 = ~LED1; //改变 LED1 状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
}
P0IF 是 IRCON 的一位,用于表示 P0 口有中断,但具体是 P0.0~P0.7 则由 P0IFG 来判断
P0IFG是一个寄存器,每一位用来存储对应引脚的中断标志;P0IF是寄存器IRCON中的一个位,在将POIF清零之前,必须将P0IFG清零
三、源码分析
/****************************************************************************
* 文 件 名: main.c
* 描 述: 通过按键S1产生外部中断改变LED1状态
****************************************************************************/
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED1 P1_0 // P1.0口控制LED1
#define KEY1 P0_1 // P0.1口控制S1
//以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
//入口参数: msec 延时参数,值越大,延时越久 出口参数:无
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<535; j++);
}
//设置LED灯相应的IO口
void InitLed(void)
{
P1DIR |= 0x01; //P1.0定义为输出口
LED1 = 1; //LED1灯上电默认为熄灭
}
//设置KEY相应的IO口,采用中断方式
void InitKey()
{
P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能
PICTL |= 0x1; //下降沿触发
IEN1 |= 0x20; //允许P0口中断;
P0IFG = 0x00; //初始化中断标志位
EA = 1; //打开总中断
}
//#pragma vector = 中断向量,紧接着是中断处理程序
//P0_ISR(void) 中断处理函数
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
DelayMS(10); //延时去抖
LED1 = ~LED1; //改变LED1状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
}
//程序入口函数
void main(void)
{
InitLed(); //设置LED灯相应的IO口
InitKey(); //设置S1相应的IO口
while(1)
{
}
}
最后
以上就是火星上发卡为你收集整理的CC2530基础实验:(2)外部中断控制LED亮灭前言一、实验相关电路图二、实验相关理论与寄存器 三、源码分析的全部内容,希望文章能够帮你解决CC2530基础实验:(2)外部中断控制LED亮灭前言一、实验相关电路图二、实验相关理论与寄存器 三、源码分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复