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

略。

总结

无。

相关推荐
ye150127774551 小时前
4.2V升6V1A同步升压WT3213
单片机·嵌入式硬件·其他·硬件工程
嵌入式小站2 小时前
STM32 可移植教程 02:按键状态机,消抖、长按、释放一行也不用多写(实战篇)
chrome·vscode·stm32·单片机·嵌入式硬件
Szime3 小时前
AD9694 国产替代方案:四通道高速 ADC 在通信与雷达项目中的选型参考
单片机·嵌入式硬件·fpga开发
fanged3 小时前
Datasheet学习6(光机)
嵌入式硬件
芯岭技术郦4 小时前
高性能的 32 位 ARM® Cortex®-M0+内核PY32F002A
单片机·嵌入式硬件
破晓单片机4 小时前
060、STM32项目分享:养老智能手环系统
stm32·单片机·嵌入式硬件
H__Rick5 小时前
C51学习-DAY4
嵌入式硬件·学习·51单片机·硬件工程
csg11075 小时前
PIC16F1947驱动CH376芯片实现SD卡数据存储
单片机·嵌入式硬件·物联网·自动化
H__Rick6 小时前
C51学习-DAY8
单片机·嵌入式硬件·学习