按钮中断
头文件
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_rcc.h"
//key1->pf9
//初始化RCC和GPIO章节
void hal_gpio_key1(void);
//初始化EXTI章节
void hal_key1_exti_it(void);
//初始化GICD章节
void hal_key1_gicd_it(void);
//初始化GICC章节
void hal_key1_gicc_it(void);
#endif
源文件
#include "key.h"
//初始化RCC和GPIO章节
void hal_gpio_key1(void)
{
//使能
RCC->MP_AHB4ENSETR |= (0x1<<5);
//key1
GPIOF->MODER &= (~(0x3<<18));
//key2
GPIOF->MODER &= (~(0x3<<14));
//key3
GPIOF->MODER &= (~(0x3<<16));
}
//初始化EXTI章节
void hal_key1_exti_it(void)
{
//**************************key1**********************
//选择GPIO接口和哪个EXTI控制器连接
EXTI->EXTICR3 &= (~(0xff<<8));
EXTI->EXTICR3 |= (0x5<<8);
//中断下降沿触发方式
EXTI->FTSR1 |= (0x1<<9);
//中断屏蔽寄存器
EXTI->C1IMR1 |= (0x1<<9);
//**************************key2**********************
//选择GPIO接口和哪个EXTI控制器连接
EXTI->EXTICR2 &= (~(0xff<<24));
EXTI->EXTICR2 |= (0x5<<24);
//中断下降沿触发方式
EXTI->FTSR1 |= (0x1<<7);
//中断屏蔽寄存器
EXTI->C1IMR1 |= (0x1<<7);
//**************************key3**********************
//选择GPIO接口和哪个EXTI控制器连接
EXTI->EXTICR3 &= (~(0xff));
EXTI->EXTICR3 |= (0x5);
//中断下降沿触发方式
EXTI->FTSR1 |= (0x1<<8);
//中断屏蔽寄存器
EXTI->C1IMR1 |= (0x1<<8);
}
//初始化GICD章节
void hal_key1_gicd_it(void)
{
//**************************key1**********************
//中断设置使能寄存器
GICD->ISENABLER[3] |= (0x1<<3);
//中断优先级寄存器
GICD->IPRIORITYR[24] &= (~(0xf<<27));
GICD->IPRIORITYR[24] |= (0xf<<27);
//中断目标分配寄存器
GICD->ITARGETSR[24] &= (~(0x3<<24));
GICD->ITARGETSR[24] |= (0x1<<24);
//GICD控制寄存器
GICD->CTRL |= (0x1);
//**************************key2**********************
//中断设置使能寄存器
GICD->ISENABLER[3] |= (0x1<<1);
//中断优先级寄存器
GICD->ITARGETSR[24] &= (~(0x3<<8));
GICD->ITARGETSR[24] |= (0xa<<8);
//中断目标分配寄存器
GICD->ITARGETSR[24] &= (~(0x3<<8));
GICD->ITARGETSR[24] |= (0x1<<8);
//GICD控制寄存器
GICD->CTRL |= (0x1);
//**************************key3**********************
//中断设置使能寄存器
GICD->ISENABLER[3] |= (0x1<<2);
//中断优先级寄存器
GICD->ITARGETSR[24] &= (~(0x3<<16));
GICD->ITARGETSR[24] |= (0x1<<16);
//中断目标分配寄存器
GICD->ITARGETSR[24] &= (~(0x3<<16));
GICD->ITARGETSR[24] |= (0x1<<16);
//GICD控制寄存器
GICD->CTRL |= (0x1);
}
//初始化GICC章节
void hal_key1_gicc_it(void)
{
//设置GICC层中断优先级的值
GICC->PMR |= (0xf<<3);
//中断全局使能
GICC->CTRL |= 0x1;
}
main
#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_gpio_key1();
hal_key1_exti_it();
hal_key1_gicd_it();
hal_key1_gicc_it();
printf("11211213412\n");
while(1)
{
}
return 0;
}
中断处理文件
#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
//获取中断号
int a = (GICC->IAR & 0x3ff);
//判断中断号
switch(a)
{
case 99:printf("KEY1!!!!!!!\n");
EXTI->FPR1 |= (0x1<<9);
GICD->ICPENDR[3] |= (0x1<<3);
break;
case 97:printf("KEY2!!!!!!!\n");
EXTI->FPR1 |= (0x1<<7);
GICD->ICPENDR[3] |= (0x1<<1);
break;
case 98:printf("KEY3!!!!!!!\n");
EXTI->FPR1 |= (0x1<<8);
GICD->ICPENDR[3] |= (0x1<<2);
break;
default:break;
}
//清除中断挂起标志位,清除中断号
GICC->EOIR = a;
}