文章目录
-
- 前言
-
- 1.创建Vivado工程
- 2.Vitis软件设计
-
- [1.在 Vitis 中创建应用工程](#1.在 Vitis 中创建应用工程)
- 2.编写代码
- 3.下载验证
- 总结
前言
无,仅作记录,不具有参考价值。在按键交叉控制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.下载验证
略。
总结
无。