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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ARM——cortex-A7核 按键中断实验

發布時間:2024/1/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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核 按键中断实验的全部內容,希望文章能夠幫你解決所遇到的問題。

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