头文件:
#ifndef __GPIO_H__
#define __GPIO_H__
//#include "../common/include/ctype.h"
#include "../common/include/stm32mp1xx_adc.h"
#include "../common/include/stm32mp1xx_gic.h"
#include "../common/include/stm32mp1xx_i2c.h"
#include "../common/include/stm32mp1xx_spi.h"
#include "../common/include/stm32mp1xx_uart.h"
#include "../common/include/stdarg.h"
#include "../common/include/stm32mp1xx_exti.h"
#include "../common/include/stm32mp1xx_gpio.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_tim.h"
#include "../common/include/uart.h"
#include "../include/key.h"
//初始化GPIO章节
void hal_gpio_init();
//初始化RCC章节
void hal_rcc_init();
#endif
功能文件1(key.c):
#include "key.h"
//初始化RCC章节
void hal_rcc_init()
{
(RCC->MP_AHB4ENSETR)|=(0x1<<5);
}
//初始化GPIO章节
void hal_gpio_init()
{
(GPIOF->MODER)&=(~(0x3<<18));
}
//初始化EXTI章节
void hal_exti_init()
{
//1.设置外部中断选择寄存器
(EXTI->EXTICR3)&=(~(0xff<<8));
(EXTI->EXTICR3)|=(0x05<<8);
//2.设置下降沿事件选择寄存器
(EXTI->FTSR1)|=(0x1<<9);
//3.设置中断屏蔽寄存器
(EXTI->C1IMR1)|=(0x1<<9);
}
//初始化GICD章节
void hal_gicd_init()
{
//1.使能GICD层
(GICD->CTRL)|=(0x1<<0);
//2.中断设置使能寄存器
(GICD->ISENABLER[3])|=(0x1<<3);
//3.设置中断优先级
(GICD->IPRIORITYR[24])&=(~(0x1f<<27));
//(GICD->IPRIORITYR[24])|=(0x5<<27);
//4.设置中断目标分配寄存器
(GICD->ITARGETSR[24])&=(~(0x3<<24));
(GICD->ITARGETSR[24])|=(0x1<<24);
}
//初始化GICC章节
void hal_gicc_init()
{
//1.使能GICC层中断
(GICC->CTRL)|=(0x1<<0);
//2.设置GICC层中断优先级屏蔽寄存器
(GICC->PMR)&=(~(0x1f<<3));
(GICC->PMR)|=(0x1f<<3);
}
功能文件2(do_irq.c):
#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
void do_irq(void)
{
unsigned int num=0;
//获取中断号,定义一个num变量接收中断号
num=(GICC->IAR & 0x3ff);
switch(num)
{
case 97:
break;
case 98:
break;
case 99:
//打印一句话
printf("hello world");
delay_ms(500);
//清除EXTI中挂起标志位
(EXTI->FPR1)|=(0x1<<9);
//清除GICD层中断挂起标志位
(GICD->ICPENDR[3])|=(0x1<<3);
break;
}
//清除中断号
(GICC->EOIR)=num;
}
测试文件:
#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()
{
hal_rcc_init();
hal_gpio_init();
hal_exti_init();
hal_gicd_init();
hal_gicc_init();
while(1)
{
};
return 0;
}