1.實驗?zāi)康模簩崿F(xiàn)KEY1/LEY2/KE3三個按鍵,中斷觸發(fā)打印一句話,并且燈的狀態(tài)取反;
key1 ----> LED3燈狀態(tài)取反;
key2 ----> LED2燈狀態(tài)取反;
key3 ----> LED1燈狀態(tài)取反;
2.分析框圖:
?3.代碼:
---key.h頭文件---
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
typedef enum
{
FALLING_TRI, //下降沿觸發(fā)方式
RISING_TRI, //上升沿觸發(fā)方式
}trigger_t;
//中斷RCC章節(jié)初始化 PF9 7 8
void hal_interrupt_rcc_init();
//EXTI初始化函數(shù)
//EXTI編號 GPIO組號 觸發(fā)方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix);
//GIC初始化函數(shù)
//中斷號,中斷優(yōu)先級
void hal_gic_init(unsigned int interruptx,unsigned int priority);
//led初始化函數(shù)
void led_init(gpio_t* gpiox,unsigned int pin);
#endif
---key.c函數(shù)實現(xiàn)---
#include "key.h"
//中斷RCC章節(jié)初始化 PF9 7 8
void hal_interrupt_rcc_init()
{
//RCC章節(jié)初始化 PF9 [5]=1
RCC->MP_AHB4ENSETR |= (0x1 << 5);
}
//EXTI初始化函數(shù)
//EXTI編號 GPIO組號 觸發(fā)方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix)
{
//GPIO章節(jié)初始化 設(shè)置三個按鍵為輸入模式
GPIOF->MODER &= (~(0x3 << 2*extix));
//EXTI章節(jié)初始化,引腳信號與EXTI連接
//1.EXIT_EXTICR組 0x05
EXTI->EXTICR[extix/4] &= (~(0xff << ((extix%4)*8)));
EXTI->EXTICR[extix/4] |= (groupx << ((extix%4)*8));
//2.EXTI_FTSR1 設(shè)置下降沿觸發(fā)方式
if(trix == FALLING_TRI)
EXTI->FTSR1 |= (0x1 << extix);
else
EXTI->RTSR1 |= (0x1 << extix);
//3.EXTI_IMR1 設(shè)置中斷不屏蔽 =1
EXTI->C1IMR1 |= (0x1 << extix);
}
//GIC初始化函數(shù)
//中斷號,中斷優(yōu)先級
void hal_gic_init(unsigned int interruptx,unsigned int priority)
{
//GICD初始化
//1.GICD_CTRL 使能組0 [0]=1
GICD->CTRL |= (0x1 << 0);
//2.GICD_ISENABLER組 設(shè)置GICD層中斷使能
GICD->ISENABLER[interruptx/32] |= (0x1 << (interruptx % 32));
//3.GICD_IPRIORITYR組 設(shè)置中斷優(yōu)先級 操作高5位
GICD->IPRIORITYR[interruptx/4] &= (~(0x1f << (interruptx % 4 * 8 + 3)));
GICD->IPRIORITYR[interruptx/4] |= (priority << (interruptx % 4 * 8 + 3));
//4.GICD_ITARGETSR組 設(shè)置中斷目標(biāo)分配給CPU0
GICD->ITARGETSR[interruptx/4] &= (~(0x3 << (interruptx % 4 * 8)));
GICD->ITARGETSR[interruptx/4] |= (0x1 << (interruptx % 4 * 8));
//GICC初始化
//1.GICC_CTRL 設(shè)置GICC層組0使能 [0]=1
GICC->CTRL |= (0x1 << 0);
//2.GICC_PMR 設(shè)置GICC層中斷優(yōu)先級
GICC->PMR |= ((priority+1) << 3);
}
//led燈初始化
//參數(shù)1:GPIO組號
//參數(shù)2:引腳編號
void led_init(gpio_t* gpiox,unsigned int pin)
{
//1輸出模式
gpiox->MODER &= ~(0x3 << (pin*2));
gpiox->MODER |= (0x1 << (pin*2));
//2輸出類型
gpiox->OTYPER &= (~(0x1 << pin));
//3輸出速率
gpiox->OSPEEDR &= ~(0x3 << (pin*2));
//4拉電阻
gpiox->PUPDR &= ~(0x3 << (pin*2));
}
---do_irq.c終端處理函數(shù)---
#include "key.h"
extern void printf(const char *fmt, ...);
//中斷處理函數(shù)
void do_irq(void)
{
//1獲取中斷號 IAR[9:0]
unsigned int num = 0;
num = GICC->IAR & 0x3ff;
//2判斷中斷號,并且打印一句話
switch(num)
{
case 99:
printf("KEY1按鍵中斷,LED3燈取反\n");
//led3燈狀態(tài)取反
GPIOE->ODR ^= (0x1 << 8);
//3清除EXTI層中斷掛起標(biāo)志位 [9]=1
//EXTI_FDR1 [9]=1
EXTI->FPR1 |= (0x1 << 9);
//4清除GICD層中斷掛起標(biāo)志位
//GICD_ICPENDR3 [3]=1
GICD->ICPENDR[3] |= (0x1 << 3);
break;
case 97:
printf("KEY2按鍵中斷,LED2燈取反\n");
//led2燈狀態(tài)取反
GPIOF->ODR ^= (0x1 << 10);
//清除EXTI層中斷掛起標(biāo)志位 [9]=1
EXTI->FPR1 |= (0x1 << 7);
GICD->ICPENDR[3] |= (0x1 << 1);
break;
case 98:
printf("KEY3按鍵中斷,LED1燈取反\n");
//led1燈狀態(tài)取反
GPIOE->ODR ^= (0x1 << 10);
EXTI->FPR1 |= (0x1 << 8);
GICD->ICPENDR[3] |= (0x1 << 2);
break;
}
//5清楚獲取到的中斷號
GICC->EOIR = num;
}
---main.c測試文件---
#include "key.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
#define GPIO_PIN10 10 //引腳編號
#define GPIO_PIN8 8
#define EXTI9 9 //EXTI編號
#define EXTI7 7
#define EXTI8 8
#define GPIOF_GROUP 0x05 //GPIOF組號
#define KEY1_ID 99 //中斷號
#define KEY2_ID 97
#define KEY3_ID 98
#define KEY1_PRIORITY 9 //中斷優(yōu)先級
#define KEY2_PRIORITY 7
#define KEY3_PRIORITY 8
int main()
{
//使能三盞燈PE10 PF10 PE8
RCC->MP_AHB4ENSETR |= (0x3 << 4);
//led初始化函數(shù)
led_init(GPIOE,GPIO_PIN10);
led_init(GPIOF,GPIO_PIN10);
led_init(GPIOE,GPIO_PIN8);
//中斷RCC章節(jié)初始化 PF9 7 8
hal_interrupt_rcc_init();
//EXTI初始化函數(shù)
hal_exti_init(EXTI9,GPIOF_GROUP,FALLING_TRI);
hal_exti_init(EXTI7,GPIOF_GROUP,FALLING_TRI);
hal_exti_init(EXTI8,GPIOF_GROUP,FALLING_TRI);
//GIC初始化函數(shù)
hal_gic_init(KEY1_ID,KEY1_PRIORITY);
hal_gic_init(KEY2_ID,KEY2_PRIORITY);
hal_gic_init(KEY3_ID,KEY3_PRIORITY);
while(1)
{
}
return 0;
}
4.實驗現(xiàn)象:?
文章來源:http://www.zghlxwxcb.cn/news/detail-674628.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-674628.html
到了這里,關(guān)于ARM開發(fā),stm32mp157a-A7核中斷實驗(實現(xiàn)按鍵中斷功能)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!