ARM-中断

ARM-中断


GIC:中断源管理系统

ICD:中断混合器

ICC:中断接口

SGI:软中断

PPI:私有中断

SPI:共享中断


A9中断执行流程

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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值