pie对miss外设店的中断分为几级

TMS320F28335项目开发记录9 28335之中断系统 - 单片机 - 次元立方网 - 电脑知识与技术互动交流平台
TMS320F28335项目开发记录9 28335之中断系统
28335中断系统
1.中断系统
在这里我们要十分清楚DSP的中断系统。C28XX一共有16个中断源,其中有2个不可屏蔽的中断RESET和NMI、定时器1和定时器2分别使用中断13和14。这样还有12个中断都直接连接到外设中断扩展模块PIE上。说的简单一点就是PIE通过12根线与28335核的12个中断线相连。而PIE的另外一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。
这样PIE共管理12*8=96个外部中断。这12组大中断由28335核的中断寄存器IER来控制,即IER确定每个中断到底属于哪一组大中断(如IER |= M_INT12; 说明我们要用第12组的中断,但是第12组里面的什么中断CPU并不知道需要再由PIEIER确定 )。
接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想象到PIEIER共有12总即从PIEIER1-PIEIER12)。另外,PIE模块还有中断标志寄存器PIEIFR,同样它的低8位是来自外部中断的8个标志位,同样CPU的IFR寄存器是中断组的标志寄存器。由此看来,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,需要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的中断标志寄存器由硬件来清零。
// This is needed to write to EALLOW protected registers
PieVectTable.XINT2 = &ISRE
//告诉中断入口地址
// This is needed to disable write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
// Enable the PIE block使能PIE
PieCtrlRegs.PIEIER1.bit.INTx5= 1;
//使能第一组中的中断5
IER |= M_INT1;
// Enable CPU 第一组中断
// Enable Global interrupt INTM
// Enable Global realtime interrupt DBGM
也就是说,12组中的每个中断都要完成上面的相同配置,剩下的才是去配置自己的中断。如我们提到的EXINT,即外面来个低电平我们就进入中断,完成我们的程序。在这里要介绍一下,DSP的GPIO口都可以配置为外部中断口,其配置方法如下:
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; //选择他们是GPIO口
GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO54 = 0;//选择他们都是输入口
GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO56 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO57 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO54= 0;//GPIO时钟和系统时钟一样且支持GPIO
GpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0;
GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;//中断3选择GPIO
GpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL = 55;
GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL = 56;
GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL = 57;
XIntruptRegs.XINT3CR.bit.POLARITY= 0;//触发模式为下降沿触发
XIntruptRegs.XINT4CR.bit.POLARITY= 0;
XIntruptRegs.XINT5CR.bit.POLARITY= 0;
XIntruptRegs.XINT6CR.bit.POLARITY= 0;
XIntruptRegs.XINT3CR.bit.ENABLE = 1;//使能中断
XIntruptRegs.XINT4CR.bit.ENABLE = 1;
XIntruptRegs.XINT5CR.bit.ENABLE = 1;
XIntruptRegs.XINT6CR.bit.ENABLE = 1;
注意一点就是外部中断1和2只能对GPIO0&GPIO31配置;外部中断3和4、5、6、7只对GPIO32&GPIO63配置。
2.如何开启某个中断?
设置中断向量。例如:PieVectTable.ADCINT = &adc_等
打开PIE控制器。PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
使能PIE中对应外设的中断(相应group的相应pin)。例如:PieCtrlRegs.PIEIER1.bit.INTx8 = 1; PieCtrlRegs.PIEIER1.bit.INTx6 = 1;等
使能CPU的相应中断(INT1~INT12)IER |= M_INT1;
使能CPU响应中断EINT、ERTM;;
参考网址:/Article/C2000/Delfino/18.html
3.中断标志有几级?作用是什么?
中断标志主要有三级CPU(有16个标志位)、PIE(有12组每组有12个标志位)和外设(有的外设没有)。
标志位在中断发生后锁存中断状态,即表示中断发生。在CPU响应中断后,会自动清除cpu级别的标志位IFR bit,同时将INTM bit 置位,以防止其它中断的发生;
CPU在从PIE中取中断向量时PIE会自动清除PIE级别的标志位PIEIFRx.y。所以在进入中断处理程序后除了外设所有中断位都已经清除。而中断处理程序中需要清除PIEACKx和外设的中断标志位(如果有的话)。
在CPU响应一个中断后,在进入ISR的时候,默认会关断全局中断,即在执行中断服务程序时,不会有其他中断来打断CPU,包括本次的中断事件。另外,如果外设的中断标志位不清除,不会循环进入这个中断服务函数,这个外设中断被阻断了。所以只有清除外设的中断服务程序,才能响应下一次的外设中断。PIEACK同理,如果没有PIEACK,这组所有中断都被阻断。
延伸阅读:
iTop4412irom启动和Exynos4212iROMBootingGuide是一样...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......DSP思考题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||暂无简介
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩12页未读,继续阅读
你可能喜欢三级中断系统_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
三级中断系统
上传于||暂无简介
大小:743.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢DSP&28335&的中断系统总结
PIE通过12根线与28335核的12个中断线相连。而PIE的另外
一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。这样PIE共管理12*8=96个外部中断。这12组大中断由28335核的中断寄存器IER来控
制,即IER确定每个中断到底属于哪一组大中断(如IER |=
M_INT12;说明我们要用第12组的中断,但是第12组里面的什么中断CPU并不知道需
要再由PIEIER确定
)。接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想
象到PIEIER共有12总即从PIEIER1-PIEIER12)。另外,PIE模块还有中断标志寄存器PIEIFR,同样它的低8位是来自外部中断的8个标志位,同
样CPU的IFR寄存器是中断组的标志寄存器。由此看来,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。
除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,需要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的
中断标志寄存器由硬件来清零。
下图是INTx.y的具体意义。
外部中断源
用户中断分为三部分:外设级、PIE级、CPU级
三级串联构成一路中断。
1.外设级中断——中断标志必须采用软件进行清除
2.PIE中断可以支持96个独立中断,这些中断分为8个小组,每个小组包含12个中断。
CPU经过9个时钟周期获取中断向量地址和保存关键寄存器数据之后才能执行中断程序。
28335在CPU级支持一个不可屏蔽中断(NMI)和16个可屏蔽中断(INT1-INT14,RTOSINT,DLOGINT)。
PIE模块汇集8个外设和管脚中断进入一个CPU中断
PIE group1 ----group12分别对应了CPU中断1---中断12
对于不可屏蔽中断来说,它直接进入CPU级。
对于可屏蔽中断来说,PIE模块有相关的标志寄存器(PIEIFRx和PIEIERx)(x=1-------12)每一个位设为y(y=1-----8)
PIEIERx.y 和PIEIFRx.y,
除此之外,对于每一个PIE中断组来说(1----12)还有一个PIE响应标志位PIEACK,如PIEACKx(x=1----12)
机理如下:当有中断请求进入PIE控制器的时候,相关的PIE中断标志位PIEIFRx.y置高。如果PIE中断允许位PIEIERx.y也置高的时候,PIE控制器机会检查PIEACKx标志位来决定CPU是否已经准备好接收这个PIE中断组的中断。
如果PIEACKZx被清零了,那么PIE会把这个中断请求送到CPU级。
如果PIEACKx位置一,那么PIE就会等待直到这个标志位清零然后发送中断请求给CPU级的INTx。(TMS320F2833X
SYSTEM CONTROL AND INTERRUPTS REFERENCE GUIDE)
PIE中断寄存器:PIECTRL,PIEACK,PIEIFRx
3 CPU级中断
一旦中断请求到达CPU级,CPU级和INTx相对应的中断标志位(IFR)置一,如果CPU中断允许寄存器(IER)或者调试中断允许寄存器(DBGIER)和全局中断屏蔽位(INTM)允许的话,CPU才会执行这个中断申请。
中断过程中需要手动清零的寄存器:PIEACKx 写1
CPU中断寄存器:IFR,IER,XINTnCR
外部中断控制寄存器(支持XINT1~XINT7,n=1~7。XINT13和不可屏蔽中断XNMI多路复用),XNMICR
外部NMI中断控制寄存器
&定时器对一般的控制器和DSP芯片来说是一个基本的外设,C2000系列DSP的定时器操作方法基本上差不多,就以28335的定时器0为例,说下其使用。
&& 定时器0使用
(1)首先应打开Timer的时钟使能&&SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK
= 1; // CPU Timer 0
&&(2)在主程序添加外设中断句柄
(a)使能定时器中断TCR寄存器(b)IER|=M_INT1;使能连接的INT1中断;(c)PieCtrlRegs.PIEIER1.bit.INTx7=1;使能TINT0,1组中第7中断;
&&(3)初始化时钟:包括初始化Timer0定时器指向相应的地址;定时周期设定;定时器时钟配置,定时器分频设定,可概括为InitCpuTimers();
(4)配置Timer0,即为ConfigCpuTimer(&CpuTimer0, 150,
&&(5)开中断EINT;ERTM;
&&(6)开定时器:CpuTimer0Regs.TCR.bit.TSS=0;
& (7)中断响应函数中需要:PieCtrlRegs.PIEACK.all =
PIEACK_GROUP1;
下面是一个外部中断的例子,外面有一个按钮接到 GPIO15上 输入作为外部中断源,每次按一下按钮触发一个中断,在ISR中
// TITLE: &DSP2833x External Interrupt test
// & &Xint1 input is synched
to SYSCLKOUT
// & &Watch Variables:
Xint1Count for the number of times through Xint1 interrupt
LoopCount for the number of times through the idle loop
#include "DSP28x_Project.h" &
& // Device Headerfile and Examples Include
// Prototype statements for functions found within this
interrupt void xint1_isr(void);
// Global variables for this example
volatile Uint32 Xint1C
Uint32 LoopC
#define DELAY 35.700L
void main(void)
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c
&& InitSysCtrl();
// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file
// illustrates how to set the GPIO to it's default state.
// &InitGpio(); &// Skipped
for this example
// Step 3. Clear all interrupts and initialize PIE vector
// Disable CPU interrupts
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
&& InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
&& IER = 0x0000;
&& IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell
// Service Routines (ISR).
// This will populate the entire table, even if the
// is not used in this example. &This is useful
for debug purposes.
// The shell ISR routines are found in
DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
&& InitPieVectTable();
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
&& EALLOW; // This is needed
to write to EALLOW protected registers
&& PieVectTable.XINT1 =
&& EDIS; & //
This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
// Step 5. User specific code, enable interrupts:
// Clear the counters
&& Xint1Count = 0; // Count
Xint1 interrupts
&& LoopCount = 0;
&// Count times through idle loop
// Enable Xint1 and XINT2 in the PIE: Group 1 interrupt 4
// Enable int1 which is connected to WAKEINT:
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; &
&// Enable the PIE block
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; &
&// Enable PIE Gropu 1 INT4
&& IER |= M_INT1;
& & &// Enable
&& EINT; &
& & & // Enable
Global Interrupts
// GPIO0 are inputs
&& EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0; &
& & & // GPIO
15作为GPIO ,接到按钮上
GpioCtrlRegs.GPADIR.bit.GPIO15 = 0; &
&// input 作为输入
GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 0;// Xint1 Synch to SYSCLKOUT
only ,在PDF 里搜GPAQSEL关键词
// GPIO15 is XINT1
&& EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 15; & //
Xint1 is GPIO0 &修改 GPIO15 &GPIO
15 作为外部中断1
// Configure XINT1
XIntruptRegs.XINT1CR.bit.POLARITY = 0; &
& &// Falling edge interrupt
&下降沿触发
// Enable XINT1&
XIntruptRegs.XINT1CR.bit.ENABLE = 1; &
& & &// Enable
// Step 6. IDLE loop:
&& for(;;)
// Step 7. Insert all local Interrupt Service Routines (ISRs)
and functions here:
// If local ISRs are used, reassign vector addresses in vector
&& &// shown
interrupt void xint1_isr(void)
//GpioDataRegs.GPBCLEAR.all = 0x4; & // GPIO34
Xint1Count++;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
&//0x0001,第一组的ACK 写1清零
已投稿到:

我要回帖

更多关于 外设堂 的文章

 

随机推荐