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

略。

总结

无。

相关推荐
起个网名真难~7 小时前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
二本咕咕-机械转码7 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
Zwawa9 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·单片机·嵌入式
小李不想当小白9 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
铅笔小新z14 小时前
【stm32】WWDG(窗口看门狗)
stm32·单片机·嵌入式硬件
comyccccc15 小时前
平衡车底板设计:精准布局与高效布线学习笔记
单片机·嵌入式硬件
芯片人00716 小时前
GEK100系列芯片进入上市公司上海移远通信供应链
人工智能·单片机·嵌入式硬件·物联网·芯片
fly_sunnn17 小时前
ADC模数转换器
单片机·嵌入式硬件
我叫洋洋18 小时前
I2C 为什么必须用开漏输出?从推挽短路、线与,到上拉电阻取值
单片机·嵌入式硬件
无敌贵点大王18 小时前
从寄存器层面重学STM32(5)——串口USART理论部分
stm32·单片机·嵌入式硬件