DSP28335笔记 ———— 中断系统 之 外部中断
我用的开发板是“硬汉DSP28335开发板”,文中对于硬件的描述可以说是没有,而且我还没有附上电路图希望在看的朋友不要喷我。
然后,我个人感觉普中的DSP28335开发手册比较容易看懂,他里面把寄存器功能都列了出来还做好了翻译,比自己翻原版的手册方便的多。
目录
- DSP28335笔记 ———— 中断系统 之 外部中断
- 一、DSP中断系统
- 二、外部中断
- 三、外部中断代码试验
一、DSP中断系统
DSP28335中断系统分为三级中断,分别为:外设中断、PIE中断、CPU中断。具体的中断过程网上其他大牛已经解释的超级详细了,我就不半瓶子晃荡了,这里简要记录下我对中断过程的个人理解。
(文字不够图片来凑,我就直接上框图。)
一般来讲中断的顺序应该是,外设中断 —> PIE中断 —> CPU中断。我个人是反顺序来记忆学习的。从上面的框图可以看出CPU中断有INT1to14和NMI个中断通道,对于初学者的我们暂时只需要知道被PIE控制的12条通道既可。
然后再看下图:
CPU级中断的12条中断通道,每条通道被PIE复用分成了8份,一共生成了96条中断通道,每条通道也都可以单独使能控制。
每级的中断过程大致都是先产生中断标志IFR,当IER使能则进入对应的中断程序,对于CPU级和PIE级中断后都不需要软件清除标志位,但是PIE需要手动将PIEACKx对应位写1清零,否则中断将无法进入CPU。
然后,需要了解的是,PIE块将芯片的外设中断已经与PIE的12*8=96条通道做好了对应,具体对应关系参考上表。今天我试验的是外部中断XINT1。
二、外部中断
到了这里就进入了外设中断的部分,但是外部中断与其他外设中断又有一些不同,它需要设置XINTn外部中断通道挂接对应在某引脚,从最上面的两个框图可以看出来,还不需要清除外设中断标志位。
- 外部中断1(XINT1)到外部中断2(XINT2)可以挂接GPIO0到GPIO31
- 外部中断3(XINT3)到外部中断7(XINT7)可以挂接GPIO32到GPIO63
按照常识,每完成中断动作后应该清楚中断标志位,CPU级和PIE级会自动清除,但是需要对PIEACK寄存器进行软件写1清零;
外设级的标志位则需要软件手动清零,可是外部中断不需要,我猜测可能是因为外部输入的有效信号直接输入到PIE块,这点希望有知道的大神帮我解惑一下,谢谢。
三、外部中断代码试验
我的开发板上只有一个3*3的按键矩阵,这里为了简便只使用其中一个按键,通过按键改变数码管的显示。
因为是通过中断实现数码管的改变,所以主函数中的内容就只有相关初始化的动作。
void main()
{
InitSysCtrl();
SEG_Init();
EXTI_Init();
while(1)
{}
}
这里我们重点是外部中断,我们直接贴出**EXTI_Init()**的代码实现,对于其他的不做过多描述。
在此之前要明确配置内容为:外部中断1 挂接到 引脚14、有效信号下降沿进入中断。
我将代码编写啰嗦的分成八个步骤:
void EXTI_Init(void)
{
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;
GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;
GpioDataRegs.GPBCLEAR.bit.GPIO50 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 14;
EDIS;
EALLOW;
PieVectTable.XINT1 = &EXTI_IRQ;
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;
XIntruptRegs.XINT1CR.bit.POLARITY = 0;
XIntruptRegs.XINT1CR.bit.ENABLE = 1;
IER |= M_INT1;
EINT;
ERTM;
}
interrupt void EXTI_IRQ(void)
{
static char i = 0;
i++;
if(i>9) i=0;
Seg_SetNum(i);
while(GpioDataRegs.GPADAT.bit.GPIO14 == 0);
PieCtrlRegs.PIEACK.bit.ACK1 = 1;
}
今天大概就是这样了,希望各路大神批评指正,(¦3[▓▓] 晚安!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)