ARM中断

按钮中断

头文件

#ifndef __KEY_H__
#define __KEY_H__

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

//key1->pf9
//初始化RCC和GPIO章节
void hal_gpio_key1(void);

//初始化EXTI章节
void hal_key1_exti_it(void);

//初始化GICD章节
void hal_key1_gicd_it(void);

//初始化GICC章节
void hal_key1_gicc_it(void);




#endif

源文件

#include "key.h"

//初始化RCC和GPIO章节
void hal_gpio_key1(void)
{
	//使能
	RCC->MP_AHB4ENSETR |= (0x1<<5);

	//key1
	GPIOF->MODER &= (~(0x3<<18));
	//key2
	GPIOF->MODER &= (~(0x3<<14));
	//key3
	GPIOF->MODER &= (~(0x3<<16));

}

//初始化EXTI章节
void hal_key1_exti_it(void)
{
	//**************************key1**********************
	//选择GPIO接口和哪个EXTI控制器连接
	EXTI->EXTICR3 &= (~(0xff<<8));
	EXTI->EXTICR3 |= (0x5<<8);
	
	//中断下降沿触发方式
	EXTI->FTSR1 |= (0x1<<9);

	//中断屏蔽寄存器
	EXTI->C1IMR1 |= (0x1<<9);


	//**************************key2**********************
	//选择GPIO接口和哪个EXTI控制器连接
	EXTI->EXTICR2 &= (~(0xff<<24));
	EXTI->EXTICR2 |= (0x5<<24);

	//中断下降沿触发方式
	EXTI->FTSR1 |= (0x1<<7);

	//中断屏蔽寄存器
	EXTI->C1IMR1 |= (0x1<<7);


	//**************************key3**********************
	//选择GPIO接口和哪个EXTI控制器连接
	EXTI->EXTICR3 &= (~(0xff));
	EXTI->EXTICR3 |= (0x5);

	//中断下降沿触发方式
	EXTI->FTSR1 |= (0x1<<8);

	//中断屏蔽寄存器
	EXTI->C1IMR1 |= (0x1<<8);


}

//初始化GICD章节
void hal_key1_gicd_it(void)
{
	//**************************key1**********************
	//中断设置使能寄存器
	GICD->ISENABLER[3] |= (0x1<<3);

	//中断优先级寄存器
	GICD->IPRIORITYR[24] &= (~(0xf<<27));
	GICD->IPRIORITYR[24] |= (0xf<<27);

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

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

	//中断优先级寄存器
	GICD->ITARGETSR[24] &= (~(0x3<<8));
	GICD->ITARGETSR[24] |= (0xa<<8);

	//中断目标分配寄存器
	GICD->ITARGETSR[24] &= (~(0x3<<8));
	GICD->ITARGETSR[24] |= (0x1<<8);
	
	//GICD控制寄存器
	GICD->CTRL |= (0x1);
	//**************************key3**********************
	//中断设置使能寄存器
	GICD->ISENABLER[3] |= (0x1<<2);
	
	//中断优先级寄存器
	GICD->ITARGETSR[24] &= (~(0x3<<16));
	GICD->ITARGETSR[24] |= (0x1<<16);

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

//初始化GICC章节
void hal_key1_gicc_it(void)
{
	//设置GICC层中断优先级的值
	GICC->PMR |= (0xf<<3);

	//中断全局使能
	GICC->CTRL |= 0x1;
}

main

#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_gpio_key1();
	hal_key1_exti_it();
	hal_key1_gicd_it();
	hal_key1_gicc_it();
	printf("11211213412\n");
	while(1)
	{
	}
	return 0;
}

中断处理文件

#include "key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	//获取中断号
	int a = (GICC->IAR & 0x3ff);

	//判断中断号
	switch(a)
	{
		case 99:printf("KEY1!!!!!!!\n");
				EXTI->FPR1 |= (0x1<<9);
				GICD->ICPENDR[3] |= (0x1<<3);
				break;
		case 97:printf("KEY2!!!!!!!\n");
				EXTI->FPR1 |= (0x1<<7);
				GICD->ICPENDR[3] |= (0x1<<1);
				break;
		case 98:printf("KEY3!!!!!!!\n");
				EXTI->FPR1 |= (0x1<<8);
				GICD->ICPENDR[3] |= (0x1<<2);
				break;
		default:break;
	}

	//清除中断挂起标志位,清除中断号
	GICC->EOIR = a;

}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值