do_irq.c
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
// 中断确认寄存器
// GICC_IAR [9:0] 获取中断ID
i = GICC->IAR & 0x3FF;
//下降沿挂起寄存器 清除中断挂起标志位
// EXTI_FPR1 - EXTI falling edge pending register
// rc_w1
// 读:0 中断触发
// 1 中断没有被触发
// 写: 0 不能清除中断挂起标志位
// 1 能清除中断挂起标志位
// key1 pf9 EXTI_FPR1[9]=1
// key2 pf7 EXTI_FPR1[7]=1
// key3 pf8 EXTI_FPR1[8]=1
// 中断清除挂起寄存器
// key1 pf9 ID 99 GICD_ICPENDR3[3] = 1
// key2 pf7 ID 97 GICD_ICPENDR3[1] = 1
// key3 pf8 ID 98 GICD_ICPENDR3[2] = 1
switch (i)
{
case 99:
printf("key1#####\n\r");
EXTI->FPR1 |= (0x1 << 9);
GICD->ICPENDR[3] |= (0x1 << 3);
break;
case 97:
printf("key2#####\n\r");
EXTI->FPR1 |= (0x1 << 7);
GICD->ICPENDR[3] |= (0x1 << 1);
break;
case 98:
printf("key3#####\n\r");
EXTI->FPR1 |= (0x1 << 8);
GICD->ICPENDR[3] |= (0x1 << 2);
break;
default:
break;
}
// 结束中断寄存器
// GICC_EOIR [9:0] = 中断ID
GICC->EOIR &= (~0x3ff);
GICC->EOIR |= i;
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
//EXTI控制器初始化
void hal_init_exti();
//GICD控制器初始化
void hal_init_gicd();
//GICC控制器初始化
void hal_init_gicc();
#endif
key.c
#include "key.h"
//EXTI控制器初始化
void hal_init_exti()
{
// RCC章节
// RCC_MP_AHB4ENSETR[5] = 1
RCC->MP_AHB4ENSETR |= (0x1 << 5);
// gpio组控制器
// 00: Input mode
// key1 pf9 GPIOF[19:18] = 00
// key2 pf7 GPIOF[15:14] = 00
// key3 pf8 GPIOF[17:16] = 00
GPIOF->MODER &= (~(0x3f << 14));
// EXTI
// 中断选择寄存器
// 0x05: PF[n] pin
// key1 pf9 EXTI_EXTICR3.EXTI9[15:8] = 0x05
EXTI->EXTICR3 &= (~(0xff << 8));
EXTI->EXTICR3 |= (0x05 << 8);
// key2 pf7 EXTI_EXTICR2.EXTI7[31:24] = 0x05
EXTI->EXTICR2 &= (~(0xff << 24));
EXTI->EXTICR2 |= (0x05 << 24);
// key3 pf8 EXTI_EXTICR3.EXTI8[7:0] = 0x05
EXTI->EXTICR3 &= (~(0xff << 0));
EXTI->EXTICR3 |= (0x05 << 0);
// 下降沿事件选择寄存器
// 1: Falling trigger enabled (for event and Interrupt) for input line.
// key1 pf9 EXTI_FTSR1[9]=1
// key2 pf7 EXTI_FTSR1[7]=1
// key3 pf8 EXTI_FTSR1[8]=1
EXTI->FTSR1 |= (0b111 << 7);
// 中断屏蔽寄存器
// 1: wakeup with interrupt request from Line x is unmasked
// key1 pf9 EXTI_IMR1[9]=1
// key2 pf7 EXTI_IMR1[7]=1
// key3 pf8 EXTI_IMR1[8]=1
EXTI->C1IMR1 |= (0b111 << 7);
}
//GICD控制器初始化
void hal_init_gicd()
{
// 控制寄存器
// GICD_CTLR[0]=1
GICD->CTRL |= 0X1;
// 中断设置使能寄存器
// key1 pf9 ID:99 GICD_ISENABLER3[3] = 1
// key2 pf7 ID:97 GICD_ISENABLER3[1] = 1
// key3 pf8 ID:98 GICD_ISENABLER3[2] = 1
GICD->ISENABLER[3] |= (0b111 << 1);
// 中断优先级寄存器
// key1 pf9 ID 99 GICD_IPRIORITYR24[31:27] = 11111
// key2 pf7 ID 97 GICD_IPRIORITYR24[15:11] = 11111
// key3 pf8 ID 98 GICD_IPRIORITYR24[23:19] = 11111
GICD->IPRIORITYR[24] &= (~(0b11111 << 11));
GICD->IPRIORITYR[24] &= (~(0b11111 << 19));
GICD->IPRIORITYR[24] &= (~(0b11111 << 27));
GICD->IPRIORITYR[24] |= (0b10000 << 27);
GICD->IPRIORITYR[24] |= (0b11100 << 11);
GICD->IPRIORITYR[24] |= (0b11000 << 19);
// 中断处理器目标寄存器
// key1 pf9 ID 99 GICD_ITARGETSR24[25:24] = 0b01
// key2 pf7 ID 97 GICD_ITARGETSR24[9:8] = 0b01
// key3 pf8 ID 98 GICD_ITARGETSR24[17:16] = 0b01
GICD->ITARGETSR[24] &= (~(0b11 << 8));
GICD->ITARGETSR[24] &= (~(0b11 << 16));
GICD->ITARGETSR[24] &= (~(0b11 << 24));
//分配给cpu0
GICD->ITARGETSR[24] |= (0b01 << 24);
GICD->ITARGETSR[24] |= (0b01 << 8);
GICD->ITARGETSR[24] |= (0b01 << 16);
}
//GICC控制器初始化
void hal_init_gicc()
{
// 控制寄存器
// GICC_CTLR[0] = 1
GICC->CTRL |= 0x1;
// 输入优先级屏蔽寄存器
// 比GICD层中断寄存器值大
// GICC_PMR [7:3] = 0b11111
GICC->PMR &= (~(0b11111 << 3));
GICC->PMR |= (0b11111 << 3);
}
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++)
;
}
int main()
{
//EXTI控制器初始化
hal_init_exti();
//GICD控制器初始化
hal_init_gicd();
//GICC控制器初始化
hal_init_gicc();
while (1)
{
}
return 0;
}