Zynq 7000从零开始之四 -- emio的gpio操作

来源:互联网 发布:修改手机imei软件 编辑:程序博客网 时间:2024/04/28 01:00
本文讲述怎样使用emio功能的gpio,涉及到fpga部分,软件涉及到一级引导程序fsbl的创建及app的创建,程序运行在ddr中.
zynq-7000的PS只有54个引脚可用(port0,port1), port2,port3的引脚可以通过EMIO在PL端引出.
zturn开发板的三色灯D34连接到PL端的io,通过emio控制这三个灯亮灭.


1. 用vivado搭建硬件模型.
1.1> 在block design的Re-customize IP界面,点击Presets->Apply Configuration, 定位到上章导出的memtest.tcl硬件配置文件.
点击MIO configuration->展开GPIO,选中GPIO MIO和EMIO GPIO,EMIO GPIO值设置为3,将硬件参数导出为emio-gpio.tcl.

1.2> 回到block design界面:

 
右击GPIO_0->Make External将端口名修改为LED_RGB.


1.3> 分配引脚
将工程run synthesis和run implementation之后->open implemented design, 打开引脚配置界面layout->I/O Planning,将led_rgb_tri_io设置如下
 


1.4> 生成bitstream和导出硬件配置文件
引脚分配之后,生成fpga的配置文件--bitstream,点击Flow Navigator下的Program and Debug->Generate Bitstream生成bitstream.
导出硬件配置文件的时候要勾上include bitstream,然后在vivado中打开SDK.


2. 在SDK中编辑软件
sdk中的一级引导程序fsbl主要功能是将bitstream下载到fpga中和加载app到ddr中运行,所以这里要建立两个工程,fsbl和app.


2.1 创建一级引导程序fsbl
File->New->Application,参数如下:
 
点击Next->选择Zynq FSBL->Finish.完成后多了两个工程,fsbl和fsbl_bsp,记得把fsbl_bsp的sd卡驱动改成2.2版本的.


2.2 创建app工程
File->New->Application,参数如下:

 


注意Board Support Package选已创建好的fsbl_bsp,不要创建新的了.点击Next->选择Hello World->Finish.


2.3 修改源码
1>. 增加fsbl的打印信息
   在fsbl的src目录下,修改fsbl_debug.h文件,增加#defineFSBL_DEBUG_INFO1
2>. 修改helloworld.c文件
#define GPIO_DEVICE_ID   XPAR_XGPIOPS_0_DEVICE_ID
#define K1_PIN50
#define LED34_R_PIN54
#define LED34_G_PIN55
#define LED34_B_PIN56
#define NUM_OF_LED3
#define LED_OFF1
#define LED_ON0


struct led_status_s {
int pin;
int status;
};


static struct led_status_s g_led_status[NUM_OF_LED] = {
{.pin = LED34_R_PIN, .status = LED_OFF},
{.pin = LED34_G_PIN, .status = LED_OFF},
{.pin = LED34_B_PIN, .status = LED_OFF},
};

int main(void)
{
int Status;
int cnt = 0;
int i = 0;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio; /* The driver instance for GPIO Device. */


    init_platform();


    // EMIO GPIO Test
    print("EMIO gpio test\n\r");
/*
* Initialize the GPIO driver.
*/
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
print("cfg init err\n");
return XST_FAILURE;
}
/*
* Set the direction for the pin to be output and
* Enable the Output enable for the LED Pin.
*/
XGpioPs_SetDirectionPin(&Gpio, LED34_R_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, LED34_G_PIN, 1);
XGpioPs_SetDirectionPin(&Gpio, LED34_B_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED34_R_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED34_G_PIN, 1);
XGpioPs_SetOutputEnablePin(&Gpio, LED34_B_PIN, 1);


/*
* Set the GPIO output to be high
*/
XGpioPs_WritePin(&Gpio, LED34_R_PIN, LED_OFF);
XGpioPs_WritePin(&Gpio, LED34_G_PIN, LED_OFF);
XGpioPs_WritePin(&Gpio, LED34_B_PIN, LED_OFF);


// KEY1 GPIO Setting
XGpioPs_SetDirectionPin(&Gpio, K1_PIN, 0);
XGpioPs_SetOutputEnablePin(&Gpio, K1_PIN, 0);

    while (1) {
    Status = XGpioPs_ReadPin(&Gpio,K1_PIN);
    if (!Status) {
    xil_printf("K1 Press %d, GPIO=%d\n\r", cnt++, g_led_status[i].pin);
    while (!XGpioPs_ReadPin(&Gpio,K1_PIN));


    g_led_status[i].status ^= 1;
    XGpioPs_WritePin(&Gpio, g_led_status[i].pin, g_led_status[i].status);
    if (++i >= sizeof(g_led_status)/sizeof(g_led_status[0])) {
    i = 0;
    }
    }
    }


    cleanup_platform();
    return 0;
}

4. 生成BOOT.bin下载到z-turn板子上运行

编译完成后,右击Project Explorer的fsbl工程->Create Boot Image.
将emio-rgb-led.elf添加进来:
 
将gpio\gpio.sdk\fsbl\bootimage\文件夹下的BOOT.bin copy到SD卡上,按按键K1,LED灯会轮流亮灭.
0 0
原创粉丝点击