出现的问题中断函数中num没请0,板子按键不灵,已解决
ifndef __KEY__H__
#define __KEY__H__
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_exti.h"
#include"stm32mp1xx_gic.h"
void hal_pf9_exit();
void hal_pf9_gicd();
void hal_pf9_gicc();
void hal_pf8_exit();
void hal_pf8_gicd();
void hal_pf8_gicc();
void hal_pf7_exit();
void hal_pf7_gicd();
void hal_pf7_gicc();
#endif
#include"key.h"
void hal_pf9_exit()
{
RCC->MP_AHB4ENSETR|=(0x1<<5);
GPIOF->MODER&=(~(0x3<<18));
EXTI->EXTICR3&=(~(0xff<<8));
EXTI->EXTICR3|=(0x5<<8);
EXTI->FTSR1|=(0x1<<9);
EXTI->C1IMR1|=(0x1<<9);
}
void hal_pf9_gicd()
{
GICD->CTRL|=1;
GICD->ISENABLER[3]|=(1<<3);
GICD->IPRIORITYR[24]&=(~(0x1f<<27));
GICD->IPRIORITYR[24]|=(0x1<<27);
GICD->ITARGETSR[24]|=(1<<24);
}
void hal_pf9_gicc()
{
GICC->CTRL|=1;
GICC->PMR|=(0x1f<<3);
}
void hal_pf8_exit()
{
RCC->MP_AHB4ENSETR|=(0x1<<5);
GPIOF->MODER&=(~(0x3<<16));
EXTI->EXTICR3&=(~(0xff));
EXTI->EXTICR3|=(0x5);
EXTI->FTSR1|=(0x1<<8);
EXTI->C1IMR1|=(0x1<<8);
}
void hal_pf8_gicd()
{
GICD->CTRL|=1;
GICD->ISENABLER[3]|=(1<<2);
GICD->IPRIORITYR[24]&=(~(0x1f<<19));
GICD->IPRIORITYR[24]|=(0x2<<19);
GICD->ITARGETSR[24]|=(1<<16);
}
void hal_pf8_gicc()
{
GICC->PMR|=(0x1f<<3);
GICC->CTRL|=1;
}
void hal_pf7_exit()
{
RCC->MP_AHB4ENSETR|=(0x1<<5);
GPIOF->MODER&=(~(0x3<<14));
EXTI->EXTICR2&=(~(0xff<<24));
EXTI->EXTICR2|=(0x5<<24);
EXTI->FTSR1|=(0x1<<7);
EXTI->C1IMR1|=(0x1<<7);
}
void hal_pf7_gicd()
{
GICD->CTRL|=1;
GICD->ISENABLER[3]|=(1<<1);
GICD->IPRIORITYR[24]&=(~(0x1f<<11));
GICD->IPRIORITYR[24]|=(0x3<<11);
GICD->ITARGETSR[24]|=(1<<8);
}
void hal_pf7_gicc()
{
GICC->PMR|=(0x1f<<3);
GICC->CTRL|=1;
}
#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_pf9_exit();
hal_pf9_gicd();
hal_pf9_gicc();
hal_pf8_exit();
hal_pf8_gicd();
hal_pf8_gicc();
hal_pf7_exit();
hal_pf7_gicd();
hal_pf7_gicc();
while(1)
{
}
return 0;
}
#include"stm32mp1xx_gic.h"
#include"stm32mp1xx_exti.h"
extern void printf(const char *fmt, ...);
unsigned int num = 0;
unsigned int number = 0;
void do_irq(void)
{
num=0;
num|=GICC->IAR;
num&=(0x3ff);
switch(num){
case 99:
printf("key1####\n");
EXTI->FPR1|=(0x1<<9);
GICD->ICPENDR[3]|=(0x1<<3);
GICC->EOIR&=(~(0x3ff));
break;
case 98:
printf("key3###\n");
EXTI->FPR1|=(0x1<<8);
GICD->ICPENDR[3]|=(0x1<<2);
GICC->EOIR&=(~(0x3ff));
break;
case 97:
printf("key2####\n");
EXTI->FPR1|=(0x1<<7);
GICD->ICPENDR[3]|=(0x1<<1);
GICC->EOIR&=(~(0x3ff));
break;
}
GICC->EOIR|=(num);
}