实现按键完成打印字符
key.h
#ifndef __KEY5_H__
#define __KEY5_H__
#include "./stm32mp1xx_exti.h"
#include "./stm32mp1xx_gpio.h"
#include "./stm32mp1xx_rcc.h"
#include "./stm32mp1xx_gic.h"
//初始化EITI层
void pf9_exti_init();
//初始化GICD层
void pf9_gicd_init();
//初始化GICC层
void pf9_dicc_init();
#endif
key.c
#include "key5.h"
//初始化EITI层
void pf9_exti_init()
{
//rcc使能GPIOF寄存器
RCC->MP_AHB4ENSETR |= (0X1 << 5);
/*****设置GPIOF系列寄存器****/
//设置GPIOF模式为输入模式
GPIOF->MODER &= (~(0X3 << 18));
GPIOF->MODER &= (~(0X3 << 16));
GPIOF->MODER &= (~(0X3 << 14));
/****设置EXTI系列寄存器*****/
//1.中断寄存器与GPIO连接
EXTI->EXTICR3 &= (~(0xff << 8));
EXTI->EXTICR3 |= (0X05 << 8);
EXTI->EXTICR3 &= (~(0xff << 0));
EXTI->EXTICR3 |= (0X05 << 0);
EXTI->EXTICR2 &= (~(0xff << 24));
EXTI->EXTICR2 |= (0X05 << 24);
//2.检测事件为下降沿
EXTI->FTSR1 |= (0X1 <<7);
EXTI->FTSR1 |= (0X1 <<8);
EXTI->FTSR1 |= (0X1 <<9);
//3.设置中断屏蔽寄存器为不屏蔽
EXTI->C1IMR1 |= (0X1 <<7);
EXTI->C1IMR1 |= (0X1 <<8);
EXTI->C1IMR1 |= (0X1 <<9);
}
//初始化GICD层
void pf9_gicd_init()
{
/*****设置GICD系列寄存器*****/
//使能GICD(全局)
GICD->CTRL |= (0X1 <<0);
//中断设置使能(对应中断号)
GICD->ISENABLER[3] |= (0X1 <<3);
GICD->ISENABLER[3] |= (0X1 <<1);
GICD->ISENABLER[3] |= (0X1 <<2);
//中断优先级设置
GICD->IPRIORITYR[24] &= (~(0X1F <<11));
GICD->IPRIORITYR[24] |= (0X1 <<11);
GICD->IPRIORITYR[24] &= (~(0X1F <<19));
GICD->IPRIORITYR[24] |= (0X1 <<19);
GICD->IPRIORITYR[24] &= (~(0X1F <<27));
GICD->IPRIORITYR[24] |= (0X1 <<27);
//选择CPU,0号,设置中断目标分配
GICD->ITARGETSR[24] &= (~(0X3 <<8));
GICD->ITARGETSR[24] |= (0X1 <<8);
GICD->ITARGETSR[24] &= (~(0X3 <<16));
GICD->ITARGETSR[24] |= (0X1 <<16);
GICD->ITARGETSR[24] &= (~(0X3 <<24));
GICD->ITARGETSR[24] |= (0X1 <<24);
/*
//清除GICD中断
*/
}
//初始化GICC层
void pf9_dicc_init()
{
/*****设置GICC系列寄存器*****/
//使能GICC
GICC->CTRL |= (0X1 <<0);
//输入中断优先级
GICC->PMR &= (~(0X1F <<3));
GICC->PMR |= (0XF <<3);
}
do_irq.c
#include "key5.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 & 0X1FF;
switch(num)
{
case 97:
{
delay_ms(500);
printf("key2######\n");
//清除EXTI层挂起标志位
EXTI->FPR1 |= (0x1 <<7);
EXTI->FPR1 |= (0x1 <<8);
EXTI->FPR1 |= (0x1 <<9);
//清除GICD层挂起标志位
GICD->ICPENDR[3] |= (0X1 <<3);
GICD->ICPENDR[3] |= (0X1 <<1);
GICD->ICPENDR[3] |= (0X1 <<2);
}
break;
case 98:
{
delay_ms(500);
printf("key3######\n");
//清除EXTI层挂起标志位
EXTI->FPR1 |= (0x1 <<7);
EXTI->FPR1 |= (0x1 <<8);
EXTI->FPR1 |= (0x1 <<9);
//清除GICD层挂起标志位
GICD->ICPENDR[3] |= (0X1 <<3);
GICD->ICPENDR[3] |= (0X1 <<1);
GICD->ICPENDR[3] |= (0X1 <<2);
}
break;
case 99:
{
delay_ms(500);
printf("key1######\n");
//清除EXTI层挂起标志位
EXTI->FPR1 |= (0x1 <<7);
EXTI->FPR1 |= (0x1 <<8);
EXTI->FPR1 |= (0x1 <<9);
//清除GICD层挂起标志位
GICD->ICPENDR[3] |= (0X1 <<3);
GICD->ICPENDR[3] |= (0X1 <<1);
GICD->ICPENDR[3] |= (0X1 <<2);
}
break;
}
//清除中断号
GICC->EOIR &= (~(0X1FF));
GICC->EOIR |= num;
}
main.c
#include "key5.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()
{
//调用初始化函数
pf9_exti_init();
pf9_gicd_init();
pf9_dicc_init();
while(1)
{
}
return 0;
}