0 前言

本期实验目标:采用外部中断方式响应按键触发,实现LED电平反转。

外部中断是DSP十分常用的功能,通常用来响应一些控制操作,比如判断按键是否按下,传感器是否接收到信号等等。那么通过该例程,大家则可以快速学会使用外部中断的功能!本节仍然将分为硬件部分、软件部分和实验展示三个方面进行介绍。

1 硬件部分

DSP28335支持XINT1-XINT7和XNMI共8路外部中断源,其中中断源XINT1/2和XNMI可以设定为从GPIO端口A的任意一个管脚输入,即GPIO0-GPIO31。而XINT3/4/5/6/7可以设定为从GPIO端口B的任意一个管脚输入,即GPIO32-GPIO63,在这里我们设置设置GPIO13作为XINT1源的输入。每个中断源的触发方式都分别支持:上升沿触发,下降沿触发,上升沿和下降沿同时触发。在这里我们设置下降沿触发方式。

图1给出了硬件连接图,由于核心板的4个按键都没有连接在外部中断源上,因此我们可以用杜邦线将GPIO67和GPIO13连起来,这样在按下按键的时候,GPIO67接收到的低电平就可以传到GPIO13,从而触发中断。

图1 硬件连接图

2 软件部分

注意:查看代码时双击点进去看,否则会内容不全
bsp_led.c(GPIO配置和中断配置)

/***  *********************************************************************************************  @file                 bsp.led.c*  @file                 SK Electronics*  @version           V1.0*  @date               2020-xx-xx*  @brief               LED应用函数接口*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/
#include "bsp_led.h"
void LED_GPIO_Config(void)
{EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成输出GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能内部上拉GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成输出GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;//普通IO模式GpioCtrlRegs.GPCPUD.bit.GPIO67=0;//使能内部上拉GpioCtrlRegs.GPCDIR.bit.GPIO67=1;//配置成输出GpioDataRegs.GPCCLEAR.bit.GPIO67=1;//默认输出低电平GpioDataRegs. GPASET.bit.GPIO0=1;GpioDataRegs. GPASET.bit.GPIO1=1;GpioDataRegs. GPASET.bit.GPIO2=1;GpioDataRegs. GPASET.bit.GPIO3=1;GpioDataRegs. GPASET.bit.GPIO4=1;EDIS;
}void InitExInt(void)  //外部中断的配置
{EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;      //普通IO模式GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;       //设置为输入// GpioCtrlRegs.GPAQSEL1.bit.GPIO13= 2;      //采用6次采样的采样窗// GpioCtrlRegs.GPACTRL.bit.QUALPRD1=255;     //采样周期=510*系统时钟周期       采样窗时间=采样周期*(6-1) 17us 为了消除输入引脚噪声所用GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;//选择GPIO13为外部输入XINT输入引脚XIntruptRegs.XINT1CR.bit.POLARITY= 0;     //下降沿触发中断XIntruptRegs.XINT1CR.bit.ENABLE = 1;      //使能XINT中断EDIS;
}

bsp_led.h

/***  *********************************************************************************************  @file                 main.c*  @file                 SK Electronics*  @version           V1.0*  @date               2020-xx-xx*  @brief               LED应用函数接口头文件*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/#ifndef _BSP_LED_H_
#define _BSP_LED_H_
#include "DSP28x_Project.h"/* 宏带参,可以像内联函数一样使用,低电平亮灯*/
#define LED0(a) if (a)  \GpioDataRegs. GPACLEAR.bit.GPIO0=1;\else        \GpioDataRegs. GPASET.bit.GPIO0=1#define LED1(a) if (a)  \GpioDataRegs. GPACLEAR.bit.GPIO1=1;\else        \GpioDataRegs. GPASET.bit.GPIO1=1#define LED2(a) if (a)  \GpioDataRegs. GPACLEAR.bit.GPIO2=1;\else        \GpioDataRegs. GPASET.bit.GPIO2=1#define LED3(a) if (a)  \GpioDataRegs. GPACLEAR.bit.GPIO3=1;\else        \GpioDataRegs. GPASET.bit.GPIO3=1#define LED4(a) if (a)  \GpioDataRegs. GPACLEAR.bit.GPIO4=1;\else        \GpioDataRegs. GPASET.bit.GPIO4=1/*定义IO口的宏*/
#define LED0_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO0=1
#define LED0_OFF        GpioDataRegs. GPASET.bit.GPIO0=1
#define LED0_ON         GpioDataRegs. GPACLEAR.bit.GPIO0=1#define LED1_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO1=1
#define LED1_OFF        GpioDataRegs. GPASET.bit.GPIO1=1
#define LED1_ON         GpioDataRegs. GPACLEAR.bit.GPIO1=1#define LED2_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO2=1
#define LED2_OFF        GpioDataRegs. GPASET.bit.GPIO2=1
#define LED2_ON         GpioDataRegs. GPACLEAR.bit.GPIO2=1#define LED3_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO3=1
#define LED3_OFF        GpioDataRegs. GPASET.bit.GPIO3=1
#define LED3_ON         GpioDataRegs. GPACLEAR.bit.GPIO3=1#define LED4_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO4=1
#define LED4_OFF        GpioDataRegs. GPASET.bit.GPIO4=1
#define LED4_ON         GpioDataRegs. GPACLEAR.bit.GPIO4=1void LED_GPIO_Config(void);
void InitExInt(void);
#endif /*_BSP_LED_H_ */

