本文记录dsp28335的中断的配置方法:
目录

中断流程图
CPU内核的中断总共有16个中断通道,14个可屏蔽(INT1~12,INT13,INT4)和2个不可屏蔽(RESET和NMI)。INT13,INT4是定时器1,定时器2的专用通道(可用于实时操作系统)。
INT1~12这12路通过PIE模块每路分成8个,共分出了96个中断,每个中断的功能也确定好了。

中断分布表
从流程图可以看出来中断信号的流动过程:
1,从外设,外部获得中断信号
2,PIEIFRx ,PIE中断标志位,表示是否有中断信号的一个标志位
3,PIEIERx ,PIE通道使能寄存器,是个开关
4,PIEACKx,PIE应答,模块的总输出开关
(下面,中断信号进入CPU了)
5,IFR,CPU中断标志位
6,IER,CPU中断使能位,开关
7,INTM,全局中断使能,开关
其中需要配置的就是使能位,就是开关要开对。标志位都是信号进来时候,自动产生的。

上图使PIE模块前级更详细的流程图,外部中断需要通过IO口挂载,XINTCR配置,才进入PIE。所以设置时候再外设配置和PIE配置之间还多一步。
而其他外设都是直接进入PIE模块的,所以直接启动外设的PIE通道就可以了。
具体中断配置代码框架:
- // 步骤 1. 清除所有中断,初始化中断向量表:
- // 禁止CPU全局中断
- DINT;
-
- // 禁止CPU中断和清除所有CPU中断标志
- IER = 0x0000;
- IFR = 0x0000;
-
- // 初始化PIE控制寄存器到他们的默认状态.
- // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
- // 这个函数放在DSP280x_PieCtrl.c源文件里
- InitPieCtrl();
-
- //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
- // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
- // 这个函数放在了DSP280x_PieVect.c源文件里面.
- InitPieVectTable();
-
- //步骤 2. 配置中断外设
- EALLOW;//关闭写保护
- //外设时钟启动
- //外设模块配置
- //中断方式配置
- EDIS;//打开写保护
-
- //步骤 3. 设置外设与中断线 挂接关系
- EALLOW;//关闭写保护
- xxxxxxxx //链接PIE模块和外设中断的通道,
- PieVectTable.XINT1 = &EXTI_IRQ; //中断向量和中断函数绑定
-
- //步骤 4. 使能外设对应 PIE 中断通道
- PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 组 4通道 (这里需要查询PIE的中断矢量表 来确定使能的位)
- EDIS;//打开写保护
-
- //步骤 5. 使能CPU级中断及全局中断
- IER |= M_INT1;//使能INT1中断通道 (对应的变量值在 DSP2833x_Device.h中已进行宏定义。要用|或符号赋值,防止改变其他位)
- EINT;//打开全局中断
- ERTM;//当使用仿真器调试时 开启DEBUG中断
中断配置流程:
0,DINT; //关闭全局中断
1,初始化中断。可以调用库函数,只是只能再最开始时候使用,否则会覆盖前面配置好的中断。
2,开启各个时钟。各种外设时钟。
3,外设模块配置。GPIO复用,定时器配置等等。
4,中断方式配置。外部中断触发方式,
5,PIE模块配置。外设中断和PIE的通道,中断函数更新到中断向量表,PIE通道使能
6,CPU中断使能。开启全局中断。
7,PIEACK手动复位,再中断函数结束前。
外部中断的配置步骤:
0,DINT; //关闭全局中断
1,初始化中断。调用库函数。使所以寄存器复位到默认值。
2,开启GPIO时钟,。各种外设时钟。
3,外设模块配置。GPIO输入模式。
4,中断方式配置。下降沿触发,使能,
5,PIE模块配置。IO口挂载到对应中短线,中断函数更新到中断向量表,PIE通道使能
6,CPU中断使能。开启全局中断。
7,PIEACK手动复位,再中断函数结束前。
具体代码:
- void EXIT_Init(void)
- {
- // 步骤 1. 清除所有中断,初始化中断向量表:
- // 禁止CPU全局中断
- DINT;
-
- // 禁止CPU中断和清除所有CPU中断标志
- IER = 0x0000;
- IFR = 0x0000;
-
- // 初始化PIE控制寄存器到他们的默认状态.
- // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
- // 这个函数放在DSP280x_PieCtrl.c源文件里
- InitPieCtrl();
-
- //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
- // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
- // 这个函数放在了DSP280x_PieVect.c源文件里面.
- InitPieVectTable();
-
- //步骤 2. 打开GPIO时钟,配置GPIO14引脚为输入,GPIO50引脚为输入低电平
- EALLOW;//关闭写保护
- SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
-
- //由于矩阵键盘,把一根线设为低电平,当GPIO14联通,将被拉低。
- GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;
- GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;
- GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;
- GpioDataRegs.GPBCLEAR.bit.GPIO50 = 1;
-
-
- //中断IO口
- GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
- GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;
- GpioCtrlRegs.GPAPUD.bit.GPIO14 = 1;
- GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0x02;
- GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 1;
- EDIS;//打开写保护
-
- //步骤 3. 设置IO口与中断线 挂接关系
- EALLOW;//关闭写保护
- GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 14;//XINT1 对应 GPIO14脚(具体挂接要满足外部中断框图中的对应情况)
-
- PieVectTable.XINT1 = &EXTI_IRQ; //中断向量和中断函数绑定
-
- //步骤 5. 使能外设对应 PIE 中断通道
- PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 组 4通道 (这里需要查询PIE的中断矢量表 来确定使能的位)
-
- //步骤 6. 设置外部中断触发方式 并 外设中断使能
- XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿触发有效
- XIntruptRegs.XINT1CR.bit.ENABLE = 1;//使能外部中断
- EDIS;//打开写保护
-
- //步骤 7. 使能CPU级中断及全局中断
- IER |= M_INT1;//使能INT1中断通道 (对应的变量值在 DSP2833x_Device.h中已进行宏定义。要用|或符号赋值,防止改变其他位)
- EINT;//打开全局中断
-
- ERTM;//当使用仿真器调试时 开启DEBUG中断
- }
-
-
- //步骤 8. 编写中断函数,在中断函数结束前清零PIEACK对应位
- interrupt void EXTI_IRQ(void)
- {
-
- LED2_TOGGLE; //这里写任务函数
- while(GpioDataRegs.GPADAT.bit.GPIO14 == 0);
-
-
- PieCtrlRegs.PIEACK.bit.ACK1 = 1;//清零PIEACK对应位
- }
外部中断的配置步骤:
0,DINT; //关闭全局中断
1,初始化中断。调用库函数。使所以寄存器复位到默认值。(前面有其他中断时,去掉)
2,开启cpu time0时钟。
3,外设模块配置。先初始化定时器,配置定时器,打开定时器。
4,PIE模块配置。中断函数更新到中断向量表,PIE通道使能
5,CPU中断使能。开启全局中断。
6,PIEACK手动复位,再中断函数结束前。
具体代码:
- void TIM0_Init(float Freq, float Period)
- {
- DINT;
- // // 禁止CPU中断和清除所有CPU中断标志
- // IER = 0x0000;
- // IFR = 0x0000;
- //
- // // 初始化PIE控制寄存器到他们的默认状态.
- // // 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
- // // 这个函数放在DSP280x_PieCtrl.c源文件里
- // InitPieCtrl();
- //
- // //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
- // // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
- // // 这个函数放在了DSP280x_PieVect.c源文件里面.
- // InitPieVectTable();
-
-
-
- //第1步 打开TIM0时钟
- EALLOW;
- SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; //开启cpu time0时钟
- EDIS;
- //第2步 设置中断入口地址
- EALLOW;
- PieVectTable.TINT0 = &TIM0_IRQ; //中断向量表绑定中断函数
- EDIS;
- //第3步 配置定时器基本
- // Initialize address pointers to respective timer registers:
- InitCpuTimers();
- // Initialize timer period:
- ConfigCpuTimer(&CpuTimer0,Freq,Period);
- //第4步 打开定时器
- EALLOW;
- CpuTimer0.RegsAddr->TCR.bit.TSS = 0;
- //第5步 打开PIE组对应中断
- PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组7通道
- EDIS;
-
-
-
- //第6步 打开CPU中断
- IER |= M_INT1;
- EINT;
-
- ERTM;
- }
-
-
-
-
- interrupt void TIM0_IRQ(void)
- {
- LED3_TOGGLE;
-
-
- EALLOW;
- CpuTimer0Regs.TCR.bit.TIF = 1;//清除外设级中断标志位
- PieCtrlRegs.PIEACK.bit.ACK1 = 1;//清除PIE级中断应答
- EDIS;
- }
待续。。