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

略。

总结

无。

相关推荐
zlinear数据采集卡27 分钟前
D223的DDS信号发生器:10000点查找表与4通道16位DAC波形输出
arm开发·嵌入式硬件·fpga开发·开源
大爱编程♡12 小时前
GPIO-I2C
stm32·单片机·嵌入式硬件
振南的单片机世界14 小时前
PVD掉电中断——让单片机“咽气前”写完遗书
arm开发·stm32·单片机·嵌入式硬件
续写烂尾16 小时前
SD NAND存储实测:正点原子STM32精英板SDIO读写验证全流程
stm32·单片机·嵌入式硬件
zlinear数据采集卡18 小时前
USB HS 480M高速传输与SRAM记录仪:DABM-D223数据存储系统全解析
arm开发·嵌入式硬件·fpga开发·开源
wuyk55519 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
Crkylin19 小时前
Cortex-M SysTick系统滴答定时器详解
单片机·嵌入式硬件
Hello_Damon_Nikola20 小时前
AC7911从入门到精通
开发语言·嵌入式硬件·物联网·php
gscsded20 小时前
AUTOSAR CanTp 模块学习笔记
单片机·嵌入式硬件·汽车
Hello_Damon_Nikola20 小时前
扰流筋从原理到应用
人工智能·单片机·嵌入式硬件