按下按键之后,打印一句话------>三个按键需要实现
key.h
#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
/*********KEY1---PF9**********/
//EXIT控制器初始化
void key1_exit_init();
//GICD控制器初始化
void key1_gicd_init();
//GICC控制器初始化
void key1_gicc_init();
/*********KEY2---PF7**********/
//EXIT控制器初始化
void key2_exit_init();
//GICD控制器初始化
void key2_gicd_init();
//GICC控制器初始化
void key2_gicc_init();
/*********KEY3---PF8**********/
//EXIT控制器初始化
void key3_exit_init();
//GICD控制器初始化
void key3_gicd_init();
//GICC控制器初始化
void key3_gicc_init();
#endif
key.c
#include "key.h"
/*********KEY1---PF9**********/
//EXIT控制器初始化
void key1_exit_init()
{
/*********KEY1 RCC章节**********/
//使能GPIOF
RCC->MP_AHB4ENSETR|=(0x1<<5);
/*********KEY1 GPIO章节**********/
GPIOF->MODER &=(~(0x3<<18));
/*********KEY1 EXIT章节**********/
//EXIT中断选择寄存器
EXTI->EXTICR3&=(~(0xFF<<8));
EXTI->EXTICR3|=(0x05<<8);
//EXIT_FTSR1寄存器
EXTI->FTSR1|=(0x1<<9);
//EXTI_IMR1寄存器
EXTI->C1IMR1|=(0x1<<9);
}
//GICD控制器初始化
void key1_gicd_init()
{
//GICD_CTLR寄存器
GICD->CTRL|=(0x1);
//GICD_ISENABLER0寄存器
GICD->ISENABLER[3]|=(0x1<<3);
//GICD_IPRIORITYRx寄存器
GICD->IPRIORITYR[24]&=(~(0x1F<<27));
GICD->IPRIORITYR[24]|=(0x1<<28);
//GICD_ICPENDRx寄存器
GICD->ITARGETSR[24]&=(~(0x3<<24));
GICD->ITARGETSR[24]|=(0x3<<24);
}
//GICC控制器初始化
void key1_gicc_init()
{
//GICC_CTLR寄存器
GICC->CTRL=(0x1);
//GICC_PMR寄存器
GICC->PMR&=(~(0x1F<<3));
GICC->PMR|=(0x1F<<3);
}
/*********KEY2---PF7**********/
//EXIT控制器初始化
void key2_exit_init()
{
/*********KEY2 RCC章节**********/
//使能GPIOF
RCC->MP_AHB4ENSETR|=(0x1<<5);
/*********KEY2 GPIO章节**********/
GPIOF->MODER &=(~(0x3<<14));
/*********KEY2 EXIT章节**********/
//EXIT中断选择寄存器
EXTI->EXTICR2&=(~(0xFF<<24));
EXTI->EXTICR2|=(0x5<<24);
//EXIT_FTSR1寄存器
EXTI->FTSR1|=(0x1<<7);
//EXTI_IMR1寄存器
EXTI->C1IMR1|=(0x1<<7);
}
//GICD控制器初始化
void key2_gicd_init()
{
//GICD_CTLR寄存器
GICD->CTRL|=(0x1);
//GICD_ISENABLER0寄存器
GICD->ISENABLER[3]|=(0x1<<1);
//GICD_IPRIORITYRx寄存器
GICD->IPRIORITYR[24]&=(~(0x1F<<11));
GICD->IPRIORITYR[24]|=(0x3<<11);
//GICD_ICPENDRx寄存器
GICD->ITARGETSR[24]&=(~(0x3<<8));
GICD->ITARGETSR[24]|=(0x3<<8);
}
//GICC控制器初始化
void key2_gicc_init()
{
//GICC_CTLR寄存器
GICC->CTRL=(0x1);
//GICC_PMR寄存器
GICC->PMR&=(~(0x1F<<3));
GICC->PMR|=(0x1F<<3);
}
/*********KEY3---PF8**********/
//EXIT控制器初始化
void key3_exit_init()
{
/*********KEY3 RCC章节**********/
//使能GPIOF
RCC->MP_AHB4ENSETR|=(0x1<<5);
/*********KEY3 GPIO章节**********/
GPIOF->MODER &=(~(0x3<<16));
/*********KEY3 EXIT章节**********/
//EXIT中断选择寄存器
EXTI->EXTICR3&=(~(0xFF));
EXTI->EXTICR3|=(0x5);
//EXIT_FTSR1寄存器
EXTI->FTSR1|=(0x1<<8);
//EXTI_IMR1寄存器
EXTI->C1IMR1 |= (0x1<<8);
}
//GICD控制器初始化
void key3_gicd_init()
{
//GICD_CTLR寄存器
GICD->CTRL|=(0x1);
//GICD_ISENABLER0寄存器
GICD->ISENABLER[3]|=(0x1<<2);
//GICD_IPRIORITYRx寄存器
GICD->IPRIORITYR[24]&=(~(0x1F<<19));
GICD->IPRIORITYR[24]|=(0x4<<19);
//GICD_ICPENDRx寄存器
GICD->ITARGETSR[24]&=(~(0x3<<16));
GICD->ITARGETSR[24]|=(0x3<<16);
}
//GICC控制器初始化
void key3_gicc_init()
{
//GICC_CTLR寄存器
GICC->CTRL=(0x1);
//GICC_PMR寄存器
GICC->PMR&=(~(0x1F<<3));
GICC->PMR|=(0x1F<<3);
}
do_irq.c
#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
//获取中断号
int num = 0;
num=GICC->IAR;
//判断中断号
if(num==97)
{
printf("key2:i am 2\n");
EXTI->FPR1|=(0x1<<7);
GICD->IPRIORITYR[3]|=(0x1<<1);
GICC->EOIR&=(~(0x3FF));
GICC->EOIR|=num;
}else if(num==98)
{
printf("key3:i am 3\n");
EXTI->FPR1|=(0x1<<8);
GICD->IPRIORITYR[3]|=(0x1<<2);
GICC->EOIR&=(~(0x3FF));
GICC->EOIR|=num;
}else if(num==99)
{
printf("key1:i am 1\n");
EXTI->FPR1|=(0x1<<9);
GICD->IPRIORITYR[3]|=(0x1<<3);
GICC->EOIR&=(~(0x3FF));
GICC->EOIR|=num;
}
}
main.c
#include "./include/key.h"
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
key1_exit_init();
key2_exit_init();
key3_exit_init();
key1_gicd_init();
key2_gicd_init();
key3_gicd_init();
key1_gicc_init();
key2_gicc_init();
key3_gicc_init();
while(1)
{
}
return 0;
}
执行结果