8.6、ARM接口編程 -- 中斷GIC

  • irq 中斷異常 中斷信號線:irq fiq

  • 中斷源: 中斷信號的來源,芯片內部的控制器,芯片外部,外部中斷

  • 中斷控制器:GIC

  1. 管理這些中斷源,中斷擴展
  2. 管理中斷的優先級
  3. 管理中斷源,報告中斷ID
  4. 管理中斷的響應,屏蔽某些中斷
  5. 記錄中斷,中斷掛起
    在這裏插入圖片描述
    在這裏插入圖片描述

外部中斷
K2 GPX1_1 按下 0 彈起 1
GIC中斷源表: 中斷源 與 中斷ID 和GIC管腳 一一對應
1、配置GPIO : GPX1_1 K2
GPX1CON [7:4] = 0xf 配置GPX1_1管腳爲中斷功能

2、EXT_INT41CON 管腳中斷觸發模式選擇
[6:4] = 0x3 上升沿觸發

3、EXT_INT41_MASK
[1] = 0 使能GPX1_1管腳中斷

4、EXT_INT41_PEND 中斷掛起寄存器
[1] 中斷掛起位,當中斷髮生時,硬件會自動設置爲1
在處理完中斷事件後需要手動清除掛起。向該位寫入1

5、GIC配置: 查表 (中斷源表) 得到 中斷ID和port
ID 57 PORT 25

6、gic端口層:
1)ICDDCR GIC總中斷 = 1,打開
2)中斷掩碼寄存器ICDISER1_CPU0 [25] = 1 打開中斷ID57
3)優先級配置寄存器 0 最高優先級 255最低優先級ICDIPR14_CPU0 [15:8] = 0x00
4)中斷目標CPU配置寄存器ICDIPTR14_CPU0 [15:8] = 0x1 僅送CPU0
5)端口中斷掛起寄存器ICDICPR1_CPU0 [25] 當該位爲1時,中斷被掛起了,寫1到對應的位,清除對應中斷

7、配置CPU接口層:
1)ICCICR_CPU0 = 1 使能cpu相應中斷
2)優先級過濾寄存器:ICCPMR_CPU0 = 255 優先級高於該值都可以送入到cpu
3)ICCIAR_CPU0 [9:0] 中斷ID響應寄存器 :在中斷髮生時可以通過讀該寄存器得到中斷ID
4)ICCEOIR_CPU0 CPU中斷清除寄存器:需寫入中斷ID以清除對應中斷。

使用K2作爲外部中斷
1、打開start.s文件中的 irq_handler: irq模式中斷的中斷跳轉函數
在這裏插入圖片描述
2、GPIO 配置
1)配置gpx1_1爲外部中斷模式 - GPX1.CON |= 0XF << 4;
2)配置管腳爲上升沿觸發方式 EXT_INT41_CON = EXT_INT41_CON & ~(0X7 << 4) | 0X3<<4;
3)使能gpio管腳中斷 EXT_INT41_MASK &= ~(1<<1);
在這裏插入圖片描述
3、GIC配置
1. 開總中斷 ICDDCR = 1;
2. 使能端口中斷 ICDISER.ICDISER1 |= 1<<25;
3. 設置端口優先級 ICDIPR.ICDIPR14 &= ~(0xff<<8);
4. 設置中斷送CPU0 ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & ~(0xff<<8) | 0x1<<8;
5. 設置cpu0使能中斷 CPU0.ICCICR = 1;
6. CPU0中斷優先級過濾寄存器 CPU0.ICCPMR = 255;
在這裏插入圖片描述
4、 處理irq異常 — 編寫中斷處理函數 do_irq
1)獲取中斷ID int id = CPU0.ICCIAR;
2)分析ID並處理

if(id == 57)  {   //57號中斷被觸發
	 printf("k2 down\r\n");
	 //清除gpio中斷掛起
	 EXT_INT41_PEND |= 1<<1;
	 //清除gic中斷掛起
	 ICDICPR.ICDICPR1 |= 1<<25; 
}

3)清除CPU中斷掛起 CPU0.ICCEOIR = id;
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章