目录
1、中断概述
1.1、什么是中断?
1.2、中断作用
1.3、中断控制模块
中断控制模块:GPIO外部中断寄存器(中断触发条件)、GIC中断控制器 (中断管理)、处理器(响应中断)、IRQ中断和FIQ中断(两种中断方式)。
中断可以分为:外部中断和内部中断。
2、中断源配置
注意:当中断处理完成后,需要把状态清空
3、GIC(中断控制模块)
分发管脚使能(端口管脚使能):使能相应的中断到分发器,GIC能够接收对应中断,把中断打开。
4、中断信号设置
5、操作步骤
6、完整程序代码
#include "exynos_4412.h"
#include "uart.h"//调用串口初始化库
void do_irq()
{
//获取中断号
//ICCIAR
int id = 0;
id = CPU0.ICCIAR;
printf("中断号为:%d\n",id); //执行中断程序,打印该 id
//清除GPIO标志
EXT_INT41_PEND |= 1<<1;
//清除GIC标志
ICDICPR.ICDICPR1 |= 1<<25;
//中断标志
CPU0.ICCEOIR = CPU0.ICCEOIR & ~(0x3ff) | id;
}
void key_init()
{
//GPIO设置中断
GPX1.CON |= 0xf<<4;//引脚为中断输入
//配置上升沿为中断源
EXT_INT41_CON = EXT_INT41_CON & ~(0x7<<4) | 0x3<<4;
//使能引脚中断
EXT_INT41_MASK &= ~(1<<1);
//GIC设置
ICDDCR = 1;//GIC使能
//端口使能,引脚中断能够进入GIC, 57中断号(25管脚)进行使能
ICDISER.ICDISER1 |= 1<<25;
//ICDIPR设置中断优先级
//当前按键---57号中断,配置57中断号
ICDIPR.ICDIPR14 = ICDIPR.ICDIPR14 & ~(0xff<<8) | 1<<8;
//产生中断,送入对应CPU
ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & ~(0xff<<8) | 0x1<<8;
//cpu中断通道使能,开启GIC到CPU的中断通道
CPU0.ICCICR = 1;
//CPU过滤优先级中断
CPU0.ICCPMR = 255;
}
void delay()//延时函数
{
int i,j;
for(i = 0;i < 1000;i++)
{
for(j = 0;j <1000;j++);
}
}
int main()
{
uart_init();//串口初始化
key_init();//按下k2按键,执行中断
while(1)//正常执行
{
printf("------程序执行中------\n");
delay();
}
return 0;
}
当按下k2按下按键释放后(上升沿触发),就会暂停当前执行程序,去执行中断任务程序,打印id内容。
✨本篇到此结束啦!欢迎点赞👍收藏❤关注😎