按键中断实验

 do_irq.c

#include "../include/key.h"
extern void printf(const char *fmt,...);
extern void delay_ms(int ms);
void do_irq(void)
{
	unsigned int i=0;
	i=GICC->IAR&0x3FF;
	//key1触发中断
	if(i==99)
	{
		delay_ms(500);
		printf("*****key1*****\n"); 
		//清除EXTI被挂起的标志位
		EXTI->FPR1|=(0x1<<9);
		//清除GCID层被挂起的标志位
		GICD->ISENABLER[3]|=(0x1<<3);
	}

	//key2触发中断
	else if(i==97)
	{
		delay_ms(500);
		printf("*****key2****\n"); 
		EXTI->FPR1|=(0x1<<7);
		GICD->ISENABLER[3]|=(0x1<<1);
	}
	//key3触发中断
	else if(i==98)
	{
		delay_ms(500);
		printf("*****key3****\n"); 
		EXTI->FPR1|=(0x1<<8);
		GICD->ISENABLER[3]|=(0x1<<2);
	}
	//清除中断号
	GICC->EOIR&=(~(0xFF));
	GICC->EOIR|=i;
}

main.c

#include "./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()
{
//Rcc章节初始化
rcc_init();

//GPIO章节初始化
pF9_GPIO_init();
//EXTI章节初始化
pF9_EXTI_init();
//GICD章节初始化
pF9_GICD_init();

pF7_GPIO_init();
pF7_EXTI_init();
pF7_GICD_init();

pF8_GPIO_init();
pF8_EXTI_init();
pF8_GICD_init();
//GICC章节初始化
GICC_init();
	while (1)
	{

	}
	return 0;
}

 key.c

#include "../include/key.h"
extern void delay_ms(int ms);
/***RCC章节初始化******/
void rcc_init()
{
//使能GPIOF控制器,其中EXTI和GIC控制器为系统自动使能
RCC->MP_AHB4ENSETR|=(0x1<<5);
}

/****GPIO章节初始化***/
void pF9_GPIO_init()
{
	//设置PF9引脚为输入模式
	GPIOF->MODER&=(~(0x3<<18));

}
void pF7_GPIO_init()
{
	//设置PF7引脚为输入模式
	GPIOF->MODER&=(~(0x3<<14));

}
void pF8_GPIO_init()
{
	//设置Pf8引脚为输入模式
	GPIOF->MODER&=(~(0x3<<16));
}
//EXTI章节初始化
void pF9_EXTI_init()
{
	//选择pF9对应的EXTI9连接
	EXTI->EXTICR3&=(~(0xFF<<8));
	EXTI->EXTICR3|=(0x05<<8);	
	//下降沿选择寄存器(下降沿对于中断事件输入的使能)
	EXTI->FTSR1|=(0x1<<9);
	
	//设置中断不屏蔽
	EXTI->C1IMR1|=(0x1<<9);

}
void pF7_EXTI_init()
{
	//选择pF7对应的EXTI
	EXTI->EXTICR2&=(~(0xFF<<24));
	EXTI->EXTICR2|=(0x05<<24);

	EXTI->FTSR1|=(0x1<<7);

	EXTI->C1IMR1|=(0x1<<7);
}
void pF8_EXTI_init()
{
	//选择pF8对应的EXTI
	EXTI->EXTICR3&=(~(0xFF<<0));
	EXTI->EXTICR3|=(0x05<<0);

	EXTI->FTSR1|=(0x1<<8);
	
	EXTI->C1IMR1|=(0x1<<8);

}
//GICD章节初始化
void pF9_GICD_init()
{
	//使能GICD层
	GICD->CTRL&=0x1;
	//中断设置使能寄存器
	GICD->ISENABLER[3]|=(0x1<<3);
	//GICD层中断优先级设置
	GICD->IPRIORITYR[24]|=(0x01<<27);
	//GICD->IPRIORITYR[23]|=(0x1<<28);
	//中断目标分配给cpu0
	GICD->ITARGETSR[24]|=(0x01<<24);
}
void pF7_GICD_init()
{
	//使能GICD层
	GICD->CTRL&=0x1;

	GICD->ISENABLER[3]|=(0x1<<1);
	
	GICD->IPRIORITYR[24]|=(0x1<<11);
//	GICD->IPRIORITYR[24]|=(0x1<<15);
	

	GICD->ITARGETSR[24]|=(0x01<<8);
	
}
void pF8_GICD_init()
{
	//使能GICD层
	GICD->CTRL&=0x1;
	
	GICD->ISENABLER[3]|=(0x1<<2);

	GICD->IPRIORITYR[24]|=(0x1<<19);
//	GICD->IPRIORITYR[23]|=(0x1<<23);
	
	GICD->ITARGETSR[24]|=(0x01<<16);
}
//GICC章节初始化
void GICC_init()
{
	//GICC层使能
	GICC->CTRL|=0x1;
	//设置GICC中断优先级屏蔽寄存器(5位)
	GICC->PMR|=(0x2<<3);
}
//

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
//Rcc章节初始化
void rcc_init();
//GPIO章节初始化
void pF9_GPIO_init();
void pF7_GPIO_init();
void pF8_GPIO_init();
//EXTI章节初始化
void pF9_EXTI_init();
void pF7_EXTI_init();
void pF8_EXTI_init();
//GICD章节初始化
void pF9_GICD_init();
void pF7_GICD_init();
void pF8_GICD_init();
//GIC章节初始化
void GICC_init();
void do_irq(void);
#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值