.H
#ifndef __EX__H__
#define __EX__H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
//初始化引脚GPIOF
//初始化exti
void pf9_exti_init();//
void pf9_gicd_init();//
void pf9_gicc_init();//
#endif
ex.C
#include "ex.h"
void pf9_exti_init()
{
RCC->MP_AHB4ENSETR|=(0X1<<5);//使能gpiof
//设置gpio
GPIOF->MODER&=(~(0X3F<<14));//引脚f789为输入模式
//exti中断控制器与引脚连接PF9
EXTI->EXTICR3|=(0X5<<8);
EXTI->EXTICR3|=(0X5);
EXTI->EXTICR2|=(0X5<<24);
//检测中断时间为下降沿触发
EXTI->FTSR1|=(0X7<<7);
//中断号设置为不屏蔽
EXTI->C1IMR1|=(0X7<<7);
}
void pf9_gicd_init()
{
GICD->CTRL|=0X1;//gicd层使能
//使能中断号
GICD->ISENABLER[3]|=(0X1<<1);//97
GICD->ISENABLER[3]|=(0X1<<2);//98
GICD->ISENABLER[3]|=(0X1<<3);//99
//设置中断优先级
GICD->IPRIORITYR[24]&=(~(0XFFFFFF)<<7);
GICD->IPRIORITYR[24]|=(0X7<<11);//5位优先级
GICD->IPRIORITYR[24]|=(0X7<<19);
GICD->IPRIORITYR[24]|=(0X7<<27);
//分配目标处理器
GICD->ITARGETSR[24]&=(~(0X333<<8));
GICD->ITARGETSR[24]|=(0X1<<8);//cpu0
GICD->ITARGETSR[24]|=(0X1<<16);//cpu0
GICD->ITARGETSR[24]|=(0X1<<24);//cpu0
}
void pf9_gicc_init()
{
GICC->CTRL|=0X1;//使能gicc层
GICC->PMR|=(0X1F<<3);//设置屏蔽寄存器优先级 越低越高
}
do_irq.c
#include "ex.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
extern void delay_ms(int ms);
unsigned int num=0;
void do_irq(void)
{
num=(GICC->IAR&=(0XFFFF));//检测中断号是否产生
//根据中断号执行函数
switch(num)
{
case 97:
delay_ms(500);
printf("key1########");
GICD->ICPENDR[3]&=(~(0X1)<<1);//清除中断挂起
EXTI->FPR1|=(0X1<<7);//清除中断挂起标志位
break;
case 98:
delay_ms(500);
printf("key2########");
GICD->ICPENDR[3]&=(~(0X1)<<2);//清除中断挂起
EXTI->FPR1|=(0X1<<8);//清除中断挂起标志位
//清除中断挂起
//清除中断挂起标志位
break;
case 99:
delay_ms(500);
printf("key3########");
GICD->ICPENDR[3]&=(~(0X1)<<3);//清除中断挂起//不清除会一直发送中断信号给gicc层
//EXTI->FPR1|=(0X1<<9);//清除中断挂起标志位//不清除会一直发送中断信号给gicd层
//清除中断挂起
//清除中断挂起标志位
break;
}
GICC->EOIR&=(~(0X3FF));//清除中断号待测试
GICC->EOIR|=num;//此寄存器是的cpu的中断被释放,其他中断号因此可以被cpu处理
}
main.c
#include "ex.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()
{
pf9_exti_init();
pf9_gicd_init();
pf9_gicc_init();
while(1)
{
}
return 0;
}