【正点原子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.下载验证

略。

总结

无。

相关推荐
FreakStudio11 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘16 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u1521096484917 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150017 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼17 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
wohoo_wangzi17 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘17 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展17 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司17 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑17 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习