do_irq.c
#include "key_it.h"
int flag1=0;
int flag2=0;
int flag3=0;
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void)
{// 获取中断号,根据中断号的不同进行不同的中断处理int irqno;irqno = GICC->IAR & 0x3ff;switch (irqno){case 99:printf("key1 int\n");if(flag1==0){led1_on();flag1=1;}else if(flag1==1){led1_off();flag1=0;}// 清除exti中断标志位EXTI->FPR1 |= (0x1 << 9);// 清除GICD中断标志位GICD->ICPENDR[3] = (0x1 << 3);break;case 97:printf("key2 int\n");if(flag2==0){led2_on();flag2=1;}else if(flag2==1){led2_off();flag2=0;}// 清除exti中断标志位EXTI->FPR1 |= (0x1 << 8);// 清除GICD中断标志位GICD->ICPENDR[3] = (0x1 << 2);break;case 98:printf("key3 int\n");if(flag3==0){led3_on();flag3=1;}else if(flag3==1){led3_off();flag3=0;}// 清除exti中断标志位EXTI->FPR1 |= (0x1 << 7);// 清除GICD中断标志位GICD->ICPENDR[3] = (0x1 << 1);break;}// 清除IAR寄存器的值,也就是中断号GICC->EOIR = irqno;
}
key_it.c
#include"key_it.h"void key1_it_config()
{//1.设置GPIOF时钟使能RCC->MP_AHB4ENSETR |= (0X1<<5);// 2.将PF9管脚设置为输入GPIOF->MODER &= (~(0x3<<18));//3.设置由PF9产生EXTI9事件EXTI->EXTICR3 &= (~(0XFF<<8));EXTI->EXTICR3 |= (0x05<<8);// 4.设置EXTI9事件的检测方式为下降沿检测EXTI->FTSR1 |= (0x1<<9);// 5.允许中断不屏蔽,可以被转发到GICEXTI->C1IMR1 |= (0x1<<9);// 6.允许EXTI9(99号)中断被保存在组0中GICD->ISENABLER[3]|= (0x1<<3);// 7.设置99号中断优先级GICD->IPRIORITYR[24] &= (~(0x1f<<27));GICD->IPRIORITYR[24] |= (0x0<<27);// 8.设置99号中断可以被CPU0处理GICD->ITARGETSR[24] &= (~(0x3<<24));GICD->ITARGETSR[24] |= (0x1<<24);//9.允许99号中断被转发到CPU接口层GICD->CTRL |= 0x1;//10.设置中断优先级掩码GICC->PMR |= (0x1f<<3);//11.允许中断被转发给CPU处理GICC->CTRL |=0x1;}
void key2_it_config()
{//1.设置GPIOF时钟使能RCC->MP_AHB4ENSETR |= (0X1<<5);// 2.将PF9管脚设置为输入GPIOF->MODER &= (~(0x3<<16));//3.设置由PF9产生EXTI9事件EXTI->EXTICR2 &= (~(0XFF<<24));EXTI->EXTICR2 |= (0x05<<24);// 4.设置EXTI9事件的检测方式为下降沿检测EXTI->FTSR1 |= (0x1<<7);// 5.允许中断不屏蔽,可以被转发到GICEXTI->C1IMR1 |= (0x1<<7);// 6.允许EXTI9(97号)中断被保存在组0中GICD->ISENABLER[3]|= (0x1<<1);// 7.设置97号中断优先级GICD->IPRIORITYR[24] &= (~(0x1f<<11));GICD->IPRIORITYR[24] |= (0x0<<11);// 8.设置97号中断可以被CPU0处理GICD->ITARGETSR[24] &= (~(0x3<<8));GICD->ITARGETSR[24] |= (0x1<<8);//9.允许97号中断被转发到CPU接口层GICD->CTRL |= 0x1;//10.设置中断优先级掩码GICC->PMR |= (0x1f<<3);//11.允许中断被转发给CPU处理GICC->CTRL |=0x1;}
void key3_it_config()
{//1.设置GPIOF时钟使能RCC->MP_AHB4ENSETR |= (0X1<<5);// 2.将PF9管脚设置为输入GPIOF->MODER &= (~(0x3<<14));//3.设置由PF9产生EXTI9事件EXTI->EXTICR3 &= (~(0XFF));EXTI->EXTICR3 |= (0x05);// 4.设置EXTI9事件的检测方式为下降沿检测EXTI->FTSR1 |= (0x1<<8);// 5.允许中断不屏蔽,可以被转发到GICEXTI->C1IMR1 |= (0x1<<8);// 6.允许EXTI9(98号)中断被保存在组0中GICD->ISENABLER[3]|= (0x1<<2);// 7.设置98号中断优先级GICD->IPRIORITYR[24] &= (~(0x1f<<19));GICD->IPRIORITYR[24] |= (0x0<<19);// 8.设置98号中断可以被CPU0处理GICD->ITARGETSR[24] &= (~(0x3<<16));GICD->ITARGETSR[24] |= (0x1<<16);//9.允许98号中断被转发到CPU接口层GICD->CTRL |= 0x1;//10.设置中断优先级掩码GICC->PMR |= (0x1f<<3);//11.允许中断被转发给CPU处理GICC->CTRL |=0x1;}
main.c
#include "key_it.h"#include "led.h"void delay(int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}}int main(){//中断初始化key1_it_config();key2_it_config();key3_it_config();//led使能all_led_init();//现象是发送一个a串口工具打印一个bwhile(1){printf("main func\n");delay(2000);}return 0;}
key_it.h
#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"#include "led.h"
void key1_it_config();
void key2_it_config();
void key3_it_config();
#endif