目录

前言

一、实验相关电路图

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

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 端口分别使用 P0IFP1IFP2IF 作为中断标志位,任何一个端口组上的引脚产生外部中断时,都会将对应端口组的中断标志自动置位。注意,外部中断标志必须在中断服务函数中手工清除,否则 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亮灭相关推荐

  1. [stm32] Start Tour-利用外部中断控制LED亮灭

    如果觉得不错就点个赞吧~ 目录 一  元件相关 二 面包板上的连线 三 具体代码 传感器驱动代码(跟独立按键那个差不多) 中断函数代码(外部中断) main.c 四  最终效果 效果图: 一  元件相 ...

  2. CC2530基础实验:(1)按键控制LED跑马灯

    文章目录 前言 一.实验相关电路图 二.实验相关寄存器 三.源码分析 前言 本实验用于学习CC2530芯片GPIO 的配置方法,Led 驱动电路及开关 Led 的原理,按键的使用,实现简单的人机交互. ...

  3. STM32按键中断控制led亮灭

    仿真 本实验通过开发板上载有的3个按钮(KEY_UP.KEY0.KEY1),来控制板上的2个LED(DS0和DS1), 其中KEY0控制DS0,按一次亮,再按一次,就灭.KEY1控制DS1,效果同KE ...

  4. 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭

    实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...

  5. 基于STC15W4K32S4单片机仿真《外部中断INT0控制LED亮灭》

    1. 编 程 软 件:keil5版本. 2.仿 真 软 件:Proteus8.12 3.单片机选型:STC15W4K32S4 4.学 习 目 标:   1.学习外部中断INT0 5.程 序 文 件 : ...

  6. STM32cubeIDE学习汇总(二)----外部中断控制LED和流水灯

    基于上篇我们已经基本了解了软件界面和如何创建一个项目了 接着我们看如何利用外部按键来控制LED灯的亮灭,即外部中断. (本文讲述的是外部中断控制led取反以及如何实现流水灯) (如果想了解外部中断如何 ...

  7. 十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)

    目录 一.固件库模板 二.准备资料 三.简介 1. 引脚 2. 无线组网 2.1 ESP8266 在 SoftAP 模式 2.2 ESP8266 在 station 模式 2.3 ESP8266 在 ...

  8. 九、stm32-蓝牙HC_05(接发通信、控制LED亮灭)

    目录 一.固件库模板 二.准备资料 三.简介 1. 引脚 2. AT: 设置工作模式 3. 基本配置(所有AT指令都必须换行) 4. AT命令的详细说明 四.实验 1.硬件设计 2.软件设计 2.1 ...

  9. 树莓派4B-Python-基于rpi_ws281x库控制LED亮灭

    树莓派4B-Python-基于rpi_ws281x库控制LED亮灭 树莓派4B-Python-基于rpi_ws281x库控制LED亮灭 树莓派4B-Python-基于rpi_ws281x库控制LED亮 ...

最新文章

  1. ATS统计量proxy.node.client_throughput_out的单位调研
  2. 张钹院士:探索第三代人工智能,需要勇闯无人区的人才
  3. Oracle Proc开发之Makefile的编写模板
  4. 数据结构与算法 / B- Tree 和 B+ Tree
  5. P4989-二进制之谜【堆,贪心】
  6. 会计用计算机很快是,40个超实用电脑快捷键,老会计都在用!
  7. SQL SERVER游标浅析
  8. 安装python时无法安装python包_无法安装Python包
  9. 如何将本地文件夹映射为硬盘盘符?
  10. Spring整合MyBatis之MapperFactoryBean
  11. dw怎么做竖线_在做网站优化的过程中,网站标题应该怎么填写?
  12. nodejs读取服务器json文件,如何使用Node.js读取JSON文件
  13. 又一爆款电视剧《沉默的真相》,真的很好看吗?网友的弹幕真相啦
  14. 基于java的自驾游自助游旅游网站
  15. 连连跨境支付独立站收款,最高90天提现0费率!
  16. 在WordPress评论里添加电话、手机号、微信号的表单功能教程
  17. gitlab ip变更runner拉取代码失败、shell启动springboot项目启动起来。
  18. 代码覆盖度-代码覆盖度概念以及度量方法
  19. 使用@media screen解决分web不同分辨率问题
  20. 2016-2017-1 《信息安全系统设计基础》课程总结

热门文章

  1. web移动端安卓和ios兼容问题
  2. 使用COLMAP进行三维重构
  3. Openvpn搭建并使用用户名密码登录
  4. 华夏银行笔试c语言,华夏银行笔试经验分享
  5. codeforces 1567 B. MEXor Mixup
  6. PMP 第六章 项目时间管理
  7. Android点九图(.9.png)的特点和制
  8. 化妆品公司mysql_化妆品网站销售管理系统的设计与实现(SSH,MySQL)(含录像)
  9. 如何用小学生计算机来玩游戏,小学生一年级第一次玩电脑作文
  10. NOIP模拟题 通讯 强连通分量缩点 最小树形图--朱刘算法