ARM-中断
GIC:中断源管理系统
ICD:中断混合器
ICC:中断接口
SGI:软中断
PPI:私有中断
SPI:共享中断
A9中断执行流程
设置中断源
GPX1.CON |= (0xf << 4);
//设置GPIO为中断模式
EXT_INT41_CON = (EXT_INT41_CON & ~(0XF << 4)) | (0X2 << 4);
//设置下降沿触发
EXT_INT41_FLICON0 |= (1 << 15);
//开启滤波
EXT_INT41_FLICON0 &= (~(1 << 14));
//开启滤波延时
EXT_INT41_MASK &= (~(1 << 1));
//清除中断掩码,传递下一级
设置GIC
1.设置ICD
Exyons 4421 中断查找流程
K2 -> GPX1_1 -> WEAKUP_INT1[1] -> 搜索到第二章 -> 引脚名称 xeint_9 -> eint[9] -> spi:25
ICDIDER.ICDISER1 |= (1 << 25);
//使能响应中断57 spi:25
ICDIPTR.ICDIPTR14 = (ICDIPTR.ICDIPTR14 & (~(0XFF << 8))) | (0B000001 << 8)
//设置中断57指向cpu0
ICDDCR = 1;
2.开启ICC
CPU0.ICCICR = 1;
//开启ICC
.weak do_irq –>弱符号伪指令
3.中断函数
void do_irq(void)
{
int number;
number = CPU0.ICCIAR & 0x3ff;惺惺惜惺惺·
printf("hello\n");
EXT_INT41_PEND |= (1 << 1);
//清除key中断标志位
ICDICPR.ICDICPR1 |= (1 << 25);
//清除ICD中断标志位
CPU0.ICCEOIR = (CPU0.ICCEOIR & (~(0x3ff))) | number;
//清除ICC中断标志位
}
pend寄存器写1清零(清楚中断),写0无效。
指针函数实现中断优化
void (* v[160])(void);
void key2_int
{
printf("key 2\n");
EXT_INT41_PEND |=(1 << 1);
ICDICPR.ICDICPR1 |= (1 << 25);
return ;
}
void do_irq(void)
{
int number;
number = CPU0.ICCIAR & 0x3ff;
(* v[number])();
CPU0.ICCEOIR = (CPU0.ICCEOIR &(~(0x3ff))) | number;
}
v[57] = key2_int;