
配置GPIO口為輸入/中斷
- 使能GPIO口(從CCM里面找)
- 將該口設置工作在GPIO功能下(從MUX里面找)
- 選擇該口為輸入/輸出,中斷需要其工作在中斷/輸入模式下。
配置GPIO作為中斷的觸發(fā)方式
芯片手冊的GPIOx部分,可以設置其高電平/低電平/上升沿/下降沿/雙邊沿觸發(fā)。
清零中斷狀態(tài)
為防止先前留有其他的中斷狀態(tài)產生干擾,先對中斷狀態(tài)進行清除,置位ISR寄存器清除GPIO,并調用clear_gic_irq()
函數清除GIC。
控制GPIO與GIC使能中斷
- 需要在GPIO_IMR寄存器中設置使能,否則該使能位默認置0屏蔽。
- 需要利用gic_enable_irq函數使能gic使其工作在irq狀態(tài)下。(函數輸入的中斷號從芯片手冊找)
CPU中斷使能
CPU的CPSR寄存器中有一位:I位,用來使能/禁止中斷
可以使用以下匯編指令修改I位:
CPSIE I ; //清除I位,使能中斷
CPSID I ; //設置I位,禁止中斷
將CPSIE I ;
這一行加入start.s中,放在main函數調用前。
start.s函數改寫
加入do_irq函數的定義文章來源:http://www.zghlxwxcb.cn/news/detail-687781.html
do_irq:
/* 設置SP_irq */
ldr sp, =STACK_BASE - STACK_SIZE - STACK_SIZE - STACK_SIZE
/* 保存現場 */
subs lr, lr, #4
stmdb sp!, {R0-R3,R12,LR}
/* 調用處理函數 */
bl do_irq_c
/* 恢復現場 */
ldmia sp!, {R0-R3,R12,PC}^
在_start函數中加入:ldr PC, =do_irq;
以將其加入調用文章來源地址http://www.zghlxwxcb.cn/news/detail-687781.html
寫處理函數
void do_irq_c(void)
{
int irq;
GPIO_Type *gpio4 = (GPIO_Type *)0x020A8000;
/* 1. 分辨中斷 */
irq = get_gic_irq();
/* 2. 調用處理函數 */
if (irq == IRQ_GPIO4_0_15)
{
if (gpio4->DR & (1<<14)) puts("KEY2 pressed!\n\r");
else puts("KEY2 released!\n\r");
gpio4->ISR |= (1<<14);//清除中斷源頭GPIO
}
/* 3. 清除中斷 */
clear_gic_irq(irq);//清除中斷控制器gic
}
到了這里,關于Linux學習_GPIO中斷編程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!