目录

 普中代码示例

1、中断来源 

(1)InitPieCtrl();PIE级中断复位

(2)InitPieVectTable(void):

(3)EXTI1_Init(void)

 3、中断响应优先级

 4、中断向量表

 5、中断相关寄存器

(1)PIE 控制寄存器(PIECTRL)

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

 (3)中断标志寄存器(PIEIFRx)​编辑

 (4)中断使能寄存器(PIEIERx)

 (5)CPU 中断标志寄存器(IFR)

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

 (7)外部中断控制寄存器(XINTnCR)

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

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

6、中断配置


  中断中两个重要概念:

<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; // 开全开中断

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