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

2021-08-27 15:08:46 字數 2337 閱讀 6241

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

.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

#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()

int main()

makefile

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 $< -o $@

start.o : start.s

arm-linux-gcc -c $< -o $@

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引腳。這次程式設計使用查詢法,需要設定這兩個引腳為輸入模式,然後迴圈讀取引腳狀態,當使用者按下按鍵時,對應引腳...