DSP28335 外部中断实验

原链接:DSP F28335中断系统-CSDN博客

视频链接 :15.1--外部中断实验--工作原理_哔哩哔哩_bilibili

中断简介

中断其实就是当 CPU 执行程序时,由于发生了某种随机的事件(外部或内部),引起 CPU 暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程就称为中断,引发中断的称为中断源。

1.1 F28335中断概述

      F28335内部有16个中断线,其中包括2个不可屏蔽中断(RESET和NMI)与14个可屏蔽中断。

可屏蔽中断,就是可通过对应的中断使能寄存器进行是否使能;或禁止

PIE 将外设中断分成了 12 个组,分别对应着 CPU 的 12 个 可屏蔽中断线,每 1 组由 8 个外设级中断组成

 

1.2 F28335中断机制

       F28335的中断采用的是3级中断机制,分别是外设级中断、PIE级中断和CPU级中断,最内核部分为CPU级中断,即CPU只能响应从CPU中断线上过来的中断请求,但F28335中断源很多,CPU没有那么多中断线,在有限中断线的情况下,只能安排中断线进行复用,其复用管理就有了中间层的PIE级中断,外设要能够成功产生中断响应,就要首先经外设级中断允许,然后经PIE允许,最终CPU做出响应。

中断响应顺序为:外设中断接收中断响应信号,传送到PIE中断控制器,最后传递给CPU中断响应,做出响应的中断处理。

 每个中断组中包含8个子中断,因此96=12*8

不同类别的中断信号,需要找出相对应的中断组及该中断组所对应的子中断信号线,启动该中断时,需要设置对应的信号寄存器。

1.3 F28335中断向量

       CPU响应中断,就是CPU要去执行相应的中断服务程序,其响应过程是CPU将现执行程序的指令地址压入堆栈,跳转到中断服务程序入口地址,中断服务程序的入口地址就是中断向量,这个中断向量用2个16位寄存器存放。入口地址是22位的,地址的低16位保存在该向量的低16位;地址的高16位则保存在它的高6位,更高的10位保留。

中断操作

 PIE模块8个中断分成一组与外部中断一起共用一个CPU中断,总共有12组中断(INT1-INT12)。每组中断有相应的中断标志(PIEIFR)和使能寄存器(PIEIER),这些寄存器控制PIE向CPU申请中断。同时CPU还根据PIEIFR和PIEIER寄存器确定执行哪个中断服务程序。在清除PIEIFR和PIEIER的位时,要遵循以下3个规则。
①不要用软件编程清除PIEIFR的位
②软件设置中断优先级
③使用PIEIER禁止中断


外部中断

1 外部中断简介

      F28335共支持7个外部中断XINT1-XINT7,其中XINT1-XINT2只能对GPIO0-GPIO31配置;XINT3-XINT7只对GPIO32-GPIO63配置。XINT13还有一个不可屏蔽的外部中断XNMI共用中断源。每一个外部中断可以被选择为正边沿或负边沿触发(上升沿或下降沿触发),也可以被使能或者禁止(包括XNMI)。可屏蔽中断单元包括一个16位增计数器(一般不用),该计数器在检测到有效中断边沿时复位为0,同时用来准确记录中断发生的时间。

(GPIO0-GPIO31对应XINT1和XINT2, GPIO32-GPIO63对应XINT3--XINT7)

 2.外部中断配置步骤

外部中断相关函数及寄存器在DSP2833x_PieCtrl.c、DSP2833x_PieVect.c、DSP2833x_GlobalVariableDefs.c文件及其对应的头文件内查找到
(1)失能CPU级中断,并初始化PIE控制器寄存器和PIE中断向量表

InitPieCtrl();
IER = 0x0000;    //关闭CPU所有中断  中断使能寄存器 enable
IFR = 0x0000;    //                 中断状态寄存器 flag
InitPieVectTable();

(2)使能IO口时钟,配置IO口为输入
(3)设置 IO 口与中断线的映射关系

比如我们K1它是连接在GPIO12上,要使用外部中断功能可以是外部中断1或者外部中断2,假如使用外部中断1,代码如下:

EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;   // XINT1是GPIO12
EDIS;

(4)指定中断向量表中断服务函数地址
     比如外部中断1,其设置如下:

EALLOW;    // 修改被保护的寄存器,修改前应添加EALLOW语句
PieVectTable.XINT1 = &EXTI1_IRQn;
EDIS;   // EDIS的意思是不允许修改被保护的寄存器

(5)使能外设对应的PIE中断
比如外部中断1,它是由PIE组1的第4通道连接 

PieCtrlRegs.PIEIER1.bit.INTx4 = 1;    // 使能PIE组1的INT4
EDIS;

 (6)设置外部中断触发方式并使能中断
外部中断的触发方式及中断使能是由XIntruptRegs寄存器控制,具体实现代码如下:

XIntruptRegs.XINT1CR.bit.POLARITY = 0;      // 下降沿触发中断
XIntruptRegs.XINT1CR.bit.ENABLE= 1;        // 使能XINT1

 (7)使能CPU级中断及全局中断

