TQ210裸機程式設計 4 按鍵(中斷法)

2021-07-07 05:28:42 字數 2588 閱讀 6973

s5pv210有4個向量中斷控制器(vic),每個向量中斷控制器包含32個中斷源。

當某個中斷源產生中斷時,cpu會自動的將vicxvectaddry(x=0,1,2,3,y=0-31)暫存器的值賦給vicxaddress(x=0,1,2,3),因此我們可以把我們的中斷處理函式的位址賦給vicxvectaddry暫存器,

比如我們有個函式

void key_handle()

我們把key_handle 函式的值賦給vic0vectaddr0(外部中斷0)

vic0vectaddr0 =key_handle;

當外部中斷0觸發中斷時,cpu會自動的將vic0vectaddr0的值賦給vic0address,並跳轉到這個位址去執行,即執行函式key_handle。

**如下:

start.s

[cpp]view plain

copy

.global _start                  

/* 宣告乙個全域性的標號 */

.global key_isr  

_start:  

/* 設定棧,以呼叫c函式 */

ldr sp, =0x40000000       

/* 開總中斷 */

mrs r0, cpsr  

bic r0, r0, #0x00000080     /* 清楚第7位,irq中斷禁止位,寫0使能irq */

msr cpsr, r0  

bl main                     /* 跳轉到c函式去執行 */

halt:  

b halt  

key_isr:  

** 這是這條剛要執行的指令的位址剛好=pc-4 */

sub lr, lr, #4  

stmfd sp!,      /* 保護現場 */

bl key_handle  

/* 恢復現場 */

ldmfd sp!, ^    /* ^表示把spsr恢復到cpsr */

key.c

[cpp]view plain

copy

#define gpc0con             *((volatile unsigned int *)0xe0200060)

#define gpc0dat             *((volatile unsigned int *)0xe0200064)

#define gph0con             *((volatile unsigned int *)0xe0200c00)

#define gph0dat             *((volatile unsigned int *)0xe0200c04)

#define ext_int_0_con       *((volatile unsigned int *)0xe0200e00)

#define ext_int_0_mask      *((volatile unsigned int *)0xe0200f00)

#define vic0intselect       *((volatile unsigned int *)0xf200000c)

#define vic0intenable       *((volatile unsigned int *)0xf2000010)

#define vic0vectaddr0       *((volatile unsigned int *)0xf2000100)

#define vic0vectaddr1       *((volatile unsigned int *)0xf2000104)

#define vic0address         *((volatile unsigned int *)0xf2000f00)

#define ext_int_0_pend      *((volatile unsigned int *)0xe0200f40)

extern

void

key_isr(

void

);  

void

key_handle()  

intmain()    

makefile

[cpp]view plain

copy

key.bin: start.o key.o  

arm-linux-ld -ttext 0x20000000 -o key.elf $^  

arm-linux-objcopy -o binary key.elf $@  

arm-linux-objdump -d key.elf > key.dis  

key.o : key.c  

arm-linux-gcc -c $

start.o : start.s  

arm-linux-gcc -c $

clean:  

rm *.o *.elf *.bin *.dis  

按下key1,led1點亮,再次按下key1,led1熄滅

按下key2,led2點亮,再次按下key2,led2熄滅

TQ210裸機程式設計 4 按鍵(中斷法)

s5pv210有4個向量中斷控制器 vic 每個向量中斷控制器包含32個中斷源。當某個中斷源產生中斷時,cpu會自動的將vicxvectaddry x 0,1,2,3,y 0 31 暫存器的值賦給vicxaddress x 0,1,2,3 因此我們可以把我們的中斷處理函式的位址賦給vicxvecta...

TQ210裸機程式設計 3 按鍵(查詢法)

首先檢視tq210的底板原理圖 這次程式設計只操作key1和key2,在tq210核心板原理圖中搜尋xeint0 可以看出key1和key2分別接在s5pv210的gph0 0和gph0 1引腳。這次程式設計使用查詢法,需要設定這兩個引腳為輸入模式,然後迴圈讀取引腳狀態,當使用者按下按鍵時,對應引腳...

TQ210裸機程式設計 3 按鍵(查詢法)

首先檢視tq210的底板原理圖 這次程式設計只操作key1和key2,在tq210核心板原理圖中搜尋xeint0 可以看出key1和key2分別接在s5pv210的gph0 0和gph0 1引腳。這次程式設計使用查詢法,需要設定這兩個引腳為輸入模式,然後迴圈讀取引腳狀態,當使用者按下按鍵時,對應引腳...