按键中断实验
gpio.c
#include"gpio.h"//给gpio使能和设置为输入模式void hal_gpio_init(){//使能GPIOF控制器RCC->MP_AHB4ENSETR|=(0x1<<5);//通过GPIOF_将pf9/pf7/pf8设置为输入模式 GPIOF->MODER&=(~(0x3<<18));GPIOF->MODER&=(~(0x3<<14));GPIOF->MODER&=(~(0x3<<16));}//EXTI控制器初始化void hal_exti_init(){//选择与pf9,pf7,pf8EXTI->EXTICR3&=(~(0xff<<8));EXTI->EXTICR3|=(0x5<<8);EXTI->EXTICR3&=(~(0xff<<24));EXTI->EXTICR3|=(0x5<<24);EXTI->EXTICR3&=(~(0xff<<0));EXTI->EXTICR3|=(0x5<<0);//对应事件9,7,8EXTI->FTSR1|=(0x1<<9);EXTI->FTSR1|=(0x1<<7);EXTI->FTSR1|=(0x1<<8);//不中断屏蔽EXTI->C1IMR1|=(0x1<<9);EXTI->C1IMR1|=(0x1<<7);EXTI->C1IMR1|=(0x1<<8);}//GICD控制器初始化void hal_gicd_init(){//设置CTLR给CPU0使能GICD->CTRL|=(0x1);//管理key1->99,key2->97,key3->98中断号GICD->ISENABLER[3]|=(0x1<<3);GICD->ISENABLER[3]|=(0x1<<1);GICD->ISENABLER[3]|=(0x1<<2);//设置中断优先级GICD->IPRIORITYR[24]|=(0x1<<27);GICD->IPRIORITYR[24]|=(0x1<<11);GICD->IPRIORITYR[24]|=(0x1<<19);//设置是分配给CPU0还是CPU1GICD->ITARGETSR[24]|=(0x1<<24);GICD->ITARGETSR[24]|=(0x1<<8);GICD->ITARGETSR[24]|=(0x1<<16);}//GICC控制器初始化void hal_gicc_init(){//设置CTLR给CPU0使能GICC->CTRL|=(0x1);//设置中断优先级GICC->PMR|=(0x1f<<27);}
do_irq.c
#include"stm32mp1xx_gic.h" #include"stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i = 0; void do_irq(void) { i|=GICC->IAR; if(i==99) { printf("1111111111:%d\\n",i); EXTI->FPR1|=(0x1<<9); EXTI->FPR1|=(0x1<<7); EXTI->FPR1|=(0x1<<8); GICD->ICPENDR[2]|=(0X1<<3); GICD->ICPENDR[2]|=(0X1<<1); GICD->ICPENDR[2]|=(0X1<<2); GICC->EOIR|=i; } else if(i==97) { printf("11111111111:%d\\n",i); EXTI->FPR1|=(0x1<<9); EXTI->FPR1|=(0x1<<7); EXTI->FPR1|=(0x1<<8); GICD->ICPENDR[2]|=(0X1<<3); GICD->ICPENDR[2]|=(0X1<<1); GICD->ICPENDR[2]|=(0X1<<2); GICC->EOIR|=i; } else if(i==98) { printf("1111111111:%d\\n",i); EXTI->FPR1|=(0x1<<9); EXTI->FPR1|=(0x1<<7); EXTI->FPR1|=(0x1<<8); GICD->ICPENDR[2]|=(0X1<<3); GICD->ICPENDR[2]|=(0X1<<1); GICD->ICPENDR[2]|=(0X1<<2); GICC->EOIR|=i; } }
gpio.h
#ifndef __GPIO_H__ #define __GPIO_H__ #include"stm32mp1xx_gpio.h" #include"stm32mp1xx_rcc.h" #include"stm32mp1xx_exti.h" #include"stm32mp1xx_gic.h" //给gpio使能和设置为输入模式 void hal_gpio_init(); //EXTI控制器初始化 void hal_exti_init(); //GICD控制器初始化 void hal_gicd_init(); //GICC控制器初始化 void hal_gicc_init(); #endif
main.c
#include "gpio.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_gpio_init(); hal_exti_init(); hal_gicd_init(); hal_gicc_init(); while(1) { }return 0;
}