为了更好的浏览体验,请不要在本页面禁用 Javascript
2019-12-02
 Tags: 

Zynq7000三种GPIO的使用之点亮流水灯摘要

MIO
直接使用PS部分的MIO。
由于MIO属于PS部分,不需要进行块设计,因而不用进行Program FPGA。
另外,由于MIO上的大部分引脚已被固定,因而可操作的Pins几乎没有,下面仅操作D3这一绿色LED灯使之闪烁。
SDK代码:
#include"xparameters.h"//硬件参数定义 #include"xgpiops.h"//PS部分的GPIO的库函数 #include"xil_printf.h"//串口输出库函数 #include"xstatus.h"//状态码定义头文件 #include"xplatform_info.h"//平台定义头文件 #define D3_PINNUM 0x00 /*D3的PS GPIO的通道*/ #define SLEEP_DELAY 10000000/**/ int main(){ XGpioPs Gpio; /*GPIO driver的实例*/ xil_printf("流水灯开始跑起来吧!\\r\\n"); //测试目标板子的芯片 int typeOfboard=XGetPlatform_Info(); switch(typeOfboard){ case XPLAT_ZYNQ_ULTRA_MP: xil_printf("这是ZYNQ_ULTRA型开发版\\r\\n"); break; case XPLAT_ZYNQ: xil_printf("这是ZYNQ型开发版\\r\\n"); break; } //初始化PS部分的GPIO Driver XGpioPs_Config* cfgPtr=XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID); int Status=XGpioPs_CfgInitialize(&Gpio,cfgPtr,cfgPtr->BaseAddr); if(XST_SUCCESS!=Status){ xil_printf("您PS部分的GPIO Driver好像初始化失败呢!\\r\\n"); return XST_FAILURE; } //设置GPIO Driver的某通道的all pins为输出 XGpioPs_SetDirectionPin(&Gpio,D3_PINNUM,0x01); //允许all pins能够输出 XGpioPs_SetOutputEnablePin(&Gpio,D3_PINNUM,0X01); XGpioPs_WritePin(&Gpio,D3_PINNUM,0x00);//全亮 volatile int Delay;//volatile声明其为易变的变量,编译器不优化。 u32 blink_led_pos; while(1){ for(int i=0;i<8;i++){ XGpioPs_Write(&Gpio,D3_PINNUM,i%2); for(Delay=0;Delay<3*SLEEP_DELAY;Delay++);//延时 } } XGpioPs_Write(&Gpio,D3_PINNUM,0x00);//全亮 for(Delay=0;Delay<2*SLEEP_DELAY;Delay++); XGpioPs_Write(&Gpio,D3_PINNUM,0x01);//全灭 xil_printf("这边提醒您,流水灯成功跑了耶!\\r\\n"); return XST_SUCCESS; }
C
EMIO
EMIO属于PS,却被连接到PL
IP 配置
关GPIO MIO[可选],并打开EMIO,位数设置8
关M AXI GPIO Interface[可选]
块设计:
生成bitstream文件后,打开SDK新建项目。
SDK代码:
#include"xparameters.h"//硬件参数定义 #include"xgpiops.h"//PS部分的GPIO的库函数 #include"xil_printf.h"//串口输出库函数 #include"xstatus.h"//状态码定义头文件 #include"xplatform_info.h"//平台定义头文件 #define LED_BANK 0x02 /*流水灯的PS GPIO的通道*/ #define SLEEP_DELAY 10000000/**/ #define LED_POS 0x01 /*指向第几号流水灯*/ int main(){ XGpioPs Gpio; /*GPIO driver的实例*/ xil_printf("流水灯开始跑起来吧!\\r\\n"); //测试目标板子的芯片 int typeOfboard=XGetPlatform_Info(); switch(typeOfboard){ case XPLAT_ZYNQ_ULTRA_MP: xil_printf("这是ZYNQ_ULTRA型开发版\\r\\n"); break; case XPLAT_ZYNQ: xil_printf("这是ZYNQ型开发版\\r\\n"); break; } //初始化PS部分的GPIO Driver XGpioPs_Config* cfgPtr=XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID); int Status=XGpioPs_CfgInitialize(&Gpio,cfgPtr,cfgPtr->BaseAddr); if(XST_SUCCESS!=Status){ xil_printf("您PS部分的GPIO Driver好像初始化失败呢!\\r\\n"); return XST_FAILURE; } //设置GPIO Driver的某通道的all pins为输出 XGpioPs_SetDirection(&Gpio,LED_BANK,0xFF); //允许all pins能够输出 XGpioPs_SetOutputEnable(&Gpio,LED_BANK,0XFF); XGpioPs_Write(&Gpio,LED_BANK,0x00);//全亮 volatile int Delay; u32 blink_led_pos; while(1){ for(int i=0;i<8;i++){ blink_led_pos=~(LED_POS<<i);//让某个灯亮,取反操作 xil_printf("blink_led_pos = %x\\n",blink_led_pos&0xFF); XGpioPs_Write(&Gpio,LED_BANK,blink_led_pos); for(Delay=0;Delay<3*SLEEP_DELAY;Delay++);//延时 } } XGpioPs_Write(&Gpio,LED_BANK,0x00);//全亮 for(Delay=0;Delay<2*SLEEP_DELAY;Delay++); XGpioPs_Write(&Gpio,LED_BANK,0xFF);//全灭 xil_printf("这边提醒您,流水灯成功跑了耶!\\r\\n"); return XST_SUCCESS; }
C
AXI GPIO
IP配置:
关掉GPIO MIO和EMIO[可选]
打开AXI GPIO Interface
块设计:
SDK代码:
#include"xparameters.h"//硬件参数定义 #include"xgpio.h"//GPIO库函数 #include "xil_printf.h"//串口输出库函数 #define WATERFALL_LED_CHANNEL 1 /*流水灯的GPIO的通道*/ #define SLEEP_DELAY 10000000/**/ #define LED_POS 0x01 /*指向第几号流水灯*/ int main(){ XGpio Gpio; /*GPIO driver的实例*/ xil_printf("流水灯开始跑起来吧!\\n"); //初始化GPIO Driver int Status=XGpio_Initialize(&Gpio,XPAR_GPIO_0_DEVICE_ID);//设备ID在xparameters.h中查看 if(XST_SUCCESS!=Status){ xil_printf("您的GPIO Driver好像初始化失败呢!"); return XST_FAILURE; } //设置GPIO Driver的某通道为输出 XGpio_SetDataDirection(&Gpio,WATERFALL_LED_CHANNEL,0); volatile int Delay; int j=0; u32 blink_led_pos; while(++j<4){ for(int i=0;i<8;i++){ blink_led_pos=~(LED_POS<<i);//让某个灯亮,取反操作 xil_printf("blink_led_pos = %x\\n",blink_led_pos&0xFF); XGpio_DiscreteWrite(&Gpio,WATERFALL_LED_CHANNEL,blink_led_pos); for(Delay=0;Delay<2*SLEEP_DELAY;Delay++);//延时 } } XGpio_DiscreteWrite(&Gpio,WATERFALL_LED_CHANNEL,0x00);//全亮 for(Delay=0;Delay<2*SLEEP_DELAY;Delay++); XGpio_DiscreteWrite(&Gpio,WATERFALL_LED_CHANNEL,0xFF);//全灭 xil_printf("这边提醒您,流水灯成功跑了耶!\\n"); return XST_SUCCESS; }
C
Modified based on gine-blog