TQ210——按键(中断查询法)
生活随笔
收集整理的這篇文章主要介紹了
TQ210——按键(中断查询法)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
TQ210——按鍵
?????? 底板上有8個(gè)獨(dú)立按鍵,可分別使用查詢法和中斷法控制按鍵。通過(guò)原理圖可知:按鍵按下,GPIO檢測(cè)到低電平,松開(kāi)時(shí)高電平。
? ? ? ?直接查詢法程序的實(shí)現(xiàn)簡(jiǎn)單,但是效率很低,CPU一直在查詢,啥事也干不了。中斷查詢法程序的實(shí)現(xiàn)較為復(fù)雜,但是效率高。
GPIO寄存器(GPH0CON,GPH0DAT),外部中斷寄存器(EXT_INT_0_CON,EXT_INT_0_MASK),中斷通道選擇(VIC0INTSELECT),中斷使能(VIC0INTENABLE),中斷向量地址(VIC0VECTADDR0,VIC0VECTADDR1),清除中斷向量(EXT_INT_0_PEND)
.global _start /*聲明一個(gè)全局的標(biāo)號(hào) */ .global key_isr _start:/* 設(shè)置棧,以調(diào)用c函數(shù) */ldr sp, =0x40000000 /* 開(kāi)總中斷 */mrs r0,cpsrbic r0,r0, #0x00000080 /* 清楚第7位,IRQ中斷禁止位,寫(xiě)0使能IRQ */msr cpsr,r0bl main /* 跳轉(zhuǎn)到C函數(shù)去執(zhí)行 */halt:b haltkey_isr:/* 計(jì)算返回地址:PC的值等于當(dāng)前執(zhí)行的地址+8,** 當(dāng)CPU正要執(zhí)行某條指令時(shí)(還未執(zhí)行),被中斷,** 這是這條剛要執(zhí)行的指令的地址剛好=PC-4 */sub lr,lr, #4stmfd sp!,{r0-r12, lr} /* 保護(hù)現(xiàn)場(chǎng) */bl key_handle/* 恢復(fù)現(xiàn)場(chǎng) */ldmfd sp!,{r0-r12, pc}^ /* ^表示把spsr恢復(fù)到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]為下降沿觸發(fā) */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] *//* 當(dāng)EXT_INT[0]觸發(fā)中斷,即用戶按下key1時(shí),** CPU就會(huì)自動(dòng)的將VIC0VECTADDR0的值賦給VIC0ADDRESS并跳轉(zhuǎn)到這個(gè)地址去執(zhí) */VIC0VECTADDR0= (unsigned int)key_isr;VIC0VECTADDR1= (unsigned int)key_isr;while (1);return 0; }? ? ? 裸機(jī)編程編譯的時(shí)候一定要加16字節(jié)的頭信息,編譯生成的bin文件通過(guò)SD卡或者TFTP的方法下載到開(kāi)發(fā)板。總結(jié)
以上是生活随笔為你收集整理的TQ210——按键(中断查询法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现代控制理论(4)——李雅普诺夫稳定性理
- 下一篇: 直线方程求x坐标c语言,已知两点坐标,求