DSP2812之中断系统
中断系统概述
X2812的中断系统从下至上分成了三级,即外设中断、PIE级中断、CPU级中断,三级中断类似于串联的关系,共同完成中断信号的发生、判断及次处理。现对中断系统的执行流程作简要概述:
首先,如果有外设产生中断事件,则寄存器中相应的中断标志位被置1,如果相应的中断使能位被置位,那么外设将向PIE控制器发出一个中断请求。
其次,当外设向PIE控制器发送中断请求时,相应的PIE中断标志位(PIEIFRx.y)置1,如果相应的PIE中断使能位(PIEIERx.y)也被置位,则PIE将检查相应的PIEACKx位,以确定CPU是否位该组中断准备好,如果PIEACKx位被清除,则PIE会向CPU发送管理请求,如果PIEACKx位为1,则PIE将一直等待直到该位被清除才向CPU发送中断请求。
最后,当中断请求被发送到CPU,相应的CPU级中断标志位置1。当中断标志锁存到标志寄存器后,会检查CPU中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)和全局中断屏蔽位(INTM)被使能后才被执行。
X2812的三级中断机制如下图所示:
1.外设级中断
外设中断操作流程
在程序执行过程中,某一外设产生了一个中断事件,那么这个外设的某寄存器中与该中断事件相关的中断标志位(IF)被置位为1。此时,如果该中断相应的中断使能位(IE)已经被置位,也就是该值为1,该外设就会向PIE控制器发出一个中断请求,如果中断使能位未被置位,外设不会向PIE控制器提出中断请求,但是相应的中断标志位会一直保持,除非用程序将其手动清除,或者中断被使能,外设也会立即向PIE发出中断请求。
以CPU定时器为例,手动请求清除定时器中断标志位代码如下:
CpuTimer0Regs.TCR.bit.TIF= 1; //清除定时器中断标志位
// TCR: Control register bit definitions:
struct TCR_BITS { // bits descriptionUint16 rsvd1:4; // 3:0 reservedUint16 TSS:1; // 4 Timer Start/StopUint16 TRB:1; // 5 Timer reloadUint16 rsvd2:4; // 9:6 reservedUint16 SOFT:1; // 10 Emulation modesUint16 FREE:1; // 11Uint16 rsvd3:2; // 12:13 reservedUint16 TIE:1; // 14 Output enable 定时器中断使能位Uint16 TIF:1; // 15 Interrupt flag 定时器中断标志位
};
如上述代码所示,当CPU定时器0的计数器寄存器TIMH:TIM计数到0时,就产生一个T0INT事件,即CPU定时器0的周期中断,此刻第15位定时器中断标志TIF被置位,这时,如果第14位TIE位1,CPU定时器0就会向PIE控制器发出中断请求。
2.PIE级中断
2.1 PIE中断概述
中断控制器PIE,专门处理外设中断的扩展模块(Peripheral Interrupt Expansion),它能够对各种中断请求源做出判断和相应决策。
PIE一共可以支持96个不同的中断,且将这些中断分成了12组,每组8个,12组依次反馈到CPU内核的INT1~INT12这12条中断线中的某一条上。平时能够用到的外设在PIE中的分布情况如下表所示:
从上表中看到,CPU定时器0的周期中断TINT0对应于INT1,在PIE第一组的第七位。PIE第一组的所有外设中断复用CPU中断INT1,依次类推,PIE第12组的所有外设中断复用CPU中断INT12。在PIE同组内,INTx.1的优先级高于比INTx.2高,不同组之间,排在前面组内的任何一个中断优先级要比排在后面组内的任何一个中断的优先级高。
2.2 PIE中断寄存器
PIE的每个组都有三个相关的寄存器,分别是PIE中断使能寄存器PIEIERx、PIE中断标志寄存器PIEIFRx和PIE中断应答寄存器PIEACKx(介绍省略)。
2.3 PIE中断向量表
PIE一共可以支持96个中断,每个中断都会有终端服务子程序ISR,DSP将各个中断服务子程序的地址存储在一片连续的RAM空间内,称之为PIE中断向量表。
2.4 PIE中断操作流程
当外设将中断请求提交给PIE,PIE中对应外设中断组的标志寄存器PIEIFRx将被置位,此时如果对应组的中断使能寄存器PIEIERx为使能状态,则PIE会根据中断的优先级优先处理高优先级中断,同时PIE寄存器还将根据中断应答寄存器PIEACK表示PIE是否准备好去响应这些组内中断。如CPU定时器0的周期中断被响应了,则PIEACK的第0位(对应于PIE1,即INT1)就会被置位,并且一直保持直到手动清除这个标志位,清除语句如下所示:
PieCtrlRegs.PIEACK.bit.ACK1 = 1; //可以响应组1内的其他中断
所以,每个外设中断被响应之后,一定要对PIEACK的相关位进行手动复位,以使得PIE控制器能够响应组内的其他中断。
3.CPU级中断
X2812一共支持32个CPU中断,其中每一个中断都是一个32位的中断向量,用于存储相应的中断服务子程序的入口地址。CPU中断里,INT1~INT14是14个通用中断,也是可屏蔽中断,可通过CPU中断使能寄存器IER和中断标志寄存器IFR来响应中断。
当一个外设中断请求通过PIE发送到CPU时,CPU中断标志寄存器IFR中相对应的中断标志位INTx就会被置位。这时,CPU不会立即执行中断,而是检查IER寄存器中相关位的使能情况和CPU寄存器ST1中全局中断屏蔽位INTM的是能情况。如果IER中的相关位被置位,并且INTM的值为0,则中断就会被CPU响应。
4.CPU定时器0的周期中断控制LED灯闪烁实例
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include Fileinterrupt void cpu_timer0_isr(void); //定义定时器周期中断响应子函数void main(void)
{InitSysCtrl(); //初始化系统控制寄存器,包括锁相环、看门狗级外部时钟DINT; //禁止CPU中断(INTM)InitPieCtrl(); //初始化PIE控制寄存器置默认状态IER = 0x0000; //禁止CPU中断使能寄存器IFR = 0x0000; //禁止CPU中断标志寄存器InitPieVectTable(); //初始化PIE中断向量表EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; //定时器的响应子程序赋值给TINT中断向量表EDIS; InitCpuTimers(); // 初始化CPU计时器ConfigCpuTimer(&CpuTimer0, 150, 1000000); //配置CPU计时器,每1响应一次定时器中断CpuTimer0Regs.TCR.all = 0x4001; // 定时器外设中断使能EALLOW;GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 0; //配置GPIO66为IO口GpioCtrlRegs.GPCDIR.bit.GPIO66 = 1; //配置GPIO66方向为输出EDIS;IER |= M_INT1; //CPU中断使能PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //PIE中断第一组的INTx7中断使能EINT; //使能全局中断中断ERTM; // 使能实时中断for(;;);
}
interrupt void cpu_timer0_isr(void)
{CpuTimer0.InterruptCount++;GpioDataRegs.GPCTOGGLE.bit.GPIO66 = 1; // 反转 GPIO66 的输出高低电平PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 执行定时器中断子程序后,PIEACK标记位主动清除
}
DSP2812之中断系统相关推荐
- 【DSP开发】C6000非多核非KeyStone系列DSP中断系统
C6000系列DSP的中断系统 上一篇介绍了C6455的GPIO系统,最后把GPIO4配置成了中断/事件模式,本文将介绍C6455的中断系统,介绍完基本概念后,给出把GPIO4映射到INT4的代码. ...
- Linux中断(interrupt)子系统之一:中断系统基本原理【转】
转自:http://blog.csdn.net/droidphone/article/details/7445825 这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于AR ...
- linux中断系统那些事之----中断处理过程【转】
转自:http://blog.csdn.net/xiaojsj111/article/details/14129661 以外部中断irq为例来说明,当外部硬件产生中断时,linux的处理过程.首先先说 ...
- PowerPC中断系统简介(一)
1. PowerPC中断系统简介 PowerPC处理器的中断系统由两部分组成,一是内核的中断及异常的处理:二是中断控制器.以P2020处理器为例,包括E500内核中断及异常处理系统和OpenPIC中断 ...
- 51单片机的中断系统
文章目录 1 51单片机的中断系统 1.1 中断的固有优先级和抢占优先级 1 51单片机的中断系统 1.1 中断的固有优先级和抢占优先级 中断使能寄存器: 中断查询序列: interrupt 后面中断 ...
- 51单片机 | 中断系统概念及结构
-------------------------------------------- 中断的过程: 对于单片机来讲,中断是指CPU在处理某一时间A时,发生了另一事件B请求CPU立刻去处理(中断发生 ...
- 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04
80X86中断系统 能够处理256个中断 用中断向量号0-255区别 可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理 1.中断的分类 中断可以分为内部中断和外部中断. (1)内 ...
- S3C2410中断系统
S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用0.18um制造工艺的32位微控制器.该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支 ...
- TMS320F28335项目开发记录9_28335之中断系统
TMS320F28335项目开发记录9_28335之中断系统 2014年11月08日 12:00:12 阅读数:3104 28335中断系统 1.中断系统 在这里我们要十分清楚DSP的中断系统.C28 ...
- 【原创】MIPS中断系统的板级验证及实例测试
"五一"假期前后这约五天时间,终于将MIPS中断系统进行了板级验证及实例测试.因为老师给的交叉编译工具不会用,所以测试代码完全用MIPS汇编编写.使用MARS而没有用QtSpim, ...
最新文章
- python数据库学习--Mysql
- mysql一个死锁分析
- Android性能系列-渲染篇
- 在ASP.Net中使用FCKeditor
- 探测器反向偏压_Y5T60 为何探测器和电吸收调制器,加反电压,而不是正电压
- python参数顺序 元组 字典_python学习之元组列表字典操作
- Linux(RadHat)基础学习—FTP服务
- (Python)时序预测的七种方法
- Element ui select同时获取value和label的值
- 软件驱动安装在docker_低成本的无线打印:群晖上通过Docker容器实现Airprint
- 1.通俗解释分布式系统
- 问题 E: 编写函数:求数组中的最小值 (Append Code)
- vscode插件版本的选择与安装
- 一款完整开源的物联网基础平台
- 一个区块链美女小白的蜕变——我庆幸自己能生活在这个高速时代!
- 域名注册_申请证书\SSL证书\tls证书
- get请求在ie浏览器中缓存问题
- 【微信】h5跳转微信小程序
- 网络安全形势严峻进入“红色警报”阶段
- flutter httpClient的封装 dio