main.c

/***  *********************************************************************************************  @file                 main.c*  @file                 SK Electronics*  @version           V1.0*  @date               2021-xx-xx*  @brief               外部中断测试*  ********************************************************************************************  @attention*  实验平台:SK-F28335Mini   核心板*  CSDN博客:https://blog.csdn.net/weixin_46556696*  淘宝:https://shop409670932.taobao.com*/
#include "DSP28x_Project.h"
#include "bsp_led.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endifinterrupt void ISRExint1(void);  //声明外部中断1/**********************************************************************************************/
void delay_1ms(Uint16 t);
/***  @brief                           主函数*  @parameter                  无*  @return_value               无*/
void main(void)
{/*第一步:初始化系统控制:*/InitSysCtrl();
/*第二步:初始化GPIO口*/InitGpio();
/* 第三步:清除所有中断 和初始化 PIE 向量表:*/DINT;// 关闭全局中断InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:IFR = 0x0000;InitPieVectTable();// 初始化 PIE 中断向量表// 中断重映射,注册中断程序入口(用户按需求添加)EALLOW;PieVectTable.XINT1 = &ISRExint1;     // 将外部中断添加都中断向量表里EDIS;///*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUNMemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);InitFlash();
#endif
/* 第四步: 初始化片上外设*/// InitPeripherals();  //初始化所有外设(本例程不需要)IER |= M_INT1;                       //使能第1组中断PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   //使能总中断PieCtrlRegs.PIEIER1.bit.INTx4= 1;    //使能第1组中断里的第4个中断--外部中断1/* 第五步:添加用户功能具体代码*/EINT;ERTM;LED_GPIO_Config();InitExInt();LED0(1);LED1(1);LED2(1);LED3(1);LED4(1);for(;;){}
}void delay_1ms(Uint16 t)
{while(t--){DELAY_US(1000);}
}/**********************************************************************************************/interrupt void ISRExint1(void)
{PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断DELAY_US(1000);  //延时if(GpioDataRegs.GPADAT.bit.GPIO13 == 0)//检测到电平变化触发中断{LED0_TOGGLE;  //取反LED1_TOGGLE;  //取反LED2_TOGGLE;  //取反LED3_TOGGLE;  //取反LED4_TOGGLE;DELAY_US(5000);//延时}
}

3 实验展示

程序烧录进去后,通过按键对应的按键,可以观察到LED的电平状态反转。

大家可以参考代码尝试一下, 有疑问的欢迎留言!!

