TQ210——按键(中断查询法)
生活随笔
收集整理的這篇文章主要介紹了
TQ210——按键(中断查询法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
TQ210——按鍵
?????? 底板上有8個獨立按鍵,可分別使用查詢法和中斷法控制按鍵。通過原理圖可知:按鍵按下,GPIO檢測到低電平,松開時高電平。
? ? ? ?直接查詢法程序的實現簡單,但是效率很低,CPU一直在查詢,啥事也干不了。中斷查詢法程序的實現較為復雜,但是效率高。
GPIO寄存器(GPH0CON,GPH0DAT),外部中斷寄存器(EXT_INT_0_CON,EXT_INT_0_MASK),中斷通道選擇(VIC0INTSELECT),中斷使能(VIC0INTENABLE),中斷向量地址(VIC0VECTADDR0,VIC0VECTADDR1),清除中斷向量(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——按键(中断查询法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代控制理论(4)——李雅普诺夫稳定性理
- 下一篇: 李雅普诺夫稳定性理论 matlab,李雅