IER |= M_INT1;  // 使能CPU中断1(INT1)
EINT;           // 开全局中断
ERTM;            // 中断调试时使用

  (8)编写外部中断服务函数
例如外部中断1的中断服务函数:

interrupt void EXTI1_IRQn(void)
{
...功能程序
}

3 案例

本章所要实现的功能是:使用外部中断1功能通过按键K1控制D2亮灭,K4按键控制D3亮灭,D1指示灯闪烁提示系统运行状态。

main.c


#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#include "leds.h"
#include "exti.h"

/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
	int i=0;

	InitSysCtrl();

	//(1)使能CPU级中断,并初始化PIE控制器寄存器和PIE中断向量表
	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();

	LED_Init();
	EXTI1_Init();
	EXTI2_Init();

	while(1)
	{
		i++;
		if(i%2000==0)
		{
			LED1_TOGGLE;
		}
		DELAY_US(100);
	}
}

 exti.h


#ifndef EXTI_H_
#define EXTI_H_


#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件


void EXTI1_Init(void);
interrupt void EXTI1_IRQn(void);

void EXTI2_Init(void);
interrupt void EXTI2_IRQn(void);

#endif /* EXTI_H_ */

exti.c 

/*
 * exti.c
 *
 *  Created on: 2018-1-25
 *      Author: Administrator
 */

#include "exti.h"
#include "leds.h"
#include "key.h"


void EXTI1_Init(void)
{
	//(1)使能IO口时钟,
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock
	EDIS;

	EALLOW;
	//KEY端口配置
	//(2)配置IO口为输入
	GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;/* GPIO12属于A组前半部分GPIO,故为GPCMUX1,配置普通IO */
	GpioCtrlRegs.GPADIR.bit.GPIO12=0;/* 0:表示方向为输入 ,传递给F28335*/
	GpioCtrlRegs.GPAPUD.bit.GPIO12=0;
	GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0;        // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步

	GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO48=1;/* 1:表示方向为输出*/
	GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
	GpioDataRegs.GPBCLEAR.bit.GPIO48=1;/* 接地 ,输出*/
	EDIS;

	//(3)设置 IO 口与中断线的映射关系
	EALLOW;
	GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;   // XINT1是GPIO12
	EDIS;

	//(4)指定中断向量表中断服务函数地址
	EALLOW;	// 修改被保护的寄存器,修改前应添加EALLOW语句
	PieVectTable.XINT1 = &EXTI1_IRQn;
	EDIS;   // EDIS的意思是不允许修改被保护的寄存器

	//(5)使能外设对应的PIE中断
	PieCtrlRegs.PIEIER1.bit.INTx4 = 1;          // 使能PIE组1的INT4

	/*
	 (6)设置外部中断触发方式并使能中断
	*/
	XIntruptRegs.XINT1CR.bit.POLARITY = 0;      // 下降沿触发中断
	XIntruptRegs.XINT1CR.bit.ENABLE= 1;        // 使能XINT1

	IER |= M_INT1;                              // 使能CPU中断1(INT1)
	EINT;                                       // 开全局中断
	ERTM;
}

interrupt void EXTI1_IRQn(void)
{
	Uint32 i;
	for(i=0;i<10000;i++);    //键盘消抖动
	while(!KEY_H1);
	LED2_TOGGLE;
	PieCtrlRegs.PIEACK.bit.ACK1=1;
}


void EXTI2_Init(void)
{
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock
	EDIS;

	EALLOW;
	//KEY端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
	GpioCtrlRegs.GPADIR.bit.GPIO13=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO13=0;
	GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 2;        // 外部中断2(XINT2)输入限定6个采样窗口
	GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;   // 每个采样窗口的周期为510*SYSCLKOUT

	GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
	GpioDataRegs.GPBCLEAR.bit.GPIO48=1;
	EDIS;

	EALLOW;
	GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 13;   // XINT2是GPIO13
	EDIS;

	EALLOW;	// 修改被保护的寄存器,修改前应添加EALLOW语句
	PieVectTable.XINT2 = &EXTI2_IRQn;
	EDIS;   // EDIS的意思是不允许修改被保护的寄存器

	PieCtrlRegs.PIEIER1.bit.INTx5 = 1;          // 使能PIE组1的INT5

	XIntruptRegs.XINT2CR.bit.POLARITY = 0;      // 下降沿触发中断
	XIntruptRegs.XINT2CR.bit.ENABLE = 1;        // 使能XINT2

	IER |= M_INT1;                              // 使能CPU中断1(INT1)
	EINT;                                       // 开全局中断
	ERTM;
}

interrupt void EXTI2_IRQn(void)
{
	Uint32 i;
	for(i=0;i<10000;i++);    //键盘消抖动
	while(!KEY_H2);
	LED3_TOGGLE;
	PieCtrlRegs.PIEACK.bit.ACK1=1;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值