按键输入检测与按键中断

目录

一、按键检测输入

1.1 按键硬件原理图

1.2 按键输入实验

1.3 按键中断

1.3.1 通用中断控制器(GIC)

1.3.2 ARMv7-A 中断向量表的两级查表功能

1.3.3 中断处理流程

1.3.4 GPIO中断相关寄存器

1.3.5 位置无关码

1.3.6 按键中断实验

1.3.7 重定位


一、按键检测输入

1.1 按键硬件原理图

1.2 按键输入实验

按一下按键,LED亮;再按一下按键,LED灭。

led.c文件

#include "common.h"

void led_init(void)
{
	/* 开启 GPIO1 的时钟 */
	CCM->CCGR1 = 0xffffffff;

	/* 将 PAD 引脚复用为 GPIO */
	IOMUXC_SetPinMux(IOMUXC_GPIO1_IO04_GPIO1_IO04, 0);

	/* 设置 GPIO PAD 属性 */
	IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO04_GPIO1_IO04, 0x10B0);

	/* 设置 GPIO 为输出模式 */
	GPIO1->GDIR |= (1 << 4);

	/* 设置 GPIO 为高电平 */
	GPIO1->DR |= (1 << 4);
}

void led_switch(uint8_t flag)
{
	if (flag > 0)
	{
		GPIO1->DR &= ~(1 << 4); // LED_R亮
	}
	else
	{
		GPIO1->DR |= (1 << 4); // LED_R灭
	}
}

btn.c文件

#include "common.h"

void btn_init(void)
{
	/* 开启 GPIO1 的时钟 */
	CCM->CCGR1 = 0xffffffff;

	/* 将 PAD 引脚复用为 GPIO */
	IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0);

	/* 设置 GPIO PAD 属性 */
	IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0);

	/* 设置 GPIO 为输入模式 */
	GPIO5->GDIR &= ~(1 << 1);
}

int btn_input(void)
{
	if ((GPIO5->DR) & (1 << 1))
	{
		delay(0xff);
		if ((GPIO5->DR) & (1 << 1))
		{
			return 1;
		}
	}

	return 0;
}

common.c文件

#include "common.h"

/* 简单延时函数 */
void delay(uint32_t count)
{
	volatile uint32_t i = 0;
	for (i = 0; i < count; ++i)
	{
		__asm("NOP"); /* 调用 nop 空指令 */
	}
}

common.h文件

#ifndef _COMMON_H_
#define _COMMON_H_

#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"

/* 简单延时函数 */
void delay(uint32_t count);
void led_init(void);
void led_switch(uint8_t flag);
void btn_init(void);
int btn_input(void);

#endif /* _COMMON_H_ */

main.c文件

#include "common.h"

int main()
{
	int i = 0;

	led_init();
	btn_init();

	while (1)
	{
		if (btn_input())
		{
			if (i == 0)
			{
				i = 1;
				led_switch(1);
			}
			else
			{
				i = 0;
				led_switch(0);
			}
			delay(0xFFFFF);
			while (btn_input())
			{
			}
		}
	}

	return 0;
}

1.3 按键中断

复制SDK的中断头文件:CORTEXA/Include/core_ca7.h文件

        注释掉:#include "core_ca.h"                /* Core Instruction and Function Access */

        添加:

#define __STRINGIFY(x) #x
/*C语言实现写cp15协处理器*/
#define __MCR(coproc, opcode_1, src, CRn, CRm, opcode_2)                    \
  __ASM volatile("MCR " __STRINGIFY(p##coproc) "," __STRINGIFY(opcode_1) "," \
                                                                        "%0," __STRINGIFY(c##CRn) "," __STRINGIFY(c##CRm) "," __STRINGIFY(opcode_2)::"r"(src))

/*C语言实现读cp15协处理器*/
#define __MRC(coproc, opcode_1, CRn, CRm, opcode_2)                                                                                                                   \
  ({                                                                                                                                                                  \
    uint32_t __dst;                                                                                                                                                   \
    __ASM volatile("MRC " __STRINGIFY(p##coproc) "," __STRINGIFY(opcode_1) ","                                                                                         \
                                                                          "%0," __STRINGIFY(c##CRn) "," __STRINGIFY(c##CRm) "," __STRINGIFY(opcode_2) : "=r"(__dst)); \
    __dst;                                                                                                                                                            \
  })

#define __ISB()
#define __DSB()

1.3.1 通用中断控制器(GIC)

GIC用于管理单核或多核芯片中的中断资源。

        ARM公司开发了4个版本GIC规范,V1~V4。

        ARMV7-A内核搭配GIC-400(GIC_V2)使用。

GIC官方手册:ARM Generic Interrupt Controller。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值