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;
}

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;
}

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;
}
文章目录