作业2.22---按键实验

按下按键之后,打印一句话------>三个按键需要实现
key.h

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"

/*********KEY1---PF9**********/
//EXIT控制器初始化
void key1_exit_init();
//GICD控制器初始化
void key1_gicd_init();
//GICC控制器初始化
void key1_gicc_init();

/*********KEY2---PF7**********/
//EXIT控制器初始化
void key2_exit_init();
//GICD控制器初始化
void key2_gicd_init();
//GICC控制器初始化
void key2_gicc_init();

/*********KEY3---PF8**********/
//EXIT控制器初始化
void key3_exit_init();
//GICD控制器初始化
void key3_gicd_init();
//GICC控制器初始化
void key3_gicc_init();

#endif

key.c

#include "key.h"

/*********KEY1---PF9**********/
//EXIT控制器初始化
void key1_exit_init()
{
/*********KEY1 RCC章节**********/
//使能GPIOF
RCC->MP_AHB4ENSETR|=(0x1<<5);

/*********KEY1 GPIO章节**********/
GPIOF->MODER &=(~(0x3<<18));
/*********KEY1 EXIT章节**********/
//EXIT中断选择寄存器
EXTI->EXTICR3&=(~(0xFF<<8));
EXTI->EXTICR3|=(0x05<<8);
//EXIT_FTSR1寄存器
EXTI->FTSR1|=(0x1<<9);
//EXTI_IMR1寄存器
EXTI->C1IMR1|=(0x1<<9);

}
//GICD控制器初始化
void key1_gicd_init()
{
    //GICD_CTLR寄存器
    GICD->CTRL|=(0x1);
    //GICD_ISENABLER0寄存器
    GICD->ISENABLER[3]|=(0x1<<3);
	//GICD_IPRIORITYRx寄存器
	GICD->IPRIORITYR[24]&=(~(0x1F<<27));
	GICD->IPRIORITYR[24]|=(0x1<<28);
    //GICD_ICPENDRx寄存器
	GICD->ITARGETSR[24]&=(~(0x3<<24));
	GICD->ITARGETSR[24]|=(0x3<<24);

}
//GICC控制器初始化
void key1_gicc_init()
{
	//GICC_CTLR寄存器
	GICC->CTRL=(0x1);
	//GICC_PMR寄存器
	GICC->PMR&=(~(0x1F<<3));
	GICC->PMR|=(0x1F<<3);
}

/*********KEY2---PF7**********/
//EXIT控制器初始化
void key2_exit_init()
{
/*********KEY2 RCC章节**********/
//使能GPIOF
RCC->MP_AHB4ENSETR|=(0x1<<5);

/*********KEY2 GPIO章节**********/
GPIOF->MODER &=(~(0x3<<14));
/*********KEY2 EXIT章节**********/
//EXIT中断选择寄存器
EXTI->EXTICR2&=(~(0xFF<<24));
EXTI->EXTICR2|=(0x5<<24);
//EXIT_FTSR1寄存器
EXTI->FTSR1|=(0x1<<7);
//EXTI_IMR1寄存器
EXTI->C1IMR1|=(0x1<<7);

}
//GICD控制器初始化
void key2_gicd_init()
{
    //GICD_CTLR寄存器
    GICD->CTRL|=(0x1);
    //GICD_ISENABLER0寄存器
    GICD->ISENABLER[3]|=(0x1<<1);
	//GICD_IPRIORITYRx寄存器
	GICD->IPRIORITYR[24]&=(~(0x1F<<11));
	GICD->IPRIORITYR[24]|=(0x3<<11);
    //GICD_ICPENDRx寄存器
	GICD->ITARGETSR[24]&=(~(0x3<<8));
	GICD->ITARGETSR[24]|=(0x3<<8);
}
//GICC控制器初始化
void key2_gicc_init()
{
	//GICC_CTLR寄存器
	GICC->CTRL=(0x1);
	//GICC_PMR寄存器
	GICC->PMR&=(~(0x1F<<3));
	GICC->PMR|=(0x1F<<3);
}

/*********KEY3---PF8**********/
//EXIT控制器初始化
void key3_exit_init()
{
/*********KEY3 RCC章节**********/
//使能GPIOF
RCC->MP_AHB4ENSETR|=(0x1<<5);

/*********KEY3 GPIO章节**********/
GPIOF->MODER &=(~(0x3<<16));
/*********KEY3 EXIT章节**********/
//EXIT中断选择寄存器
EXTI->EXTICR3&=(~(0xFF));
EXTI->EXTICR3|=(0x5);
//EXIT_FTSR1寄存器
EXTI->FTSR1|=(0x1<<8);
//EXTI_IMR1寄存器
EXTI->C1IMR1 |= (0x1<<8);

}
//GICD控制器初始化
void key3_gicd_init()
{
	//GICD_CTLR寄存器
    GICD->CTRL|=(0x1);
    //GICD_ISENABLER0寄存器
    GICD->ISENABLER[3]|=(0x1<<2);
	//GICD_IPRIORITYRx寄存器
	GICD->IPRIORITYR[24]&=(~(0x1F<<19));
	GICD->IPRIORITYR[24]|=(0x4<<19);
    //GICD_ICPENDRx寄存器
	GICD->ITARGETSR[24]&=(~(0x3<<16));
	GICD->ITARGETSR[24]|=(0x3<<16);
}
//GICC控制器初始化
void key3_gicc_init()
{
	//GICC_CTLR寄存器
	GICC->CTRL=(0x1);
	//GICC_PMR寄存器
	GICC->PMR&=(~(0x1F<<3));
	GICC->PMR|=(0x1F<<3);
}

do_irq.c

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	//获取中断号
	int num = 0;
	num=GICC->IAR;
	//判断中断号
	if(num==97)
	{
		printf("key2:i am 2\n");
		EXTI->FPR1|=(0x1<<7);
		GICD->IPRIORITYR[3]|=(0x1<<1);
		GICC->EOIR&=(~(0x3FF));
		GICC->EOIR|=num;
	}else if(num==98)
	{
		printf("key3:i am 3\n");
		EXTI->FPR1|=(0x1<<8);
		GICD->IPRIORITYR[3]|=(0x1<<2);
		GICC->EOIR&=(~(0x3FF));
		GICC->EOIR|=num;
	}else if(num==99)
	{

		printf("key1:i am 1\n");
		EXTI->FPR1|=(0x1<<9);
		GICD->IPRIORITYR[3]|=(0x1<<3);
		GICC->EOIR&=(~(0x3FF));
		GICC->EOIR|=num;
	}
}

main.c

#include "./include/key.h"

void delay_ms(int ms)

{

	int i,j;

	for(i = 0; i < ms;i++)

		for (j = 0; j < 1800; j++);

}





int main()

{

key1_exit_init();

key2_exit_init();

key3_exit_init();



key1_gicd_init();

key2_gicd_init();

key3_gicd_init();



key1_gicc_init();

key2_gicc_init();

key3_gicc_init();

while(1)

{	

}

	return 0;

}

执行结果

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值