题目:A7核实现外部中断
代码:
main.c
#include "exti.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_exti_rcc_init();
hal_exti_gpio_init();
hal_exti_exti_init();
hal_exti_gicd_init();
hal_exti_gicc_init();
printf("abc");
while(1)
{
}
return 0;
}
exti.h
#ifndef __EXTI_H__
#define __EXTI_H__
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
void hal_exti_rcc_init(void);
void hal_exti_gpio_init(void);
void hal_exti_exti_init(void);
void hal_exti_gicd_init(void);
void hal_exti_gicc_init(void);
#endif
exti.c
#include "exti.h"
void hal_exti_rcc_init()
{
RCC->MP_AHB4ENSETR|=(0x1<<5);
}
void hal_exti_gpio_init()
{
GPIOF->MODER&=(~(0x3f<<14));
}
void hal_exti_exti_init()
{
EXTI->EXTICR3&=(~(0xff<<8));
EXTI->EXTICR3|=(0x05<<8);
EXTI->EXTICR2&=(~(0xff<<24));
EXTI->EXTICR2|=(0x05<<24);
EXTI->EXTICR3&=(~(0xff<<0));
EXTI->EXTICR3|=(0x05<<0);
EXTI->FTSR1|=(0x7<<7);
EXTI->C1IMR1|=(0x7<<7);
}
void hal_exti_gicd_init()
{
GICD->CTRL|=(0x1<<0);
GICD->ISENABLER[3]|=(0x7<<1);
GICD->IPRIORITYR[24]&=(~(0x1f<<27));
GICD->IPRIORITYR[24]|=(0x1<<27);
GICD->IPRIORITYR[24]&=(~(0x1f<<11));
GICD->IPRIORITYR[24]|=(0x1<<11);
GICD->IPRIORITYR[24]&=(~(0x1f<<19));
GICD->IPRIORITYR[24]|=(0x1<<19);
GICD->ITARGETSR[24]&=(~(0x3<<24));
GICD->ITARGETSR[24]|=(0x1<<24);
GICD->ITARGETSR[24]&=(~(0x3<<8));
GICD->ITARGETSR[24]|=(0x1<<8);
GICD->ITARGETSR[24]&=(~(0x3<<16));
GICD->ITARGETSR[24]|=(0x1<<16);
}
void hal_exti_gicc_init()
{
GICC->CTRL|=(0x1<<0);
GICC->PMR&=(~(0x1f<<3));
GICC->PMR|=(0x3<<3);
}
do_irq.c
#include "exti.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{
i=GICC->IAR&0x3ff;
for(int j=0;j<3;j++)
{
if(EXTI->FPR1&(0x1<<(7+j)))
{
EXTI->FPR1|=(0x1<<(7+j));
}
if(GICD->ICPENDR[3]&(0x1<<(1+j)))
{
GICD->ICPENDR[3]|=(0x1<<(1+j));
}
}
if(i==97)
{
printf("2222");
GICC->EOIR&=(~(0x3ff));
GICC->EOIR|=(0x61);
}
else if(i==98)
{
printf("3333");
GICC->EOIR&=(~(0x3ff));
GICC->EOIR|=(0x62);
}
else if(i==99)
{
printf("1111");
GICC->EOIR&=(~(0x3ff));
GICC->EOIR|=(0x63);
}
}
运行结果: