(五)DSP28335基础教程 您所在的位置:网站首页 dsc按键是什么意思 (五)DSP28335基础教程

(五)DSP28335基础教程

2023-09-19 04:26| 来源: 网络整理| 查看: 265

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=1 void 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; #endif interrupt 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_RUN MemCopy(&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的电平状态反转。 在这里插入图片描述 大家可以参考代码尝试一下, 有疑问的欢迎留言!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有