Zynq 7000从零开始之三 -- mio的gpio操作

本文讲述怎样使用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

时间: 2024-10-11 10:30:42

Zynq 7000从零开始之三 -- mio的gpio操作的相关文章

Zynq 7000从零开始之二 -- 内存测试程序

由于所有的APP都是在DDR中运行的,所以先让DDR工作起来是后续实验的基础.使用的硬件是z-turn开发板. 本文主要讲怎样创建一个内存测试程序,测试DDR,程序还是运行在内部RAM;FPGA涉及的内容有怎样配置DDR参数,及怎样保存和导入硬件参数;软件方面会涉及BSP修改及           BOOT.bin的生成.关于Vivado的具体操作请参考--"Zynq 7000从零开始之一 -- helloworld". 1. 用vivado搭好硬件模型. 在vivado的block

Zynq 7000从零开始之一 -- HelloWord

使用myir的z-turn开发板,做一个从uart打印hello world的实验,只用PS,不用PL部分,程序从SD卡启动,跑在PS的内部RAM. zynq 7000的PS虽然也是CPU,但是开发方法不像普通的CPU只需要一个SDK就可以了,它还需要vivado硬件设计软件. 所以ZYNQ 7000的PS开发需要两个工具,一个是vivado--    另一个是SDK--  . 1. 打开vivado软件-->Create New Project,工程名和目录: 2. next->选RTL P

ZYNQ 7000平台UDP数据包(1字节或2字节)校验和Checksum错误0xFFFF解决方案(linux+vxworks6.9平台)

在赛灵思ZYNQ 7000平台,使用UDP方式发送1字节或者2字节数据时,校验和为错误值0xffff,接收机无法正常接收ZYNQ7000平台发送的数据,本人已经找到该问题的解决方案,有该问题的朋友可以通过邮箱[email protected]与我联系,联系时请详细描述你的环境,针对该咨询提供的问题解决方案会收取一定的费用,费用不会太高,现在是知识付费的年代,希望各位理解,同时如果能够解决您的问题,也是为你节约了开支.我会及时回复邮件的.具体事项可以邮件沟通[email protected].

linux 标准 GPIO 操作

Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现. #include int gpio_request(unsigned gpio, const char *label); 获得并占有 GPIO port 的使用权,由参数 gpio 指定具体 port.非空的label指针有助于诊断.主要告诉内核这块地址被占用了.当其他地方调用同一地址的gpio_request就会报告错误,该地址已经被申请.在/proc/mem有地址占用表

gpio操作(LS1B)

1.一般gpio_request 封装了mem_request(),起保护作用,最后要调用mem_free之类的,主要是告诉内核这个地址被占用了.当其他地方调用同一地址gpio_request就会报告错误,改地址已被申请.在/proc/mem 可以看到有地址占用表描述. 这种用法的保护前提是大家都遵守先申请在访问,有一个地方没有遵守这个规则,这功能就失效了,就好比进程互斥,必须大家在访问临界资源的时候都先获取锁一样,其中一个没有遵守约定,代码报废: 2.__gpio_set_value 和 gp

TI CC2530基础实验(普通GPIO操作——按一下按键亮一下灯)

有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 电路原理图: 分析:需要按一下按键亮一下灯,并且不采用中断方式,即我们需要实时去监测按下是否被按下(P0_4为低电平表示按下,高电平表示松开). 设置: 灯LED1对应的P1_0引脚为普通I/O.方向为输出 按键S1对应的P0_4引脚为普通I/O.方向为输入 程序: /*****************

DA14683开发:GPIO操作

DA14683GPIO操作 勤基科技  陈杰明 添加GPIO初始化函数 在main.c中,添加以下子函数,初始化GPIO口,按键的引脚设置为输入,LED灯的引脚设置为输出. /*按键GPIO设置*/ void key_led_init() { hw_gpio_set_pin_function(HW_GPIO_PORT_1,HW_GPIO_PIN_6, HW_GPIO_MODE_INPUT, HW_GPIO_FUNC_GPIO);//按键 hw_gpio_set_pin_function(HW_G

树莓派高级GPIO库,wiringpi2 for python使用笔记(三)GPIO操作

GPIO库的核心功能,当然就是操作GPIO了,GPIO就是"通用输入/输出"接口,比如点亮一个LED.继电器等,或者通过iic spi 1-wire等协议,读取.写入数据,这都是GPIO的用处,可以说没有GPIO,树莓派只能当小电脑用,有了GPIO,就升级成一个控制器了.先来说说怎么操作一个数字量(高低电平). 先看代码: import wiringpi2 as gpio from wiringpi2 import GPIO gpio.wiringPiSetup() #初始化 gpio

tcc893x基于Linux内核的普通GPIO操作总结

采用非平台方式进行配置GPIO引脚 采用非平台方式进行配置gpio引脚,是直接对其gpio组寄存器进行读写.由于不能直接对寄存器物理地址进行操作,所有需要利用ioremap将gpio寄存器的物理地址映射成虚拟地址 写寄存器:writel(value,对应寄存器的虚拟地址); 读寄存器:value = readl(对应寄存器的虚拟地址); 采用tcc893x平台方式进行配置GPIO引脚 tcc已经帮我们实现一些函数来配置gpio对应引脚功能,常用的4个函数: 定义于:arch/arm/mach-t