生活随笔
收集整理的這篇文章主要介紹了
TQ210裸机编程(4)——按键(中断法)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
S5PV210有4個向量中斷控制器(VIC),每個向量中斷控制器包含32個中斷源。
當某個中斷源產(chǎn)生中斷時,CPU會自動的將VICxVECTADDRy(x=0,1,2,3,y=0-31)寄存器的值賦給VICxADDRESS(x=0,1,2,3),因此我們可以把我們的中斷處理函數(shù)的地址賦給VICxVECTADDRy寄存器,
比如我們有個函數(shù)
void key_handle()
{?? ?
……
}
我們把key_handle?函數(shù)的值賦給VIC0VECTADDR0(外部中斷0)
VIC0VECTADDR0?=key_handle;
當外部中斷0觸發(fā)中斷時,CPU會自動的將VIC0VECTADDR0的值賦給VIC0ADDRESS,并跳轉(zhuǎn)到這個地址去執(zhí)行,即執(zhí)行函數(shù)key_handle。
代碼如下:
start.S
[cpp]?view plaincopy
.global?_start???????????????????? .global?key_isr?? _start:?? ?????? ????ldr?sp,?=0x40000000??????? ?? ?????? ????mrs?r0,?cpsr?? ????bic?r0,?r0,?#0x00000080??????? ????msr?cpsr,?r0?? ?? ????bl?main??????????????????????? ?? halt:?? ????b?halt?? ?? key_isr:?? ????? ?? ????sub?lr,?lr,?#4?? ????stmfd?sp!,?{r0-r12,?lr}??????? ????bl?key_handle?? ?????? ????ldmfd?sp!,?{r0-r12,?pc}^??????
key.c
[cpp]?view plaincopy
#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()?? {????? ????volatile?unsigned?char?key_code?=?EXT_INT_0_PEND?&?0x3;?? ?????? ????VIC0ADDRESS?=?0;?????????? ????EXT_INT_0_PEND?|=?3;?????? ?????? ????if?(key_code?==?1)???????? ????????GPC0DAT?^=?1?<<?3;?????? ????else?if?(key_code?==?2)??? ????????GPC0DAT?^=?1?<<?4;?????? }?? ?? int?main()?? {?? ????GPC0CON?&=?~(0xFF?<<?12);?? ????GPC0CON?|=?0x11?<<?12;?????????????????????? ????GPH0CON?|=?0xFF?<<?0;??????????????????? ?????? ????EXT_INT_0_CON?&=?~(0xFF?<<?0);?? ????EXT_INT_0_CON?|=?2?|?(2?<<?4);?????????????? ????EXT_INT_0_MASK?&=?~3;????????????????????? ?????? ????VIC0INTSELECT?&=?~3;?????????????????????? ?????? ????VIC0INTENABLE?|=?3;??????????????????????? ?????? ????VIC0VECTADDR0?=?(int)key_isr;???????????? ?? ????VIC0VECTADDR1?=?(int)key_isr;?? ?????? ????while?(1);?? ?????? ????return?0;?? }??
Makefile
[cpp]?view plaincopy
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??
將程序下載到內(nèi)存運行
按下key1,LED1點亮,再次按下key1,LED1熄滅
按下key2,LED2點亮,再次按下key2,LED2熄滅
總結(jié)
以上是生活随笔為你收集整理的TQ210裸机编程(4)——按键(中断法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。