2.DSP-中断
中断中两个重要概念:: 内核响应中断后执行的相应处理程序。例如ADC转换完成中断被响应后,CPU执行相应的中断服务函数,该函数实现的功能一般是从ADC结果寄存器中取走并使用转换好的数据。:中断服务程序的入口地址,当CPU响应中断请求时,会跳转到该地址去执行代码。
目录
中断中两个重要概念:
<1> 中断服务函数: 内核响应中断后执行的相应处理程序。例如ADC转换完成中断被响应后,CPU执行相应的中断服务函数,该函数实现的功能一般是从ADC结果寄存器中取走并使用转换好的数据。
<2> 中断向量:中断服务程序的入口地址,当CPU响应中断请求时,会跳转到该地址去执行代码。
普中代码示例
(1)主函数
void main()
{
int i=0;
InitSysCtrl();//时钟初始化
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
EXTI1_Init();
EXTI2_Init();
while(1)
{
i++;
if(i%2000==0)
{
LED1_TOGGLE;
}
DELAY_US(100);
}
}
1、中断来源

F28335 的中断源可 分为片内外设中断源,比如 PWM、CAP、QEP、定时器等,片外中断源,外部中断 输入引脚 XINT1、XINT2 引入的外部中断源。这些中断源将中断请求信号传递给 内核就需要中断线,F28335 的中断线是有限的。
F28335 内部有 16 个中断线,其中包括 2 个不可屏蔽中断(RESET 和 NMI)与 14 个可屏蔽中断。可屏蔽中断通过相应的中断使能寄存器使用或者禁止产生的 中断,在这 14 个可屏蔽中断中,其中 TIM1 和 TIM2 产生的中断请求通过 INT13、 INT14 中断线到达 CPU,这两个中断已经预留给了实时操作系统,因此剩下的 12 个可屏蔽中断可供外部中断和处理器内部单元使用。F28335 的外设中断源共用 58 个,通过复用将这58个中断源连接。

2、F28335 中断机制
中断部分代码配置
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
EXTI1_Init();
EXTI2_Init();
(1)InitPieCtrl();PIE级中断复位
宏定义:EINT开中断,DINT关中断
void InitPieCtrl(void)
{
// Disable Interrupts at the CPU level:
DINT;
// Disable the PIE
PieCtrlRegs.PIECTRL.bit.ENPIE = 0;
// Clear all PIEIER registers:
PieCtrlRegs.PIEIER1.all = 0;
PieCtrlRegs.PIEIER2.all = 0;
PieCtrlRegs.PIEIER3.all = 0;
PieCtrlRegs.PIEIER4.all = 0;
PieCtrlRegs.PIEIER5.all = 0;
PieCtrlRegs.PIEIER6.all = 0;
PieCtrlRegs.PIEIER7.all = 0;
PieCtrlRegs.PIEIER8.all = 0;
PieCtrlRegs.PIEIER9.all = 0;
PieCtrlRegs.PIEIER10.all = 0;
PieCtrlRegs.PIEIER11.all = 0;
PieCtrlRegs.PIEIER12.all = 0;
// Clear all PIEIFR registers:
PieCtrlRegs.PIEIFR1.all = 0;
PieCtrlRegs.PIEIFR2.all = 0;
PieCtrlRegs.PIEIFR3.all = 0;
PieCtrlRegs.PIEIFR4.all = 0;
PieCtrlRegs.PIEIFR5.all = 0;
PieCtrlRegs.PIEIFR6.all = 0;
PieCtrlRegs.PIEIFR7.all = 0;
PieCtrlRegs.PIEIFR8.all = 0;
PieCtrlRegs.PIEIFR9.all = 0;
PieCtrlRegs.PIEIFR10.all = 0;
PieCtrlRegs.PIEIFR11.all = 0;
PieCtrlRegs.PIEIFR12.all = 0;
}
(2)InitPieVectTable(void):
将中断向量表拷贝到内存中;使能PIE,把中断向量表映射到到PIE中断向量表中
void InitPieVectTable(void)
{
int16 i;
Uint32 *Source = (void *) &PieVectTableInit;
Uint32 *Dest = (void *) &PieVectTable;
EALLOW;
for(i=0; i < 128; i++)
*Dest++ = *Source++;
EDIS;
// Enable the PIE Vector Table
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
}
(3)EXTI1_Init(void)
输入输出引脚配置
在引脚配置中:
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0;//同步时钟
GPIO 输入可以通过量化寄存器 GPxQUAL 对输入信号进行量化限制,从而可以 消除数字量 IO 引脚的噪声干扰。配置 GPAQSEL1、GPAQSEL2 寄存器选择 GPIO 引 脚的输入限制类型。对于一个 GPIO 输入引脚,输入限制可以被 SYSCLKOUT 同步 然后经采用窗进行滤波限制。而对于配置成外设输入的引脚,除同步与采样限制 外,也可以是异步输入的。此处采用同步时钟。

