我是靠谱客的博主 火星上发卡,最近开发中收集的这篇文章主要介绍CC2530基础实验:(2)外部中断控制LED亮灭前言一、实验相关电路图二、实验相关理论与寄存器 三、源码分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

前言

一、实验相关电路图

二、实验相关理论与寄存器

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 会反复进入中断。 端口状态标志寄存器 P0IFGP1IGFP2IFG,分别对应 3 个端口中各引脚的中断触发状态,当某引脚发生外部中断触发时,对应的标志位会自动置位,这个标志同样需要手动清除。

CC2530外部中断寄存器说明如下表所示:

寄存器作用描述

P0IEN(0xAB)

端口 0 中断屏蔽

端口P0.7到P0.0中断使能
0:中断禁用
1:中断使能。

PICTL(0x8C)

端口中断控制
P0ICON(Bit0)

端口0、1、2输入模式下的中断配置,更详细参考手册。
0: 输入的上升沿引起中断
1: 输入的下降沿引起中断

P0IFG(0x89)

端口 0

中断状态标志

端口 0,位 7 到位 0 输入中断状态标志。

当输入端口中断请求未决信号时,其相应的标志位将置 1。

IEN1 (0xB8)

中断使能 1
P0IE(Bit5)

端口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亮灭前言一、实验相关电路图二、实验相关理论与寄存器 三、源码分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部