#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
//key1--->PF9
void hal_pf9_exti();
void hal_pf9_gicd();
void hal_pf9_gicc();
#endif
#include "uart4.h"
extern void printf(const char *fmt, ...);
unsigned int num = 0;
void delay(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
void do_irq(void)
{
//获取中断号
num=GICC->IAR&0x1ff;
printf("num=%d\n",num);
//判断中断号
if(num==99)
{
printf("this key1!\n");
EXTI->FPR1 |=0x1<<9;
GICD->ICPENDR[3] |=0x1<<3;
}
else if(num==97)
{
printf("this key22!\n");
EXTI->FPR1 |=0x1<<7;
GICD->ICPENDR[3] |=0x1<<1;
}
else if(num==98)
{
printf("this key333!\n");
EXTI->FPR1 |=0x1<<8;
GICD->ICPENDR[3] |=0x1<<2;
}
//清除对应层中断挂起标志位
GICC->EOIR |=num;
}
#include "uart4.h"
//EXTI控制器初始化
void hal_pf9_exti()
{
/*-------RCC章节初始化-----*/
RCC->MP_AHB4ENSETR |= (0x1<<5);
/*-------GPIO章节初始化-----*/
GPIOF->MODER &=(~(0x3 <<18));
GPIOF->MODER &=(~(0x3 <<14));
GPIOF->MODER &=(~(0x3 <<16));
/*-------EXTI章节初始化-----*/
//链接GPIO和EXTI
EXTI->EXTICR3 &=(~(0xff<<8));
EXTI->EXTICR3 |=0x5<<8;
EXTI->EXTICR2 &=(~(0xff<<24));
EXTI->EXTICR2 |=0x5<<24;
EXTI->EXTICR3 &=~(0xff);
EXTI->EXTICR3 |=0x5;
//确定中断的触发方式
EXTI->FTSR1 |=0x1<<9;
EXTI->FTSR1 |=0x1<<7;
EXTI->FTSR1 |=0x1<<8;
//设置中断不屏蔽
EXTI->C1IMR1 |=0x1<<9;
EXTI->C1IMR1 |=0x1<<7;
EXTI->C1IMR1 |=0x1<<8;
//清除挂起标志
// EXTI->FPR1 |=0x1<<9;
// EXTI->FPR1 |=0x1<<7;
// EXTI->FPR1 |=0x1<<8;
}
//GTCD控制器初始化
void hal_pf9_gicd()
{
//使能
GICD->CTRL |=0x1;
//中断器使能
GICD->ISENABLER[3] |=0x1<<3;
GICD->ISENABLER[3] |=0x1<<1;
GICD->ISENABLER[3] |=0x1<<2;
//中断器优先
GICD->IPRIORITYR[24] &=(~(0x1f<<27));
GICD->IPRIORITYR[24] &=(~(0x1f<<11));
GICD->IPRIORITYR[24] &=(~(0x1f<<19));
//中断目标分配
GICD->ITARGETSR[24] &=(~(0x3<<24));
GICD->ITARGETSR[24] |=0b1<<24;
GICD->ITARGETSR[24] &=(~(0x3<<8));
GICD->ITARGETSR[24] |=0b1<<8;
GICD->ITARGETSR[24] &=(~(0x3<<16));
GICD->ITARGETSR[24] |=0b1<<16;
//清除GPIO中断层
// GICD->ICPENDR[3] |=0x1<<3;
// GICD->ICPENDR[3] |=0x1<<1;
// GICD->ICPENDR[3] |=0x1<<2;
}
//GTCC控制器初始化
void hal_pf9_gicc()
{
//设置GICC优先级
GICC->PMR |=0x1f<<3;
//是能组中断
GICC->CTRL |=0x1;
}
#include "uart4.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_pf9_exti();
hal_pf9_gicd();
hal_pf9_gicc();
while(1);
return 0;
}