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.
右击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灯会轮流亮灭.
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
- Zynq 7000从零开始之四 -- emio的gpio操作
- zynq学习05 Zynq 7000 emio的gpio操作
- Zynq 7000从零开始之三 -- mio的gpio操作
- Xilinx ZYNQ 7000+Vivado2015.2系列(四)之GPIO的三种方式:MIO、EMIO、AXI_GPIO
- ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO 小节
- ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO 小节
- ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO 小节
- 基于Zynq的MIO与EMIO的区别和应用
- zynq学习06 zynq的PL中加入的AXI_GPIO IP核来控制GPIO操作
- MIO EMIO GPIO详解
- ZYNQ+Vivado2015.2系列(十)MIO/EMIO再识,MIO的引脚“复用”,EMIO当作接口连接PL
- Zynq 7000从零开始之二 -- 内存测试程序
- zynq学习笔记——EMIO方式模拟SCCB时序进行读写操作
- Zynq 7000从零开始之一 -- HelloWord
- Zynq7000的MIO和EMIO之区别
- zynq学习03 zynq中三种实现GPIO的方式
- zynq中三种实现GPIO的方式
- zynq中各种GPIO方式的区别
- ASTER数据介绍及报价
- 在AIX 5.3+HACMP 5.4以上环境安装10gR2 10.2.0.1 RAC CRS Clusterware必须先运行Patch 6718715中的rootpre.sh
- Android 混淆代码总结
- HTML特殊字符大全
- js 售磬效果
- Zynq 7000从零开始之四 -- emio的gpio操作
- .NET学习之显式实现接口
- Nginx限制IP并发数与下载速度的方法
- 对于CSS中 background:transparent none repeat scroll 0% 0%;的理解
- 2015去哪儿网春季招聘笔试题及答案
- 前端性能优化(JavaScript补充篇)
- Prefer company
- Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)
- 关于八方向的迷宫问题