Exynos4412裸机开发——中断处理
?以KEY2控制LED3亮滅為例:
一、輪詢方式
【0】檢測按鍵k2,按鍵k2按下一次,燈LED2閃一次。
【1】查看原理圖,連接引腳和控制邏輯
(1)按鍵k2 連接在GPX1_1引腳
(2)控制邏輯
?????? k2 按下? ---- K2閉合 ---- GPX1_1 低電壓
?????? k2 常態(tài)? ---- K2打開 ---- GPX1_1 高電壓
【2】查看相應(yīng)的芯片手冊
??? 【2-1】循環(huán)檢測GPX1_1引腳輸入的電平,為低電壓時,按鍵按下
??????? (1)配置GPX1_1引腳功能為輸入,設(shè)置內(nèi)部上拉下拉禁止。
???????????????? ?GPX1.CON = GPX1.CON &(~(0xf<<4)) ;
????????????????? GPX1.PUD = GPX1.PUD & ~(0x3 << 2);
(2)循環(huán)檢測:
這種輪詢方式始終占著CPU,不利于操作。
?
二、中斷方式
???????? 將K2按下時,GPX1_1引腳獲得的電平,作為異常事件。使能異常處理,k2每按下一次,響應(yīng)一次異常處理。SPI 傳遞流程如下示:
注:
????? Exynos4412中斷控制器包括160個中斷控制源,這些中斷源來自軟中斷(SGI),私有外部中斷(PPI),公共外部中斷(SPI)。
??????Exynos4412采用GIC中斷控制器,主要是因為Contex-A9 是多核處理器,GIC(Generic Interrupt Controller)通用中斷控制器用來選擇使用哪個CPU接口,具體主要有兩個功能:
1)分配器:設(shè)置一個開關(guān),是否接收外部中斷源;為該中斷源選擇CPU接口;
2)CPU接口:設(shè)置一個開發(fā),是否接受該中斷源請求;
?
具體實現(xiàn)如下:
1、外設(shè)一級 ---設(shè)置 GPIO控制器
1-- 將GPX1_1引腳的上拉和下拉禁止
??????? GPX1PUD[3:2]= 0b00;
2 -- 將GPX1_1引腳功能設(shè)置為中斷功能?WAKEUP_INT1[1] --- EXT_INT41[1]
????????GPX1CON[7:4] = 0xf
3 -- EXT_INT41CON? 配置觸發(fā)電平
???????當(dāng)前配置成下降沿觸發(fā):
?????? EXT_INT41CON[6:4] = 0x2
4 -- EXT_INT41_FLTCON0 配置中斷引腳濾波
????? ?默認(rèn)就是打開的,不需要配置
5 -- EXT_INT41_MASK 中斷使能寄存器
??????使能INT41[1]
????? EXT_INT41_MASK[1] = 0b0
6 -- EXT_INT41_PEND 中斷狀態(tài)寄存器
?????? 當(dāng)GPX1_1引腳接收到中斷信號,中斷發(fā)生,中斷狀態(tài)寄存器EXT_INT41_PEND 相應(yīng)位會自動置1
??????? 注意:中斷處理完成的時候,需要清除相應(yīng)狀態(tài)位。置1清0.
??????? EXT_INT41_PEND[1] =0b1?
?
2、中斷控制器
1--?找到外設(shè)中斷名稱和GIC中斷控制器對應(yīng)的名稱
?? 查看芯片手冊(本例:Exynos_4412 -- 9.2表)
????? ?WAKEUP_INT1[1] --- EXT_INT41[1] --- INT[9] --- SPI[25]/ID[57]
????? 其對應(yīng)INT[9],中斷ID為57,這是非常重要的,在后面的寄存器設(shè)置中起很大作用;
?
下面是外設(shè)與中斷控制器處理具體流程:
?
2 -- GIC使能
?????? ICDDCR =1;
???????使能分配器。
3?-- 使能相應(yīng)中斷到分配器
??????ICDISER.ICDISER1 |= (0x1 << 25);????//57/32 =1...25 取整數(shù)(那個寄存器) 和余數(shù)(哪位)
??????ICDISER用于使能相應(yīng)中斷到分配器,一個bit控制一個中斷源,一個ICDISER可以控制32個中斷源,這里INT[9] 對應(yīng)的中斷ID為57,所以在ICDSER1中進(jìn)行設(shè)置,57/32 =1余25,所以這里在ICDISER1第25位置一。
?
4 -- 選擇CPU接口
????? 設(shè)置SPI[25]/ID[57]由那個cpu處理,當(dāng)前設(shè)置為cpu0的irq中斷
??????ICDIPTR.ICDIPTR14 |= 0x01<<8;?//SPI25? interrupts are sent to processor 0?? //57/4 = 14..1 14號寄存器的[15:8]
??????ICDIPTR寄存器每8個bit 控制一個中斷源
?
5?-- 全局使能cpu0中斷處理
???????CPU0.ICCICR |= 0x1;
???????使能中斷到CPU。
?
6 -- 優(yōu)先級屏蔽寄存器,設(shè)置cpu0能處理所有的中斷。
??????CPU0.ICCPMR = 0xFF;
?????? ???????
3、ARM內(nèi)核(cpu0)
?????? 前面兩步設(shè)置好,就可以等待中斷的發(fā)生了,當(dāng)中斷發(fā)生時,ARM內(nèi)核的處理過程如下:
?
?1-- 四大步三小步 --- 硬件
????? (1)拷貝 CPSR 到 SPSR_<mode>
(2)設(shè)置適當(dāng)?shù)?CPSR 位:????????????????????????????????
(2-1)--改變處理器狀態(tài)進(jìn)入 ARM 態(tài)
? ?? (2-2)--改變處理器模式進(jìn)入相應(yīng)的異常模式
? ?? (2-3)--設(shè)置中斷禁止位禁止相應(yīng)中斷 (如果需要)
(3)保存返回地址到 LR_<mode>
(4)設(shè)置 PC 為相應(yīng)的異常向量
??????
2 -- 中斷服務(wù)程序 --- start.S 匯編
[cpp]?view plaincopy?
3--中斷處理程序 --- do_irq函數(shù)?C語言(函數(shù)原型void name(void))
(1) 讀取正在處理的中斷ID寄存器(ICCIAR)
?????? ???irq_num = (CPU0.ICCIAR & 0x1FF);
(2)根據(jù)irq_num,分支處理中斷??
[cpp]?view plaincopy
?(3)清除中斷狀態(tài)位
??????? (3-1)i.外設(shè)級,EXT_INT41_PEND |= 0x1 << 1;
????????(3-2)ii.GIC級,ICDICPR.ICDICPR1 |= 0x1 << 25;
????????(3-3)iii.CPU0級?CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;
?
下面是C 程序:
[cpp]?view plaincopy總結(jié)
以上是生活随笔為你收集整理的Exynos4412裸机开发——中断处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AB_PLC编程软件RSLogix_50
- 下一篇: 移动端跨平台框架分析