do_irq.c
#include "../include/key.h"
extern void printf(const char *fmt,...);
extern void delay_ms(int ms);
void do_irq(void)
{
unsigned int i=0;
i=GICC->IAR&0x3FF;
//key1触发中断
if(i==99)
{
delay_ms(500);
printf("*****key1*****\n");
//清除EXTI被挂起的标志位
EXTI->FPR1|=(0x1<<9);
//清除GCID层被挂起的标志位
GICD->ISENABLER[3]|=(0x1<<3);
}
//key2触发中断
else if(i==97)
{
delay_ms(500);
printf("*****key2****\n");
EXTI->FPR1|=(0x1<<7);
GICD->ISENABLER[3]|=(0x1<<1);
}
//key3触发中断
else if(i==98)
{
delay_ms(500);
printf("*****key3****\n");
EXTI->FPR1|=(0x1<<8);
GICD->ISENABLER[3]|=(0x1<<2);
}
//清除中断号
GICC->EOIR&=(~(0xFF));
GICC->EOIR|=i;
}
main.c
#include "./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++);
}
int main()
{
//Rcc章节初始化
rcc_init();
//GPIO章节初始化
pF9_GPIO_init();
//EXTI章节初始化
pF9_EXTI_init();
//GICD章节初始化
pF9_GICD_init();
pF7_GPIO_init();
pF7_EXTI_init();
pF7_GICD_init();
pF8_GPIO_init();
pF8_EXTI_init();
pF8_GICD_init();
//GICC章节初始化
GICC_init();
while (1)
{
}
return 0;
}
key.c
#include "../include/key.h"
extern void delay_ms(int ms);
/***RCC章节初始化******/
void rcc_init()
{
//使能GPIOF控制器,其中EXTI和GIC控制器为系统自动使能
RCC->MP_AHB4ENSETR|=(0x1<<5);
}
/****GPIO章节初始化***/
void pF9_GPIO_init()
{
//设置PF9引脚为输入模式
GPIOF->MODER&=(~(0x3<<18));
}
void pF7_GPIO_init()
{
//设置PF7引脚为输入模式
GPIOF->MODER&=(~(0x3<<14));
}
void pF8_GPIO_init()
{
//设置Pf8引脚为输入模式
GPIOF->MODER&=(~(0x3<<16));
}
//EXTI章节初始化
void pF9_EXTI_init()
{
//选择pF9对应的EXTI9连接
EXTI->EXTICR3&=(~(0xFF<<8));
EXTI->EXTICR3|=(0x05<<8);
//下降沿选择寄存器(下降沿对于中断事件输入的使能)
EXTI->FTSR1|=(0x1<<9);
//设置中断不屏蔽
EXTI->C1IMR1|=(0x1<<9);
}
void pF7_EXTI_init()
{
//选择pF7对应的EXTI
EXTI->EXTICR2&=(~(0xFF<<24));
EXTI->EXTICR2|=(0x05<<24);
EXTI->FTSR1|=(0x1<<7);
EXTI->C1IMR1|=(0x1<<7);
}
void pF8_EXTI_init()
{
//选择pF8对应的EXTI
EXTI->EXTICR3&=(~(0xFF<<0));
EXTI->EXTICR3|=(0x05<<0);
EXTI->FTSR1|=(0x1<<8);
EXTI->C1IMR1|=(0x1<<8);
}
//GICD章节初始化
void pF9_GICD_init()
{
//使能GICD层
GICD->CTRL&=0x1;
//中断设置使能寄存器
GICD->ISENABLER[3]|=(0x1<<3);
//GICD层中断优先级设置
GICD->IPRIORITYR[24]|=(0x01<<27);
//GICD->IPRIORITYR[23]|=(0x1<<28);
//中断目标分配给cpu0
GICD->ITARGETSR[24]|=(0x01<<24);
}
void pF7_GICD_init()
{
//使能GICD层
GICD->CTRL&=0x1;
GICD->ISENABLER[3]|=(0x1<<1);
GICD->IPRIORITYR[24]|=(0x1<<11);
// GICD->IPRIORITYR[24]|=(0x1<<15);
GICD->ITARGETSR[24]|=(0x01<<8);
}
void pF8_GICD_init()
{
//使能GICD层
GICD->CTRL&=0x1;
GICD->ISENABLER[3]|=(0x1<<2);
GICD->IPRIORITYR[24]|=(0x1<<19);
// GICD->IPRIORITYR[23]|=(0x1<<23);
GICD->ITARGETSR[24]|=(0x01<<16);
}
//GICC章节初始化
void GICC_init()
{
//GICC层使能
GICC->CTRL|=0x1;
//设置GICC中断优先级屏蔽寄存器(5位)
GICC->PMR|=(0x2<<3);
}
//
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
//Rcc章节初始化
void rcc_init();
//GPIO章节初始化
void pF9_GPIO_init();
void pF7_GPIO_init();
void pF8_GPIO_init();
//EXTI章节初始化
void pF9_EXTI_init();
void pF7_EXTI_init();
void pF8_EXTI_init();
//GICD章节初始化
void pF9_GICD_init();
void pF7_GICD_init();
void pF8_GICD_init();
//GIC章节初始化
void GICC_init();
void do_irq(void);
#endif