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(){
//key1键盘
//EXIT控制器初始化
void PF9_exti_init();
//GICD控制器初始化
void PF9_gicd_init();
//gicc控制器初始化
void PF9_gicc_init();
//key2键盘
//EXIT控制器初始化
void PF7_exti_init();
//GICD控制器初始化
void PF7_gicd_init();
//gicc控制器初始化
void PF7_gicc_init();
//key3键盘
//EXIT控制器初始化
void PF8_exti_init();
//GICD控制器初始化
void PF8_gicd_init();
//gicc控制器初始化
void PH8_gicc_init();
while(1) {
}
return 0;
}
key.h:
#ifndef __KEY_h__
#define __KEY_h__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"
//key1键盘
//EXIT控制器初始化
void PF9_exti_init();
//GICD控制器初始化
void PF9_gicd_init();
//gicc控制器初始化
void PF9_gicc_init();
//key2键盘
//EXIT控制器初始化
void PF7_exti_init();
//GICD控制器初始化
void PF7_gicd_init();
//gicc控制器初始化
void PF7_gicc_init();
//key3键盘
//EXIT控制器初始化
void PF8_exti_init();
//GICD控制器初始化
void PF8_gicd_init();
//gicc控制器初始化
void PH8_gicc_init();
#endif
key.c:
#include "key.h"
//EXIT控制器初始化
void PF9_exit_init()
{
//------RCC章节-----------
RCC->MP_AHB4ENSETR |=0x01 << 5;
//-------输入模式--------------
//key1
GPIOF->MODER |=(~(0x03 << 18));
//初始化EXIT
EXTI->EXTICR3 &=(~(0xff << 8));
EXTI->EXTICR3 |=(0x05 << 8);
//编写事件
EXTI->FTSR1 |= 0x01 << 9;
EXTI->C1IMR1 |= 0x01 << 9;
}
void PF7_exit_init()
{
//------RCC章节-----------
RCC->MP_AHB4ENSETR |=0x01 << 5;
//-------输入模式--------------
//key1
GPIOF->MODER |=(~(0x03 << 14));
//初始化EXIT
EXTI->EXTICR3 &=(~(0xff << 24));
EXTI->EXTICR3 |=(0x05 << 24);
//编写事件
EXTI->FTSR1 |= 0x01 << 7;
EXTI->C1IMR1 |= 0x01 << 7;
}
void PF8_exit_init()
{
//------RCC章节-----------
RCC->MP_AHB4ENSETR |=0x01 << 5;
//-------输入模式--------------
//key1
GPIOF->MODER |=(~(0x03 << 16));
//初始化EXIT
EXTI->EXTICR3 |=(0x05 << 0);
//编写事件
EXTI->FTSR1 |= 0x01 << 8;
EXTI->C1IMR1 |= 0x01 << 8;
}
//GICD控制器初始化
void PF9_gicd_init()
{
GICD->CTRL |=0x01 << 0;
GICD->ISENABLER[3] |=0x01 << 3;
GICD->IPRIORITYR[24] &= (~(0x1f << 27));
GICD->ITARGETSR[24] &= (~(0x3 << 24));
GICD->ITARGETSR[24] |= 0x1 << 24;
}
//GICD控制器初始化
void PF7_gicd_init()
{
GICD->CTRL |=0x01 << 0;
GICD->ISENABLER[3] |=0x01 << 3;
GICD->IPRIORITYR[24] |= (0x1f << 11);
GICD->ITARGETSR[24] |= 0x1 << 8;
}
//GICD控制器初始化
void PF8_gicd_init()
{
GICD->CTRL |=0x01 << 0;
GICD->ISENABLER[3] |=0x01 << 2;
GICD->IPRIORITYR[24] |= (0x1f << 19);
GICD->ITARGETSR[24] |= 0x1 << 16;
}
//GICC控制器初始化
void PF9_gicc_init()
{
GICC->CTRL |=0x01 << 0;
GICC->PMR &=(~(0x1f << 3));
GICC->PMR |=(0x1f << 3);
}
//GICC控制器初始化
void PF7_gicc_init()
{
GICC->CTRL |=0x01 << 0;
GICC->PMR |=(0x02 << 2);
}
//GICC控制器初始化
void PF8_gicc_init()
{
GICC->CTRL |=0x01 << 0;
GICC->PMR |=(0x02 << 2);
}
do_irq:
#include "key.h"
extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
unsigned int i = 0;
void do_irq(void)
{
unsigned int num =0;
//获取中断信号
num=GICC->IAR;
//判断终端的好坏
switch(num)
{
//99:key1键盘按下
case 99:
delay_ms(500);
printf("key1---------");
EXTI->FPR1 |= (0X1<<9);
GICD->ICPENDR[3] |=(0x01 << 3);
break;
//97:key2键盘按下
case 97:
delay_ms(500);
printf("key2---------");
EXTI->FPR1 |= (0X1<<7);
GICD->ICPENDR[3] |=(0x01 << 1);
break;
//98:key3键盘按下
case 98:
delay_ms(500);
printf("key3---------");
EXTI->FPR1 |= (0X1<<8);
GICD->ICPENDR[3] |=(0x01 << 2);
break;
default:
delay_ms(500);
printf("输入错误,请重新输入!---------");
}
//清楚中断状态位
GICC->EOIR &= (~(0x3ff << 0));
GICC->EOIR |=num;
}