基于zynq7000的按键中断驱动
创建zynq7000硬件工程
1、新建工程
打开Vivado开发环境
点击create project
如下表操作
开始创建工程
创建完成后,点击检查一下工程是否错误,然后Generate Output Products, 完成后Create HDL Wrapper生成顶层文件。完成之后开始写管脚约束
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_key_4_tri_i[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pl_led_4_tri_o[0]}]
set_property PACKAGE_PIN M15 [get_ports {pl_led_4_tri_o[0]}]
set_property PACKAGE_PIN G14 [get_ports {pl_led_4_tri_o[1]}]
set_property PACKAGE_PIN M17 [get_ports {pl_led_4_tri_o[2]}]
set_property PACKAGE_PIN G15 [get_ports {pl_led_4_tri_o[3]}]
set_property PACKAGE_PIN M19 [get_ports {pl_key_4_tri_i[0]}]
set_property PACKAGE_PIN M20 [get_ports {pl_key_4_tri_i[1]}]
set_property PACKAGE_PIN L16 [get_ports {pl_key_4_tri_i[2]}]
set_property PACKAGE_PIN F16 [get_ports {pl_key_4_tri_i[3]}]
然后生成bit文件
完成后,选择File
Export
打开SDK软件
launch SDK
进入SDK软件开始裸机测试,看看搭建的硬件环境是否正确
创建工程阶段省略
裸机测试代码为
#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xgpio.h"
#include "xscutimer.h"
#include "xil_types.h"
#include "ax_pwm.h"
#include <unistd.h> // usleep()
// Parameter definitions
#define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
#define KEY_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID
#define LED_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
#define INTC_GPIO_INTERRUPT_ID XPAR_FABRIC_AXI_GPIO_1_IP2INTC_IRPT_INTR
#define KEY_INT_MASK XGPIO_IR_CH1_MASK
#define PL_LED_REG_BASSADDR 0x41200000
#define PL_KEY_REG_BASSADDR 0x41210000
#define PL_KEY_REG_INTERRUPT 0x41210128
#define PL_KEY_REG_GIER 0x4121011C
#define PL_KEY_INT_CLEAR 0x41210120
// global variable
XGpio LEDInst;
XGpio KEYInst;
XScuGic INTCInst;
static u8 keyVal;
// forward declaration
static void KeyIntrHandler(void * InstancePtr);
static int IntcInitFunction(u16 DeviceId);
static int InterruptSystemSetup(XScuGic * XScuGicInstancePtr);
int Gunner_In32(int Addr)
{
return *(volatile int *) Addr;
}
void Gunner_Out32(int OutAddress, int Value)
{
*(volatile int *) OutAddress = Value;
}
int main(void)
{
init_platform();
int status;
status = XGpio_Initialize(&KEYInst, KEY_DEVICE_ID);
if(status != XST_SUCCESS)
return XST_FAILURE;
// initial LED
status = XGpio_Initialize(&LEDInst, LED_DEVICE_ID);
if(status != XST_SUCCESS)
return XST_FAILURE;
// initial interrupt controller
status = IntcInitFunction(INTC_DEVICE_ID);
if(status != XST_SUCCESS)
return XST_FAILURE;
Gunner_Out32(XPAR_AX_PWM_0_S00_AXI_BASEADDR, 17179);//200hz
printf(">>> Press PL KEY1 ~ KEY4 one by one, and check the PL LED1 ~ LED4\n");