按键中断

key_it.c

#include"key_it.h"

void key3_it_config()
{
	RCC -> MP_AHB4ENSETR |= (0x1 << 5);

	GPIOF -> MODER &= (~(0x3 << 16));

	EXTI -> EXTICR3 &= (~(0xFF << 0));

	EXTI -> EXTICR3 |= (0x5 << 0);

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

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

	GICD -> ISENABLER[3] |= (0x1 << 2);

	GICD -> IPRIORITYR[24] &= (~(0x1F << 19));

	GICD -> ITARGETSR[24] &= (~(0x3 << 16));

	GICD -> ITARGETSR[24] |= (0x1 << 16);
}

void key_it_config()
{
	RCC -> MP_AHB4ENSETR |= (0x1 << 5);

	GPIOF -> MODER &= (~(0x3 << 18));

	GPIOF -> MODER &=(~(0x3 << 14));

	EXTI -> EXTICR2 &= (~(0xFF << 24));
	EXTI -> EXTICR2 |= (0x5 << 24);
	
	EXTI -> EXTICR3 &= (~(0xFF << 8));
	EXTI -> EXTICR3 |= (0x5 << 8);

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

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

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

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

	GICD -> ISENABLER[3] |= (0x1 << 1);

	GICD -> ISENABLER[3] |= (0x1 << 3);

	GICD -> IPRIORITYR[24] &= (~(0x1F << 11));

	GICD -> IPRIORITYR[24] &= (~(0x1F << 27));

	GICD -> ITARGETSR[24] &= (~(0x3 << 8));
	GICD -> ITARGETSR[24] |= (0x1 << 8);

	GICD -> ITARGETSR[24] &= (~(0x3 << 24));
	GICD -> ITARGETSR[24] |= (0x1 << 24);

	GICC -> CTRL |= 0x1;

	GICC -> PMR |= (0x1F << 3); 

	GICC -> CTRL |= 0x1;
}


void all_led_init()
{
	RCC -> MP_AHB4ENSETR |= (0x3 << 4);

	GPIOE -> MODER &= (~(0x3 << 20));
	GPIOE -> MODER |= (0x1 << 20);
	GPIOF -> MODER &= (~(0x3 << 20));
	GPIOF -> MODER |= (0x1 << 20);
	GPIOE -> MODER &= (~(0x3 << 16));
	GPIOE -> MODER |= (0x1 << 16);

	GPIOE -> MODER &= (~(0x1 << 10));
	GPIOF -> MODER &= (~(0x1 << 10));
	GPIOE -> MODER &= (~(0x1 << 8));

	GPIOE -> OSPEEDR &= (~(0x3 << 20));
	GPIOF -> OSPEEDR &= (~(0x3 << 20));
	GPIOE -> OSPEEDR &= (~(0x3 << 16));

	GPIOE -> PUPDR &= (~(0x3 << 20));
	GPIOF -> PUPDR &= (~(0x3 << 20));
	GPIOE -> PUPDR &= (~(0x3 << 16));
}


void beep_init()
{
	RCC -> MP_AHB4ENSETR |= (0x1 << 1);

	GPIOB -> MODER &= (~(0x3 << 12));
	GPIOB -> MODER |= (0x1 << 12);

	GPIOB -> MODER |= (0x1 << 6);

	GPIOB -> OSPEEDR &= (~(0x3 << 12));

	GPIOB -> PUPDR &= (~(0x3 << 12));
}


void fan_init()
{
	RCC -> MP_AHB4ENSETR |= (0x1 << 4);

	GPIOE -> MODER &= (~(0x3 << 18));
	GPIOE -> MODER |= (0x1 << 18);

	GPIOE -> MODER |= (0x1 << 9);

	GPIOE -> OSPEEDR &= (~(0x3 << 18));

	GPIOE -> PUPDR &= (~(0x3 << 18));
}

do_irq.c

#include"key_it.h"

extern void printf(const char *fmt, ...);
unsigned int i = 0;


void deley(int ms)
{
	for(int i = 0; i < ms; i++)
	{
		for(int j = 0; j < 2000; j++);
	}
}


void do_irq(void) 
{
	int i = 0,j = 0,k = 0;
	int irqno;
	printf("%d\n",irqno);
	irqno = GICC -> IAR & 0x3FF;
	switch(irqno)
	{
	case 99:
		if(i == 0)
		{
			GPIOE -> ODR |= (0x1 << 10);
			GPIOF -> ODR |= (0x1 << 10);
			GPIOE -> ODR |= (0x1 << 8);
			i = 1;
		}
		else
		{
			GPIOE -> ODR &= (~(0x1 << 10));
			GPIOF -> ODR &= (~(0x1 << 10));
			GPIOE -> ODR &= (~(0x1 << 8));
			i = 0;
		}
		printf("KEY1\n");
		GICD -> ICPENDR[3] |= (0x1 << 3);
		EXTI -> FPR1 |= (0x1 << 9);
		break;
	case 97:
		if(j == 0)
		{
			GPIOB -> ODR |= (0x1 << 6);
			j = 1;
		}
		else
		{
			GPIOB -> ODR &= (~(0x1 << 7));
			j = 0;
		}
		printf("KEY2\n");
		GICD -> ICPENDR[3] |= (0x1 << 1);
		EXTI -> FPR1 |= (0x1 << 7);
		break;
	case 98:
		if(k == 0)
		{
			GPIOE -> ODR |= (0x1 << 9);
			k = 1;
		}
		else
		{
			GPIOE -> ODR &= (~(0x1 << 9));
			k = 0;
		}
		printf("KEY3\n");
		GICD -> ICPENDR[3] |= (0x1 << 2);
		EXTI -> FPR1 |= (0x1 << 8);
		break;
	}
	GICC -> EOIR = irqno;
}

main.c

#include "key_it.h"

int main()
{
	all_led_init();
	key3_it_config();
	key_it_config();
	fan_init();
	beep_init();
	while(1)
	{

	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

也许t

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值