(五)DSP28335基础教程——外部中断控制(按键触发)相关推荐

  1. 【10天基于STM32F401RET6智能锁项目实战第4天】外部中断的按键实现语音控制

    外部中断的按键实现语音控制 一.实现语音功能 1.语音模块的资料 2.代码实现 二.外部中断的按键实现语音控制 一.实现语音功能 1.语音模块的资料 首先我们要做的就是了解语音模块是怎么使用的,那么就 ...

  2. OK6410开发板学习之外部中断(按键点亮led和蜂鸣器)

    中断在嵌入式里面是很常见的一个功能了.通过这个功能,可以让CPU减轻很多负担,不用不断的查询设备的状态.提高了CPU的效率. 中断的大体过程如下: 中断源检测中断信号产生,然后将中断信号发送给中断控制 ...

  3. GSAP JS基础教程--动画的控制及事件

    好多天没有写无博文啦,今天无聊就再写一下! 今天要讲的是TweenLite的一些事件以及,TweenLite动画的控制,TweenMax类似,请自行参考官方文档:http://api.greensoc ...

  4. 51单片机:利用外部中断实现按键按一下数码管数字加1直到加到99,另一个按键实现清零

    51单片机:利用外部中断实现按键按一下数码管数字加1直到加到99,另一个按键实现清零 题目要求: 利用外部中断实现按键按一下数码管数字加1,实现00-99的循环,另一个按键实现清零,不管数码管数字是多 ...

  5. 物联网国赛LORA模块开发基础教程(通用库)—输入(按键)

    LORA模块开发基础教程目录 物联网国赛LORA模块开发基础教程-开发环境配置 物联网国赛LORA模块开发基础教程-输出(LED) 物联网国赛LORA模块开发基础教程-输入(按键) 物联网国赛LORA ...

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

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

  7. CC2530基础实验:(2)外部中断控制LED亮灭

    目录 前言 一.实验相关电路图 二.实验相关理论与寄存器 1.中断相关的基础概念 2.CC2530 的中断系统 3.CC2530 的中断处理函数编写方法 4.CC2530 的外部中断 三.源码分析 前 ...

  8. (二)DSP28335基础教程——GPIO输入(矩阵按键扫描)

    0 前言 GPIO输入功能是28335非常重要的部分,可通过外部数字逻辑信号的输入,作为逻辑触发控制的判断条件.比如在电机控制中,通过判断输入管脚的电平状态,实现电机调速.在显示屏人机界面下,也可通过 ...

  9. (四)DSP28335基础教程——SCI串口通信实验(上位机收发显示)

    0 前言 本期的实验目的为:使用核心板上的SCI串口通信功能,在电脑端上位机,输入数字0,1,2,3,4,分别控制五个LED亮灭. 1 DSP代码 (注意:查看代码时双击点进去看,否则会内容不全). ...

最新文章

  1. 【AAAI2022】多任务推荐中的跨任务知识提炼
  2. 2020亚太杯数学建模_2020 年 APMCM 亚太地区大学生数学建模竞赛
  3. JavaScript基础06-day08【if练习、条件分支语句switch、for循环】
  4. 云原生是企业数字创新的最短路径
  5. 349. Intersection of Two Arrays 两个数组的交集
  6. linux网络编程(四)线程池
  7. mysql5.6.24怎么打开_mysql 5.6.24 安装配置方法图文教程
  8. tomcat不重启java文件自动编译
  9. SCCM2012 R2系统部署时,客户端报0x80004005错误(2)
  10. 〖Linux〗Ubuntu设定Proxy及忽略Proxy
  11. vscode风格超酷个人主页源码
  12. 实时高清渲染:全局光照(Global Illumination)[2]---漫反射/高光全局光照
  13. 鸿蒙与混沌的区别,混沌的近义词(混沌鸿蒙同义词)
  14. 微分方程matlab绘图,用matlab解微分方程组并作图
  15. c语言程序规定必须用main作为,C语言学习必须清楚的事情,这就是C语言的开始...
  16. iphone手机视频通讯开发环境搭建
  17. c语言getch常见错误,getch()出错
  18. prf###.tmp临时文件导致磁盘资源不足
  19. linux shell 中数组的定义和for循环遍历
  20. Suzy想吃烤蛋挞了Day35 | 贪心算法进行时:860. 柠檬水找零,406. 根据身高重建队列,452. 用最少数量的箭引爆气球

热门文章

  1. git reset 怎么还原_git reset –hard误操作,如何恢复数据
  2. [转帖]SD卡FLASHUSB
  3. UI设计中配色设计攻略
  4. android应用开发-从设计到实现 2-1 设计原理
  5. NullPointerException(空指针异常)
  6. 为啥人类从1970年1月1日开始计时?
  7. 《缠中说禅108课》7:给赚了指数亏了钱的一些忠告
  8. 亚马逊站外引流:海外KOL营销
  9. 解决Android Gradle plugin requires Java 11 to run. You are currently using Java
  10. oracle和toad,oracle和toad