对gpio操作
vivado2019.2 vitis
下载【2_领航者ZYNQ之嵌入式SDK开发指南_V2.0】文档
正点原子视频添加链接描述
读取的xsa文件是vivado生成的wrapper,每次生成的都不一样
然后新建一个application
![
](https://img-blog.csdnimg.cn/direct/4e8c29fc2aff42a6a85bbbe213af5f1f.png)
pynqz2原理图
参考了这个网页
原子的视频
没有编译报错,Xilinx Vitis运行报错executables selected for download on to the following processors doesn‘t exist的解决方法
视频15:30的时刻运行对。
需要注意板子上的跳线帽,启动不是SD启动,是JTAG启动
zynq一共118个io
0-117 in Zynq
查看【XGpioPs_SetDirectionPin】函数,在【xgpiops.c里面】
*
- Set the Direction of the specified pin.
- @param InstancePtr is a pointer to the XGpioPs instance.
- @param Pin is the pin number to which the Data is to be written.
-
Valid values are 0-117 in Zynq and 0-173 in Zynq Ultrascale+ MP.
- @param Direction is the direction to be set for the specified pin.
-
Valid values are 0 for Input Direction, 1 for Output Direction.
- @return None.
MIO有 0-53 一共54个
EMIO 有两个bank 每个32b
编程思路就是:1.先根据器件的ID查找器件的配置信息;2.然后初始化GPIO的驱动3.把GPIO的方向设置为输出;4.设置输出使能;5.写数据到GPIO的输出引脚。
#include "stdio.h"
#include "xparameters.h" //器件参数信息
#include "xstatus.h" //包含XST_FAILURE和XST_SUCCESS的宏定义
#include "xil_printf.h" //包含print()函数
#include "xgpiops.h" //包含PS GPIO的函数
#include "sleep.h" //包含sleep()函数
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define MIO0_PIN 0 //板上的MIO的位置是MIO0 0-117 in Zynq
XGpioPs Gpio; // GPIO设备的驱动程序实例
int main()
{
printf("GPIO MIO TEST!\n\r");
XGpioPs_Config *ConfigPtr;
int Status;
//根据器件ID查询【配置信息】
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
//初始化GPIO【驱动】
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS){
return XST_FAILURE;
}
//设置指定GPIO引脚的【方向】:0输入,1输出
XGpioPs_SetDirectionPin(&Gpio, MIO0_PIN, 1);
//【使能】指定引脚输出:0禁止输出使能,1使能输出
XGpioPs_SetOutputEnablePin(&Gpio, MIO0_PIN, 1);
//写数据到GPIO引脚
XGpioPs_WritePin(&Gpio, MIO0_PIN, 0x1);
return 0;
}
解读MIO-EMIO
视频
右键,端口,选择make external
ZYNQ7020 芯片的 BANK35 内,该 BANK 的供电电压为 3.3V
bank电压分配的问题
然后Bank500有16个IO口,Bank501有38个IO口,共54个;
分出来5个EMIO
使用PL端资源,必须生成bit文件
用的vitis 2019.2 步骤不一样,要新建一个工程,读入xsa,上面生成的
一个空的src
#include "stdio.h"
#include "xparameters.h" //器件参数信息
#include "xstatus.h" //包含XST_FAILURE和XST_SUCCESS的宏定义
#include "xil_printf.h" //包含print()函数
#include "xgpiops.h" //包含PS GPIO的函数
#include "sleep.h" //包含sleep()函数
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define LED0_PIN 58 //板上的EMIO的位置 0-117 in Zynq
#define LED1_PIN 57
#define LED2_PIN 56
#define LED3_PIN 55
#define LED5_G_PIN 54 //bank2 开始54
XGpioPs Gpio; // GPIO设备的驱动程序实例
int main()
{
printf("GPIO MIO TEST!\n\r");
XGpioPs_Config *ConfigPtr;
int Status;
//根据器件ID查询【配置信息】
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
//初始化GPIO【驱动】
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS){
return XST_FAILURE;
}
//设置指定GPIO引脚的【方向】:0输入,1输出
XGpioPs_SetDirectionPin(&Gpio, LED0_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, LED1_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, LED2_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, LED3_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, LED5_G_PIN, 1);
//【使能】指定引脚输出:0禁止输出使能,1使能输出
XGpioPs_SetOutputEnablePin(&Gpio, LED0_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED1_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED2_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED3_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED5_G_PIN, 1);
while(1){
//写数据到GPIO引脚
XGpioPs_WritePin(&Gpio, LED0_PIN, 0x1);
XGpioPs_WritePin(&Gpio, LED1_PIN, 0x1);
XGpioPs_WritePin(&Gpio, LED2_PIN, 0x1);
XGpioPs_WritePin(&Gpio, LED3_PIN, 0x1);
XGpioPs_WritePin(&Gpio, LED5_G_PIN, 0x1);
sleep(1);
XGpioPs_WritePin(&Gpio, LED0_PIN, 0x0);
XGpioPs_WritePin(&Gpio, LED1_PIN, 0x0);
XGpioPs_WritePin(&Gpio, LED2_PIN, 0x0);
XGpioPs_WritePin(&Gpio, LED3_PIN, 0x0);
XGpioPs_WritePin(&Gpio, LED5_G_PIN, 0x0);
sleep(1);
}
return XST_SUCCESS;
}
5个led亮