日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TQ210裸机编程(4)——按键(中断法)

發布時間:2025/6/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TQ210裸机编程(4)——按键(中断法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 plaincopy
  • .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的值等于當前執行的地址+8,當CPU正要執行某條指令時(還未執行),被中斷,?
  • ????**?這是這條剛要執行的指令的地址剛好=PC-4?*/??
  • ????sub?lr,?lr,?#4??
  • ????stmfd?sp!,?{r0-r12,?lr}?????/*?保護現場?*/??
  • ????bl?key_handle??
  • ????/*?恢復現場?*/??
  • ????ldmfd?sp!,?{r0-r12,?pc}^????/*?^表示把spsr恢復到cpsr?*/??

  • 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)??????/*?key1?*/??
  • ????????GPC0DAT?^=?1?<<?3;????/*?toggle?LED1?*/??
  • ????else?if?(key_code?==?2)?/*?key2?*/??
  • ????????GPC0DAT?^=?1?<<?4;????/*?toggle?LED2?*/??
  • }??
  • ??
  • int?main()??
  • {??
  • ????GPC0CON?&=?~(0xFF?<<?12);??
  • ????GPC0CON?|=?0x11?<<?12;????????????????????/*?配置GPC0_3和GPC0_4為輸出:LED1和LED2?*/??
  • ????GPH0CON?|=?0xFF?<<?0;?????????????????/*?配置GPH0_0和GPH0_1為外部中斷:key1和key2?*/??
  • ??????
  • ????EXT_INT_0_CON?&=?~(0xFF?<<?0);??
  • ????EXT_INT_0_CON?|=?2?|?(2?<<?4);????????????/*?配置EXT_INT[0]和EXT_INT[1]為下降沿觸發?*/??
  • ????EXT_INT_0_MASK?&=?~3;???????????????????/*?取消屏蔽外部中斷EXT_INT[0]和EXT_INT[1]?*/??
  • ??????
  • ????VIC0INTSELECT?&=?~3;????????????????????/*?選擇外部中斷EXT_INT[0]和外部中斷EXT_INT[1]為IRQ類型的中斷?*/??
  • ??????
  • ????VIC0INTENABLE?|=?3;?????????????????????/*?使能外部中斷EXT_INT[0]和EXT_INT[1]?*/??
  • ??????
  • ????VIC0VECTADDR0?=?(int)key_isr;???????????/*?當EXT_INT[0]觸發中斷,即用戶按下key1時,?
  • ?????????????????????????????????????????????CPU就會自動的將VIC0VECTADDR0的值賦給VIC0ADDRESS并跳轉到這個地址去執?*/??
  • ????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??

  • 將程序下載到內存運行

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

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


    總結

    以上是生活随笔為你收集整理的TQ210裸机编程(4)——按键(中断法)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。