F28335 共支持 7 个外部中断 ,XINT1-7;

设置 IO 口与中断线的映射关系
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;
指定中断向量表中断服务函数地址
PieVectTable.XINT1 = &EXTI1_IRQn;
使能外设对应的 PIE 中断使能
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;

设置外部中断触发方式并使能中断
XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿触发中断
XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能XINT1
使能 CPU 级中断及全局中断
IER |= M_INT1; // 使能CPU中断1(INT1)
EINT; // 开全局中断
ERTM;

编写外部中断服务函数
interrupt void EXTI1_IRQn(void)
{
......
PieCtrlRegs.PIEACK.bit.ACK1=1;
}
void EXTI1_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock
EDIS;
EALLOW;
//KEY端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
GpioCtrlRegs.GPADIR.bit.GPIO12=0;
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
GpioDataRegs.GPBCLEAR.bit.GPIO48=1;
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; // XINT1是GPIO12
EDIS;
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句
PieVectTable.XINT1 = &EXTI1_IRQn;
EDIS; // EDIS的意思是不允许修改被保护的寄存器
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE组1的INT4
XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿触发中断
XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能XINT1
IER |= M_INT1; // 使能CPU中断1(INT1)
EINT; // 开全局中断
ERTM;
}
interrupt void EXTI1_IRQn(void)
{
Uint32 i;
for(i=0;i<10000;i++); //键盘消抖动
while(!KEY_H1);
LED2_TOGGLE;
PieCtrlRegs.PIEACK.bit.ACK1=1;
}
3、中断响应优先级
序号越小优先级越高,不同组INT1中所有的中断大于INT2,INT1.8>INT2.1;
同组INTX.1大于INTX.8;

4、中断向量表
CPU 响应中断,就是 CPU 要去执行相应的中断服务程序,其响应过程是 CPU 将现执行程序的指令地址压入堆栈,跳转到中断服务程序入口地址,中断服务程 序的入口地址就是中断向量,这个中断向量用 2 个 16 位寄存器存放。入口地址 是32 位的,地址的低 16 位保存在该向量的低 16 位;地址的高 16 位则保存在它 的高 6 位,更高的 10 位保留。每个中断都有自己对应的中断向量,即每个中断 源都对应着自己的中断服务程序的入口地址.
5、中断相关寄存器
(1)PIE 控制寄存器(PIECTRL)
PIE 控制寄存器(PIECTRL)各位信息如下图所示:


(2)PIE 中断应答寄存器(PIEACK)

(3)中断标志寄存器(PIEIFRx)
(4)中断使能寄存器(PIEIERx)

(5)CPU 中断标志寄存器(IFR)
CPU 的应答中断和硬件复位也可以清除 IFR 标志。CPU 中断标志寄存器(IFR) 各位信息如下图所示:

(6)CPU 中断使能寄存器(IER)

(7)外部中断控制寄存器(XINTnCR)
F28335 共支持 7 个外部中断 XINT1-XINT7,XINT13 还有一个不可屏蔽的外部 中断 XNMI 共用中断源。每一个外部中断可以被选择为正边沿或负边沿触发.

(8)外部 NMI 中断控制寄存器(XNMICR)

(9)外部中断 x 计数器(XINTxCTR)

6、中断配置
(1)使能外设对应的 PIE 中断
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能 PIE 组 1 的INTx4
(2)使能外设中断
XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能XINT1
(3)指定中断向量表中断服务函数地址
EALLOW; // 修改被保护的寄存器,修改前应添加 EALLOW 语句
PieVectTable.XINT1 = &EXTI1_IRQn;
EDIS; // EDIS 的意思是不允许修改被保护的寄存器
(4)使能 CPU 中断及全局
IER |= M_INT1; // 使能 CPU 中断 1
EINT; // 开全开中断
(5)编写中断服务函数
IER |= M_INT1; // 使能 CPU 中断 1
EINT; // 开全开中断
更多推荐


所有评论(0)