2023-4-25 ARM 作业

key.h

#ifndef __KEY_H__
#define __KEY_H__

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

//EXTI控制器初始化
void hal_pf9_exti();
//GICO控制器初始化
void hal_pf9_gicd();
//GICC控制器初始化
void hal_pf9_gicc();





#endif

key.c

#include "key.h"

void hal_pf9_exti()
{

	//RCC章节初始化
	RCC->MP_AHB4ENSETR |=(0x1<<5);

	//GPIO章节初始化
	GPIOF->MODER &=(~(0x3<<18));
	GPIOF->MODER &=(~(0x3<<16));
	GPIOF->MODER &=(~(0x3<<14));
	
	//EXTI章节初始化
	//KEY1
	EXTI->EXTICR3 &=(~(0xff<<8)); 	//将GPIO组控制器与EXIT组控制器进行连接
	EXTI->EXTICR3 |=(0x5<<8); 	
	EXTI->FTSR1 |=(0x1<<9); 		//设置为下降沿触发方式
	EXTI->C1IMR1 |=(0x1<<9); 		//设置为中断不屏蔽

	//KEY2
	EXTI->EXTICR2 &=(~(0xff<<24));
	EXTI->EXTICR2 |=(0x5<<24);
	EXTI->FTSR1 |=(0x1<<7);
	EXTI->C1IMR1 |=(0x1<<7);
	
	//KEY3
	EXTI->EXTICR3 &=(~(0xff));
	EXTI->EXTICR3 |=(0x5);
	EXTI->FTSR1 |=(0x1<<8);
	EXTI->C1IMR1 |=(0x1<<8);
	
}

void hal_pf9_gicd()
{
	//GICD章节初始化
	GICD->CTRL |=(0x1); 					//使能组0

	//KE1
	GICD->ISENABLER[3] |=(0x1<<3); 			//设置中断设置使能寄存器

	GICD->IPRIORITYR[24] &=(~(0x1f<<27)); 	//设置中断优先级
	GICD->IPRIORITYR[24] |=(0x10<<27);

	GICD->ITARGETSR[24] &=(~(0x3<<24)); 		//中断目标分配寄存器
	GICD->ITARGETSR[24] |=(0x1<<24);

	//KEY2
	GICD->ISENABLER[1] |=(0x1<<1); 			//设置中断设置使能寄存器

	GICD->IPRIORITYR[24] &=(~(0x1f<<11)); 	//设置中断优先级
	GICD->IPRIORITYR[24] |=(0x11<<11);

	GICD->ITARGETSR[24] &=(~(0x3<<8)); 		//中断目标分配寄存器
	GICD->ITARGETSR[24] |=(0x1<<8);
	
	//KEY3
	GICD->ISENABLER[1] |=(0x1<<2); 			//设置中断设置使能寄存器

	GICD->IPRIORITYR[24] &=(~(0x1f<<19)); 	//设置中断优先级
	GICD->IPRIORITYR[24] |=(0x12<<19);

	GICD->ITARGETSR[24] &=(~(0x3<<16)); 		//中断目标分配寄存器
	GICD->ITARGETSR[24] |=(0x1<<16);


}

void hal_pf9_gicc()
{
	GICC->CTRL |=(0x1);	     				//使能组0中断

	GICC->PMR &=(~(0x1f<<3)); 				//设置中断优先级
	GICC->PMR |=(0x1f<<3);
}

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_pf9_exti();

	hal_pf9_gicd();

	hal_pf9_gicc();



	while(1)

	{

		

	}



	return 0;

}

do_riq.c

#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"

extern void printf(const char *fmt, ...);

unsigned int i;

void do_irp(void)
{
	i=GICC->IAR &(0x3ff);

	if(i==99)
	{
		printf("key1\n\r");
		EXTI->FPR1 |= (0x1<<9);
		GICD->ICPENDR[3] |=(0x1<<3);
	}
	else if(i==97)
	{
		printf("key2\n\r");
		EXTI->FPR1 |= (0x1<<7);
		GICD->ICPENDR[3] |=(0x1<<1);
	}
	else if(i==98)
	{
		printf("key3\n\r");
		EXTI->FPR1 |= (0x1<<8);
		GICD->ICPENDR[3] |=(0x1<<2);
	}



	GICC->EOIR &=(~(0x3ff));
	GICC->EOIR |=i;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值