中断部分我觉得写太多理论方面,也是很容易让人看不懂,望而却步。
下面写一些日常使用的代码
初始化配置过程,放在void EXTI1_init()中;
1、使能外设对应的PIE中断
根据下表来判断中断连接哪一组的哪一根线。
下面是常用的表单,对应每一个中断对应
INT1.1 | SEQ1INT(ADC) |
INT1.2 | SEQ2INT(ADC) |
INT1.4 | XINT1 |
INT1.5 | XINT2 |
INT1.6 | ADCINT(ADC) |
INT1.7 | TINT0(CPU定时器0) |
INT3.1 | ePWM1_INT(ePWM1) |
INT3.2 | ePWM2_INT(ePWM2) |
INT3.3 | ePWM3_INT(ePWM3) |
INT3.4 | ePWM4_INT(ePWM4) |
INT3.5 | ePWM5_INT(ePWM5) |
INT3.6 | ePWM6_INT(ePWM6) |
INT4.1 | eCAP1_INT(eCAP1) |
INT4.2 | eCAP2_INT(eCAP2) |
INT4.3 | eCAP3_INT(eCAP3) |
INT4.4 | eCAP4_INT(eCAP4) |
INT4.5 | eCAP5_INT(eCAP5) |
INT4.6 | eCAP6_INT(eCAP6) |
使能外部中断1
PieCtrlRegs.PIEIER1.bit.INTx4=1; //使能PIE组1的INT4
2、使能外设中断
该中断由外设相关中断使能位来控制,比如外部中断1由外部中断1的控制寄存器中相应中断使能位来控制。
XIntruptRegs.XINT1CR.bit.ENABLE=1; //使能XINT1
3、触发中断
XIntruptRegs.XINTCR1.bit.POLARITY=0;//下降沿触发中断
XIntruptRegs.XINTCR1.bit.ENABLE=1;//使能外部中断1
4、指定中断向量表中断服务函数地址
通过对PIE中断向量表寄存 器的相应位进行设置,中断服务函数名可自定义。中断函数名前需加上地址符“&”。对PIE中断向量表寄存器设置时要注意在程序前加入EALLOW,以修改被保护的寄存器;程序后加入EDIS,不允许修改被保护的寄存器。
EALLOW;
PieVectTable.XINT1=&EXTI1_IRQn;//函数名需要添加&
EDIS;
4、使能CPU中断及全局中断
通过对IER和EINT寄存器相应位设置进行使能或者无效。
配置外部中断程序如下
IER|=M_INT1;//使能CPU中断1
EINT;//开全局中断
ERTM;
5、配置中断服务程序
配置好中断后如果有触发,即会进入中断服务函数,中断服务函数名在步骤3定义好,在&之后的名字。前后保证一致,否则将不会进入中断服务函数内执行。在DSP28335 软件开发中,要在中断服务函数名前加上关键字interrupt。
外部中断1的 中断服务函数如下
interrupt void EXT1_IRQn(void)
{
功能;
}
完整初始化函数程序如下
#include"exti.h"
#include"led.h"
#include"key.h"
void EXTI1_init()
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK=1;//GPIO输入时钟
EDIS;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;//将GPIO12设为通用IO
GpioCtrlRegs.GPADIR.bit.GPIO12=0;//输入
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;//上拉电阻
GpioCtrlRegs.GPAQSEL1.bit.GPIO12=0;//外部中断1和系统时钟同步
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL=12;//XINT1对应GPIO12
EDIS;
EALLOW;
PieVectTable.XINT1=&EXTI1_IRQn;//中断向量表地址
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx4=1;//由于外部中断1对应1.4
XIntruptRegs.XINT1CR.bit.POLARITY=0;//按下按钮,下降沿触发中断;
XIntruptRegs.XINT1CR.bit.ENABLE=1;//使能外部中断1;
IER|=M_INT1;//使能外部中断1;
EINT;//开全局中断
ERTM;}
interrupt void EXTI1_IRQn(void)
{
Uint32 i;
for(i=0;i<10000;i++);//消抖
while(!KEY_H1)//等待按钮按下
LED_TOGGLE;
PieCtrlRegs.PIEACK.bit.ACK1=1;//执行后消除中断标志,ACK清0,PIE给CPU一个脉冲
}
主函数
void main()
{ int i;
InitSysCtrl();
InitPieCtrl();
IER|=0x00;
IFR|=0x00;
InitPieVectTable();
LED_Init();
EXTI1_Init();
while(1)
{ i++;
if(i%2000==0)
{LED2_TOGGLE;//200ms闪烁一次
}
delay_us(100);
}}