本文讲述怎样使用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界面:
![Zynq 7000从零开始之四 -- emio的gpio操作_第1张图片](http://img.e-com-net.com/image/info5/b1030da0876c4986b48e17fcaf2b2bbd.jpg)
右击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文件,增加#define
FSBL_DEBUG_INFO
1
2>. 修改helloworld.c文件
#define GPIO_DEVICE_ID
XPAR_XGPIOPS_0_DEVICE_ID
#define
K1_PIN
50
#define
LED34_R_PIN
54
#define
LED34_G_PIN
55
#define
LED34_B_PIN
56
#define
NUM_OF_LED
3
#define
LED_OFF
1
#define
LED_ON
0
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灯会轮流亮灭.