底层 key按键打印

该代码实现了一个基于STM32MP1xx处理器的中断系统配置,包括EXTI、GIC(GenericInterruptController)和GPIO的初始化,以及中断处理函数。主要功能是为三个按键(key1、key2、key3)设置下降沿触发的中断,并在检测到中断时执行相应的清除和打印操作。
摘要由CSDN通过智能技术生成

key.h

#ifndef __KEY_H__
#define __KEY_H__

#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"

void hal_exti_init(); //exit初始化
void hal_gicd_init(); //gicd初始化
void hal_gicc_init(); //gicc初始化





#endif

key.c

#include "key.h"

void hal_exti_init() //exit初始化
{
	//RCC章节初始化
	RCC->MP_AHB4ENSETR |= (0x1<<5); //GPIOF
	RCC->MP_AHB4ENSETR |= (0x1<<5); //GPIOF
	RCC->MP_AHB4ENSETR |= (0x1<<5); //GPIOF
	//GPIO章节初始化
	GPIOF->MODER &= (~(0x3 << 18)); //PF9
	GPIOF->MODER &= (~(0x3 << 14)); //PF7
	GPIOF->MODER &= (~(0x3 << 16)); //PF8
	//exti章节初始化
	  //外部中断选择寄存器
	EXTI->EXTICR3 &= (~(0xFF<<8));
	EXTI->EXTICR3 |= (0x05 << 8); //key1
	EXTI->EXTICR2 &= (~(0xFF<<24));
	EXTI->EXTICR2 |= (0x05 << 24); //key2
	EXTI->EXTICR3 &= (~(0xFF << 0));
	EXTI->EXTICR3 |= (0x05 << 0); //key3
	//触发选择寄存器(下降沿)
	EXTI->FTSR1 |= (0x1<<9); //key1
	EXTI->FTSR1 |= (0x1<<7); //key2
	EXTI->FTSR1 |= (0x1<<8); //key3
	//中断屏蔽寄存器(不屏蔽)
	EXTI->C1IMR1 |= (0x1<<9); //key1
	EXTI->C1IMR1 |= (0x1<<7); //key2
	EXTI->C1IMR1 |= (0x1<<8); //key3

}
void hal_gicd_init()//exit初始化
{
	//GICD层控制寄存器使能对应组中断
	GICD->CTRL |= (0x1<<0);
	GICD->CTRL |= (0x1<<0);
	GICD->CTRL |= (0x1<<0);
	//GICD中断设置使能寄存器
	GICD->ISENABLER[3] |= (0x1<<3); //key1,99号中断使能
	GICD->ISENABLER[3] |= (0x1<<1); //key2,97号中断使能
	GICD->ISENABLER[3] |= (0x1<<2); //key3,98号中断使能
	//设置GICD层中断优先级
	GICD->IPRIORITYR[24] |= (0x1<<3);//key1
	GICD->IPRIORITYR[24] |= (0x1<<1);//key2
	GICD->IPRIORITYR[24] |= (0x1<<2);//key3
	//设置GICD层中断目标分配寄存器(CPU0)
	GICD->ITARGETSR[24] |= (0b01<<24);//key1
	GICD->ITARGETSR[24] |= (0b01<<8);//key1
	GICD->ITARGETSR[24] |= (0b01<<16);//key1
}
void hal_gicc_init() //exit初始化
{
	//使能对应组中断
	GICC->CTRL |= (0x1<<0);  //key1
	GICC->CTRL |= (0x1<<0);  //key2
	GICC->CTRL |= (0x1<<0);  //key3
	//设置GICC层中断优先级
	GICC->PMR &= (~(0x1F<<3));
	GICC->PMR |= (0x2<<3);  //key1
	GICC->PMR &= (~(0x1F<<3));
	GICC->PMR |= (0x2<<3);  //key2
	GICC->PMR &= (~(0x1F<<3));
	GICC->PMR |= (0x2<<3); //key3
}

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	//获取中断号 IAR
	i=GICC->IAR & 0x3FF;
	//判断获取的中断号,进行打印
	switch(i)
	{
	case 99:
		printf("key1:***********\n");
	//清除对应EXTI层中断挂起标志位
		EXTI->FPR1 |= (0x1<<9);
	//清除对应GICD层中断挂起标志位
		GICD->ICPENDR[3] |= (0x1<<3);
	//清除对应GICC层中断号
		GICC->EOIR &= (~(0x3FF<<0));
		GICC->EOIR |= i;
		break;
	case 97:
		printf("key2:###########\n");
	//清除对应EXTI层中断挂起标志位
		EXTI->FPR1 |= (0x1<<7);
	//清除对应GICD层中断挂起标志位
		GICD->ICPENDR[3] |= (0x1<<1);
	//清除对应GICC层中断号
		GICC->EOIR &= (~(0x3FF<<0));
        GICC->EOIR |= i;
		break;
	case 98:
		printf("key3:&&&&&&&&&&&\n");
	//清除对应EXTI层中断挂起标志位
		EXTI->FPR1 |= (0x1<<8);
	//清除对应GICD层中断挂起标志位
		GICD->ICPENDR[3] |= (0x1<<2);
	//清除对应GICC层中断号
		GICC->EOIR &= (~(0x3FF<<0));
        GICC->EOIR |= i;
		break;
	default:
		break;
	}
}

main.c

#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_exti_init();

	hal_gicd_init();

	hal_gicc_init();



	while(1)

	{



	}

	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值