Zynq 7000从零开始之三 -- mio的gpio操作
来源:互联网 发布:数据还原 编辑:程序博客网 时间:2024/06/11 20:06
本文讲述怎样使用PS的gpio,不涉及fpga部分,软件涉及到一级引导程序fsbl的创建及app的创建,程序运行在ddr中.
z-turn板的mio 50引脚连接到了按键K1,该实验实现的功能为,检测按键并从串口打印出相应的信息.
1. 用vivado搭建硬件模型.
在block design的Re-customize IP界面,点击Presets->Apply Configuration, 定位到上章导出的memtest.tcl硬件配置文件.
点击MIO configuration->展开GPIO,选中GPIO MIO.将硬件参数导出为gpio.tcl.
综合完之后导出硬件参数,从vivado启动SDK.
2. 在SDK中编辑软件
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文件
#include <stdio.h>
#include "platform.h"
#include "xgpiops.h"
#include "xil_printf.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define K1_PIN 50
int main()
{
int Status;
int cnt = 0;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio; /* The driver instance for GPIO Device. */
init_platform();
print("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;
}
// K1 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\n\r", cnt++);
while (!XGpioPs_ReadPin(&Gpio, K1_PIN));
}
}
cleanup_platform();
return 0;
}
4. 生成BOOT.bin下载到z-turn板子上运行
编译完成后,右击Project Explorer的fsbl工程->Create Boot Image.
将gpio.elf添加进来:
CPU上电时,会先运行fsbl,fsbl再将gpio的代码copy到ddr中运行,查看gpio的链接文件可知gpio程序是在ddr中运行的.
将gpio\gpio.sdk\fsbl\bootimage\文件夹下的BOOT.bin copy到SD卡上,插到z-turn板上运行,会出现以下串口信息:
Xilinx First Stage Boot Loader
Release 2014.4 Jan 22 2015-11:39:25
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60600000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x00003003
Data Word Len: 0x00003003
Partition Word Len:0x00003003
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000055D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFDF17C5
Application
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
gpio test
K1 Press 0
K1 Press 1
K1 Press 2
K1 Press 3
K1 Press 4
K1 Press 5
K1 Press 6
z-turn板的mio 50引脚连接到了按键K1,该实验实现的功能为,检测按键并从串口打印出相应的信息.
1. 用vivado搭建硬件模型.
在block design的Re-customize IP界面,点击Presets->Apply Configuration, 定位到上章导出的memtest.tcl硬件配置文件.
点击MIO configuration->展开GPIO,选中GPIO MIO.将硬件参数导出为gpio.tcl.
综合完之后导出硬件参数,从vivado启动SDK.
2. 在SDK中编辑软件
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文件
#include <stdio.h>
#include "platform.h"
#include "xgpiops.h"
#include "xil_printf.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define K1_PIN 50
int main()
{
int Status;
int cnt = 0;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio; /* The driver instance for GPIO Device. */
init_platform();
print("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;
}
// K1 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\n\r", cnt++);
while (!XGpioPs_ReadPin(&Gpio, K1_PIN));
}
}
cleanup_platform();
return 0;
}
4. 生成BOOT.bin下载到z-turn板子上运行
编译完成后,右击Project Explorer的fsbl工程->Create Boot Image.
将gpio.elf添加进来:
CPU上电时,会先运行fsbl,fsbl再将gpio的代码copy到ddr中运行,查看gpio的链接文件可知gpio程序是在ddr中运行的.
将gpio\gpio.sdk\fsbl\bootimage\文件夹下的BOOT.bin copy到SD卡上,插到z-turn板上运行,会出现以下串口信息:
Xilinx First Stage Boot Loader
Release 2014.4 Jan 22 2015-11:39:25
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60600000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x00003003
Data Word Len: 0x00003003
Partition Word Len:0x00003003
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000055D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFDF17C5
Application
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
gpio test
K1 Press 0
K1 Press 1
K1 Press 2
K1 Press 3
K1 Press 4
K1 Press 5
K1 Press 6
1 0
- Zynq 7000从零开始之三 -- mio的gpio操作
- Zynq 7000从零开始之四 -- emio的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学习05 Zynq 7000 emio的gpio操作
- ZYNQ-702裸机之MIO使用
- 基于Zynq的MIO与EMIO的区别和应用
- zynq学习06 zynq的PL中加入的AXI_GPIO IP核来控制GPIO操作
- MIO EMIO GPIO详解
- 【ZYNQ-7000开发之三】ZYNQ平台的HDMI驱动测试
- Zynq boot mode MIO 配置
- ZYNQ+Vivado2015.2系列(十)MIO/EMIO再识,MIO的引脚“复用”,EMIO当作接口连接PL
- Zynq 7000从零开始之二 -- 内存测试程序
- Zynq 7000从零开始之一 -- HelloWord
- Zynq7000的MIO和EMIO之区别
- Xilinx ZYNQ 7000+Vivado2015.2系列(五)之ZYNQ的三种启动方式-JTAG、SD card、Flash
- 经典 C++ 书籍大全
- 二分法Code与注意事项
- git相关教程
- 开始PHP学习之旅吧
- Android防止内存溢出浅析
- Zynq 7000从零开始之三 -- mio的gpio操作
- C++中常见const用法小结
- HTML5 零二
- Beyond Compare使用教程
- IDEA常用设置及优化
- c-c++程序员应知道的几个基本问题
- 使用 ApiGen 生成开发文档
- sprintf函数的用法
- C/C++内存区分配