您当前的位置: 首页 > 

风间琉璃•

暂无认证

  • 4浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

从零实现Cortex-A7中断系统

风间琉璃• 发布时间:2022-02-05 23:15:40 ,浏览量:4

一、中断向量表及中断服务函数的编写 1.建立中断向量表

中断向量表应该位于程序运行的起始地址处, 在中断向量表前面不要有其他代码

根据A7提供的中断向量编写相应的中断向量表

_start:
	ldr pc, =Reset_Handler		/* 复位中断 					*/	
	ldr pc, =Undefined_Handler	/* 未定义中断 					*/
	ldr pc, =SVC_Handler		/* SVC(Supervisor)中断 		*/
	ldr pc, =PrefAbort_Handler	/* 预取终止中断 					*/
	ldr pc, =DataAbort_Handler	/* 数据终止中断 					*/
	ldr	pc, =NotUsed_Handler	/* 未使用中断					*/
	ldr pc, =IRQ_Handler		/* IRQ中断 					*/
	ldr pc, =FIQ_Handler		/* FIQ(快速中断)未定义中断 			*/
2.中断复位服务函数

在复位服务函数里面通过CP15协处理器关闭I,DCache和MMU,要关闭全局中断(临界区保护)

    cpsid i						/* 关闭全局中断 */

    mrc     p15, 0, r0, c1, c0, 0     /* 读取CP15的C1寄存器到R0中       		        	*/
    bic     r0,  r0, #(0x1 GDIR &= ~( 1 GDIR |= 1 outputLogic);	/* 设置默认输出电平 */
	}
	gpio_intconfig(base, pin, config->interruptMode);	/* 中断功能配置 */
}

然后设置GPIO的中断配置功能,需要配置GPIOx_ICR1/2寄存器和EDGE_SEL寄存器 ( 具体功能参考手册)

void gpio_intconfig(GPIO_Type* base, unsigned int pin, gpio_interrupt_mode_t pin_int_mode)
{
	volatile uint32_t *icr;
	uint32_t icrShift;

	icrShift = pin;
	
	base->EDGE_SEL &= ~(1U ICR1);
	}
	else			/* 高16位 */
	{
		icr = &(base->ICR2);
		icrShift -= 16;
	}
	switch(pin_int_mode)
	{
		case(kGPIO_IntLowLevel):
			*icr &= ~(3U             
关注
打赏
1665385461
查看更多评论
0.0743s