【正点原子ZYNQ领航者7020】PS端GPIO中断→按键控制LED实验

文章目录

前言

无,仅作记录,不具有参考价值。在按键交叉控制LED实验工程上进行修改。

1.创建Vivado工程

略。

2.Vitis软件设计

1.在 Vitis 中创建应用工程

略。

2.编写代码

在创建main.c之后编写以下代码:

c 复制代码
#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#include "xil_exception.h"

#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define MIO_LED0		7
#define MIO_LED1		8
#define MIO_KEY0		12
#define MIO_KEY1		11
#define GPIO_INTERRUPT_ID	XPAR_XGPIOPS_0_INTR
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID

void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId);
void IntrHandler(void *CallBackRef, u32 Bank, u32 Status);

XGpioPs Gpio; //GPIO器件驱动实例
XScuGic Intc; //GIC器件驱动实例
u8 key0_press = 0;
u8 key1_press = 0;
u32 ps_key0_value;
u32 ps_key1_value;
u8 led0_val = 0;
u8 led1_val = 0;
int main(void)
{
	//对GPIO驱动进行初始化
	XGpioPs_Config *ConfigPtr;

	//根据器件ID来去查找器件的配置信息
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	//对GPIO的驱动进行初始化
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
	//设置引脚的方向 0:输入 1:输出
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED0, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO_LED1, 1);
	XGpioPs_SetDirectionPin(&Gpio, MIO_KEY0, 0);
	XGpioPs_SetDirectionPin(&Gpio, MIO_KEY1, 0);
	//设置输出使能 1:使能输出 0:不使能输出
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED1, 1);
	//给引脚初始化电平
	XGpioPs_WritePin(&Gpio, MIO_LED0, led0_val);
	XGpioPs_WritePin(&Gpio, MIO_LED1, led1_val);


	//GPIO中断配置
	SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);
	printf("GPIO Interrupt test!\n");
	while(1)
	{
		if(key0_press)
		{
			usleep(20000);
			ps_key0_value = XGpioPs_ReadPin(&Gpio, MIO_KEY0);
			if(ps_key0_value == 0)
			{
				led0_val = !led0_val;
				XGpioPs_WritePin(&Gpio, MIO_LED0, led0_val);
			}
			else
			{
				;
			}
			key0_press = 0;
			//使能GPIO引脚的中断
			XGpioPs_IntrEnablePin(&Gpio, MIO_KEY0);
		}
		if(key1_press)
		{
			usleep(20000);
			ps_key1_value = XGpioPs_ReadPin(&Gpio, MIO_KEY1);
			if(ps_key1_value == 0)
			{
				led1_val = !led1_val;
				XGpioPs_WritePin(&Gpio, MIO_LED1, led1_val);
			}
			else
			{
				;
			}
			key1_press = 0;
			//使能GPIO引脚的中断
			XGpioPs_IntrEnablePin(&Gpio, MIO_KEY1);
		}
	}
	return 0;
}

void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId)
{
	XScuGic_Config *IntcConfig; //GIC配置信息的驱动实例


	//根据中断控制器的器件ID来查找配置信息
	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
	//根据查找到的配置信息初始化中断控制器
	XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
	//关联GPIO中断处理程序
	XScuGic_Connect(GicInstancePtr, GpioIntrId, (Xil_ExceptionHandler)IntrHandler, (void *)Gpio);
	//设置GPIO中断的触发类型,下降沿
	XGpioPs_SetIntrTypePin(Gpio, MIO_KEY0, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
	XGpioPs_SetIntrTypePin(Gpio, MIO_KEY1, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
	//使能GPIO引脚的中断
	XGpioPs_IntrEnablePin(Gpio, MIO_KEY0);
	XGpioPs_IntrEnablePin(Gpio, MIO_KEY1);
	//使能GIC的GPIO中断
	XScuGic_Enable(GicInstancePtr, GpioIntrId);

	//异常初始化
	Xil_ExceptionInit();
	//注册中断请求异常的处理程序
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
				(Xil_ExceptionHandler)XScuGic_InterruptHandler,
				GicInstancePtr);
	//使能异常处理
	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
}

void IntrHandler(void *CallBackRef, u32 Bank, u32 Status)
{
	XGpioPs *Gpio = (XGpioPs *)CallBackRef;
	printf("GPIO Interrupt detect!\n");

	if(XGpioPs_IntrGetStatusPin(Gpio,MIO_KEY0))
	{
		key0_press = 1;
		//关闭GPIO引脚的中断
		XGpioPs_IntrDisablePin(Gpio, MIO_KEY0);
		printf("key0down\n");
		//清除对应引脚引发中断的标志位
		XGpioPs_IntrClearPin(Gpio, MIO_KEY0);
	}
	if(XGpioPs_IntrGetStatusPin(Gpio,MIO_KEY1))
	{
		key1_press = 1;
		//关闭GPIO引脚的中断
		XGpioPs_IntrDisablePin(Gpio, MIO_KEY1);
		printf("key1down\n");
		//清除对应引脚引发中断的标志位
		XGpioPs_IntrClearPin(Gpio, MIO_KEY1);
	}

}

3.下载验证

略。

总结

无。

相关推荐
朝饮坠露兮9 小时前
#浮动源 vs 共地源:模拟 IC 测试中的 VI 源架构详解
嵌入式硬件
安妮细水长流11 小时前
汽车电子面试问题记录
单片机
碎光拾影12 小时前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
wuyk55515 小时前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
梅名智15 小时前
找不到libm.so, libc.so
嵌入式硬件
CPETW15 小时前
企业版配套软件介绍 ---- USB TO SPI 3.0-Slave
网络·科技·单片机·嵌入式硬件·电子
piaoyiren15 小时前
STM32 综合温控风扇控制系统
stm32·单片机·嵌入式硬件·oled·lcd1602·hc-05蓝牙
Echo_cy_17 小时前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
武汉万象奥科17 小时前
万象奥科OpenHarmony 6.1 LTS适配完成,RK3576核心板再添新生态
arm开发·嵌入式硬件·物联网·rk3576·arm核心板
亿道电子Emdoor18 小时前
【Arm】解决Keil MDK无法查看外设寄存器的问题
stm32·单片机·嵌入式硬件