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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

TQ210——按键(中断查询法)

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

TQ210——按鍵


?????? 底板上有8個獨立按鍵,可分別使用查詢法和中斷法控制按鍵。通過原理圖可知:按鍵按下,GPIO檢測到低電平,松開時高電平。

? ? ? ?直接查詢法程序的實現簡單,但是效率很低,CPU一直在查詢,啥事也干不了。中斷查詢法程序的實現較為復雜,但是效率高。

GPIO寄存器(GPH0CONGPH0DAT),外部中斷寄存器(EXT_INT_0_CONEXT_INT_0_MASK),中斷通道選擇(VIC0INTSELECT),中斷使能(VIC0INTENABLE),中斷向量地址(VIC0VECTADDR0VIC0VECTADDR1),清除中斷向量(EXT_INT_0_PEND

.global _start /*聲明一個全局的標號 */ .global key_isr _start:/* 設置棧,以調用c函數 */ldr sp, =0x40000000 /* 開總中斷 */mrs r0,cpsrbic r0,r0, #0x00000080 /* 清楚第7位,IRQ中斷禁止位,寫0使能IRQ */msr cpsr,r0bl main /* 跳轉到C函數去執行 */halt:b haltkey_isr:/* 計算返回地址:PC的值等于當前執行的地址+8,** 當CPU正要執行某條指令時(還未執行),被中斷,** 這是這條剛要執行的指令的地址剛好=PC-4 */sub lr,lr, #4stmfd sp!,{r0-r12, lr} /* 保護現場 */bl key_handle/* 恢復現場 */ldmfd sp!,{r0-r12, pc}^ /* ^表示把spsr恢復到cpsr */

#define GPC0CON *((volatileunsigned int *)0xE0200060) #define GPC0DAT *((volatileunsigned int *)0xE0200064)#define GPH0CON *((volatileunsigned int *)0xE0200C00) #define GPH0DAT *((volatileunsigned int *)0xE0200C04)#define EXT_INT_0_CON *((volatileunsigned int *)0xE0200E00) #define EXT_INT_0_MASK *((volatileunsigned int *)0xE0200F00)#define VIC0INTSELECT *((volatileunsigned int *)0xF200000C) #define VIC0INTENABLE *((volatileunsigned int *)0xF2000010)#define VIC0VECTADDR0 *((volatileunsigned int *)0xF2000100) #define VIC0VECTADDR1 *((volatileunsigned int *)0xF2000104)#define VIC0ADDRESS *((volatile unsigned int*)0xF2000F00)#define EXT_INT_0_PEND *((volatileunsigned int *)0xE0200F40)extern void key_isr(void);void key_handle() { volatileunsigned char key_code = EXT_INT_0_PEND & 0x03;VIC0ADDRESS= 0; /* 清中斷向量寄存器 */EXT_INT_0_PEND&= ~0x03; /* 清中斷掛起寄存器 */if(key_code == 1) /* key1 */{GPC0DAT&= ~(0x01 << 3); /* toggleLED1 */GPC0DAT|= 1 << 3; /* toggle LED1 */} else if(key_code == 2) /* key2 */{GPC0DAT&= ~(0x01 << 4); /* toggleLED1 */GPC0DAT|= 1 << 4; /* toggle LED1 */}}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] *//* 當EXT_INT[0]觸發中斷,即用戶按下key1時,** CPU就會自動的將VIC0VECTADDR0的值賦給VIC0ADDRESS并跳轉到這個地址去執 */VIC0VECTADDR0= (unsigned int)key_isr;VIC0VECTADDR1= (unsigned int)key_isr;while (1);return 0; }? ? ? 裸機編程編譯的時候一定要加16字節的頭信息,編譯生成的bin文件通過SD卡或者TFTP的方法下載到開發板。

總結

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

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