【ARM】中断控制 ——第六篇-LMLPHP

目录

1、中断概述

1.1、什么是中断?

1.2、中断作用

1.3、中断控制模块

2、中断源配置

3、GIC(中断控制模块)

4、中断信号设置

5、操作步骤

6、完整程序代码


1、中断概述

1.1、什么是中断?

1.2、中断作用

1.3、中断控制模块

        中断控制模块:GPIO外部中断寄存器(中断触发条件)、GIC中断控制器 (中断管理)、处理器(响应中断)、IRQ中断和FIQ中断(两种中断方式)。

【ARM】中断控制 ——第六篇-LMLPHP

        中断可以分为:外部中断和内部中断。

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内容。

 ✨本篇到此结束啦!欢迎点赞👍收藏❤关注😎

【ARM】中断控制 ——第六篇-LMLPHP

10-10 09:29