ARM——cortex-A7核 按键中断实验
生活随笔
收集整理的這篇文章主要介紹了
ARM——cortex-A7核 按键中断实验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
控制按鍵key1、2、3,實現,按下按鈕時,串口工具內輸出對應按鍵名
本開發板為:stm32mp157
查找芯片手冊得:key1、2、3的引腳分別對應PF9、PF7、PF8。
以Key1為例:
PF9對應GPIOF寄存器,用RCC寄存器使能,再設置為輸入模式。
以下歸屬于函數:void pf9_exti_init();
//使能GPIOFRCC->MP_AHB4ENSETR = (0x1 << 5);/*****GPIO章節初始化*****///設置PF9引腳為輸入模式//GPIOF_MODER[19:18] = 0b00GPIOF->MODER &= (~(0x3 << 18));?
設置PF9與EXTI9連接,這樣才能把信號傳遞進去
/*******EXTI章節初始化********///1.設置PF9引腳和EXTI9控制器進行鏈接//EXIT_EXTICR3[15:8] = 0x05EXTI->EXTICR3 &= (~(0xff << 8)); //清零EXTI->EXTICR3 |= (0x05 << 8); //置1因為我們采取的是按下按鈕響應,所以要監控下降沿
//2.設置PF9引腳檢測方式為下降沿//EXTI_FTSR1[9] = 0x01EXTI->FTSR1 |= (0x1 << 9); //3.設置PF9引腳中斷不屏蔽//EXTI_IMR1[9] = 0x01EXTI->C1IMR1 |= (0x01 << 9);設置GIC部分,以下歸屬于函數:void pf9_gicd_init()?;
?初始化GICD
先設置全局中斷使能寄存器
GICD->CTRL |= (0X01 << 0);設置GICD層中斷使能寄存器
//EXTI9-->99號-->GICD_ISENABLER[3][3] = 1GICD->ISENABLER[3] |= (0x1 << 3);設置GICD層中斷優先級寄存器?
//99號中斷-->GICD_IPRIORITYR24[31:27] = 10 //數字隨意GICD->IPRIORITYR[24] &= (~(0x1F << 27)); //清零GICD->IPRIORITYR[24] |= (0x1 << 27);設置GICD層中斷目標分配器?
//99號中斷 --> 99/4 = 24....3 --> GICD_ITARGETSR24[25:24] = 0bx1(x代表0、1任意值)GICD->ITARGETSR[24] &= (~(0x3 << 24));GICD->ITARGETSR[24] |= (0x1 << 24);?設置GICC層,以下歸屬于函數:void pf9_gicc_init();
//設置GICC層全局中斷使能寄存器GICC->CTRL |= (0x1 << 0);//設置GICC層中斷優先級寄存器GICC->PMR &= (~(0x1F << 3));GICC->PMR |= (0xF << 3); //優先級設置為15這樣初始化要寫三個函數有點麻煩,于是把三個函數集成到另一個函數中
//包裹pf9 void PF9_init() {pf9_exti_init();pf9_gicd_init();pf9_gicc_init(); }在irq.c文件中,獲取中斷信號
//獲取中斷信號 unsigned int num = 0; num = GICC->IAR;調用switch選擇結構
case 99:delay_ms(500); //防按鍵抖動printf("key1######\n");//清除EXTI中斷掛起標志位EXTI->FPR1 |= (0x1 << 9);//清除GICD層中斷掛起標志位//key1-->PF9-->EXTI9-->事件9-->中斷號99//99 / 32 = 3...3GICD->ICPENDR[3] |= (0x1 << 3);break;在選擇結構外,清除中斷信號
//清除中斷信號GICC->EOIR &= (~(0x3FF << 0));GICC->EOIR |= num;附上完整代碼,
尤其要注意,由于該板的問題,key2和key1、3部分寄存器不在同一個。比如 EXIT_EXTICRx 寄存器,key1、3是EXIT_EXTICR3,而key2是EXIT_EXTICR2,不要寫錯了。
頭文件
#ifndef __KEY_H__ #define __KEY_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gic.h"//初始化 /******KEY1----->PF9******/ //初始化EXTI層 void pf9_exti_init();//初始化GICD層 void pf9_gicd_init();//初始化GICC層 void pf9_gicc_init();//包裹pf9 void PF9_init();/******KEY2----->PF7******/ //初始化EXTI層 void pf7_exti_init();//初始化GICD層 void pf7_gicd_init();//初始化GICC層 void pf7_gicc_init();//包裹pf9 void PF7_init();/******KEY3----->PF9******/ //初始化EXTI層 void pf8_exti_init();//初始化GICD層 void pf8_gicd_init();//初始化GICC層 void pf8_gicc_init();//包裹pf8 void PF8_init();#endif功能函數:
#include "key.h"//初始化EXTI層 void pf9_exti_init() {/***********RCC初始化**************///使能GPIOFRCC->MP_AHB4ENSETR = (0x1 << 5);/*****GPIO章節初始化*****///設置PF9引腳為輸入模式//GPIOF_MODER[19:18] = 0b00GPIOF->MODER &= (~(0x3 << 18));/*******EXTI章節初始化********///1.設置PF9引腳和EXTI9控制器進行鏈接//EXIT_EXTICR3[15:8] = 0x05EXTI->EXTICR3 &= (~(0xff << 8)); //清零EXTI->EXTICR3 |= (0x05 << 8); //置1//2.設置PF9引腳檢測方式為下降沿//EXTI_FTSR1[9] = 0x01EXTI->FTSR1 |= (0x1 << 9);//3.設置PF9引腳中斷不屏蔽//EXTI_IMR1[9] = 0x01EXTI->C1IMR1 |= (0x01 << 9); }//初始化GICD層 void pf9_gicd_init() {//設置GICD層全局中斷使能寄存器GICD->CTRL |= (0X01 << 0);//設置GICD層中斷使能寄存器//EXTI9-->99號-->GICD_ISENABLER[3][3] = 1GICD->ISENABLER[3] |= (0x1 << 3);//設置GICD層中斷優先級寄存器//99號中斷-->GICD_IPRIORITYR24[31:27] = 10 //數字隨意GICD->IPRIORITYR[24] &= (~(0x1F << 27)); //清零GICD->IPRIORITYR[24] |= (0x1 << 27);//設置GICD層中斷目標分配器//99號中斷 --> 99/4 = 24....3 --> GICD_ITARGETSR24[25:24] = 0bx1(x代表0、1任意值)GICD->ITARGETSR[24] &= (~(0x3 << 24));GICD->ITARGETSR[24] |= (0x1 << 24); }//初始化GICC void pf9_gicc_init() {//設置GICC層全局中斷使能寄存器GICC->CTRL |= (0x1 << 0);//設置GICC層中斷優先級寄存器GICC->PMR &= (~(0x1F << 3));GICC->PMR |= (0xF << 3); //優先級設置為15 }//初始化EXTI層 void pf7_exti_init() {/***********RCC初始化**************///使能GPIOF//RCC->MP_AHB4ENSETR = (0x1 << 5);/*****GPIO章節初始化*****///設置PF7引腳為輸入模式//GPIOF_MODER[15:14] = 0b00GPIOF->MODER &= (~(0x3 << 14));/*******EXTI章節初始化********///1.設置PF7引腳和EXTI控制器進行鏈接//EXIT_EXTICR2[31:24] = 0x05EXTI->EXTICR2 &= (~(0xff << 24)); //清零EXTI->EXTICR2 |= (0x05 << 24); //置1//2.設置PF7引腳檢測方式為下降沿//EXTI_FTSR1[7] = 0x01EXTI->FTSR1 |= (0x1 << 7);//3.設置PF7引腳中斷不屏蔽//EXTI_IMR1[7] = 0x01EXTI->C1IMR1 |= (0x01 << 7); }//初始化GICD層 void pf7_gicd_init() {//設置GICD層全局中斷使能寄存器//GICD->CTRL |= (0X01 << 0);//設置GICD層中斷使能寄存器//EXTI7-->97號-->GICD_ISENABLER[3][1] = 1GICD->ISENABLER[3] |= (0x1 << 1);//設置GICD層中斷優先級寄存器//99號中斷-->GICD_IPRIORITYR24[31:27] = 2 //數字隨意GICD->IPRIORITYR[24] &= (~(0x1F << 11)); //清零GICD->IPRIORITYR[24] |= (0x2 << 11);//設置GICD層中斷目標分配器//99號中斷 --> 97/4 = 24....1 --> GICD_ITARGETSR24[9:8] = 0bx1(x代表0、1任意值)GICD->ITARGETSR[24] &= (~(0x3 << 8));GICD->ITARGETSR[24] |= (0x1 << 8); }//初始化GICC void pf7_gicc_init() {//設置GICC層全局中斷使能寄存器//GICC->CTRL |= (0x1 << 0);//設置GICC層中斷優先級寄存器GICC->PMR &= (~(0x1F << 3));GICC->PMR |= (0x10 << 3); //優先級設置為15 }//初始化EXTI層 void pf8_exti_init() {/***********RCC初始化**************///使能GPIOF//RCC->MP_AHB4ENSETR = (0x1 << 5);/*****GPIO章節初始化*****///設置PF8引腳為輸入模式//GPIOF_MODER[17:16] = 0b00GPIOF->MODER &= (~(0x3 << 16));/*******EXTI章節初始化********///1.設置PF8引腳和EXTI8控制器進行鏈接//EXIT_EXTICR3[7:0] = 0x05EXTI->EXTICR3 &= (~(0xff << 0)); //清零EXTI->EXTICR3 |= (0x05 << 0); //置1//2.設置PF8引腳檢測方式為下降沿//EXTI_FTSR1[8] = 0x01EXTI->FTSR1 |= (0x1 << 8);//3.設置PF9引腳中斷不屏蔽//EXTI_IMR1[8] = 0x01EXTI->C1IMR1 |= (0x01 << 8); }//初始化GICD層 void pf8_gicd_init() {//設置GICD層全局中斷使能寄存器//GICD->CTRL |= (0X01 << 0);//設置GICD層中斷使能寄存器//EXTI8-->98號-->GICD_ISENABLER[3][2] = 1GICD->ISENABLER[3] |= (0x1 << 2);//設置GICD層中斷優先級寄存器//98號中斷-->GICD_IPRIORITYR24[23:19] = 3 //數字隨意GICD->IPRIORITYR[24] &= (~(0x1F << 27)); //清零GICD->IPRIORITYR[24] |= (0x3 << 27);//設置GICD層中斷目標分配器//98號中斷 --> 98/4 = 24....2 --> GICD_ITARGETSR24[17:16] = 0bx1(x代表0、1任意值)GICD->ITARGETSR[24] &= (~(0x3 << 16));GICD->ITARGETSR[24] |= (0x1 << 16); }//初始化GICC void pf8_gicc_init() {//設置GICC層全局中斷使能寄存器//GICC->CTRL |= (0x1 << 0);//設置GICC層中斷優先級寄存器GICC->PMR &= (~(0x1F << 3));GICC->PMR |= (0x11 << 3); //優先級設置為17 }//包裹pf9 void PF7_init() {pf7_exti_init();pf7_gicd_init();pf7_gicc_init(); }//包裹pf9 void PF8_init() {pf8_exti_init();pf8_gicd_init();pf8_gicc_init(); }//包裹pf9 void PF9_init() {pf9_exti_init();pf9_gicd_init();pf9_gicc_init(); }irq.c
#include "key.h"extern void delay_ms(int ms);extern void printf(const char *fmt, ...);//unsigned int i = 0; void do_irq(void) {unsigned int num = 0;//獲取中斷信號num = GICC->IAR;switch(num){case 97: delay_ms(500); //防按鍵抖動printf("key2######\n");//清除EXTI中斷掛起標志位EXTI->FPR1 |= (0x1 << 7);//清除GICD層中斷掛起標志位//key1-->PF9-->EXTI9-->事件9-->中斷號99//97 / 32 = 3...1GICD->ICPENDR[3] |= (0x1 << 1);break;case 98: delay_ms(500); //防按鍵抖動printf("key3######\n");//清除EXTI中斷掛起標志位EXTI->FPR1 |= (0x1 << 8);//清除GICD層中斷掛起標志位//key1-->PF9-->EXTI9-->事件9-->中斷號99//98 / 32 = 3...2GICD->ICPENDR[3] |= (0x1 << 2);break;case 99:delay_ms(500); //防按鍵抖動printf("key1######\n");//清除EXTI中斷掛起標志位EXTI->FPR1 |= (0x1 << 9);//清除GICD層中斷掛起標志位//key1-->PF9-->EXTI9-->事件9-->中斷號99//99 / 32 = 3...3GICD->ICPENDR[3] |= (0x1 << 3);break;}//清除中斷信號GICC->EOIR &= (~(0x3FF << 0));GICC->EOIR |= num; }總結
以上是生活随笔為你收集整理的ARM——cortex-A7核 按键中断实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: crm首页功能和用户登录
- 下一篇: FreeMarker模板使用方法讲解