目录
一、按键检测输入
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。