ZYNQ学习笔记(十六)MIO和EMIO下的GPIO分析和实例

视频十六:MIO和EMIO下的GPIO分析和实例
General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。

学习目的:
1,能够查看数据手册知道如何控制GPIO的输入输出。(手册)
2,了解EMIO的GPIO的序号换算以及对应,能够调用库函数实现对GPIO的读写。
3,继续熟悉VIVADO,SDK开发环境,展示了如何做FSBL,以及如何生成启动文件BOOT.BIN和QSPI FLASH启动文件。(操作)

1,UG585里面看看GPIO部分。总结出一下几点:
1),DATA_RO 寄存器是读端口数值。
2),DATA 是数据输出寄存器。
3),DIRM,OEN分别是方向控制寄存器和输出使能寄存器。
4), MASK_DATA_LSW是每个BANK低16位的输出控制,包括掩码位和数据位。(注意和DATA功能有重叠)
2,VIVADO下配置GPIO注意分别注意MIO和EMIO的GPIO。
1),MIO的GPIO对应的BANK是BANK0,BANK1。是其他功能使用剩余之后MIO可以做为GPIO.这是FIXIO有固定对应的引脚,不需要用户约束引脚。其实现仅仅依靠PS部分,即使用是PL可以不配置。共有32+22=54个,在SDK内的编号是0-53.
2),EMIO的GPIO对应的BANK0和BANK2,这些IO是不被复用的,并且可以接到FPGA的引脚,也可以连接外部的FPGA逻辑,是非常灵活的扩展,其实现依靠PS和PL系统完成。共有32+32=64个,在SDK内部的编号对应从54-117.
我们试验采用四个GPIO,两两分别来自MIO和EMIO,MIO用了一个KEY和LED,EMIO部分用了一个SWITCH和一个LED。这样就能达到分别试验MIO和EMIO,以及两种情况下的输入和输出。
配置好可以修改顶层文件,并对应约束PL部分的引脚。之后等待生成BIT流文件。
3,进入SDK开发环境,我们根据寄存器的含义(UG585 附表B)自己编写一个C驱动,使MIO的部分能演示输入输出正常工作。结论是我们应该能够对照寄存器写驱动,这是基本功!必须掌握,官方提供的库可以调用,只是为了利用现有的技术资源提高效率,决不能依赖。
4,我们调用库进行输入输出的测试,分析一下XGPIOPS的函数,了解其内容含义。之后自己简单的封装。做一个输入输出试验从而验证两方面内容:
1 ) 能够正确使用函数
2 ) 关于EMIO_GPIO编号和SDK的函数库的统一编号的对应关系正确。
5,总结,启发:
1)注意GPIO这个AXI的PL外设IP,在此虽然都叫做GPIO但是没有任何联系。GPIO_IP仅仅是一个最简单的AXI外设。而MIO和EMIO的GPIO是直接受PS控制,其中EMIO还受PL的控制。
2)分析IOBUF的实现。FPGA内部没有三态(高阻态),三态只允许出现在引脚的PAD上。注意三态线路只允许引出到顶层。逻辑内部不允许有三态,如果有,工具会对应做一些等效改变。
3)我们看到在顶层的代码里面例化了双向IO,我们可以想:如果分别接出是不是即可以做输入又可以做输出。实际是可以的,大家可以后面自己做试验例证一下。这样实际就可以将EMIO的64个双向IO扩展64个输入和64个输出。
4) 开发环境可能有BUG,不纠结,要尽快判断出。试验过程为了不分散大家注意力,特意避开了这个BUG。我使用的是VIVADO2015.4
→PDF文档:gpio的介绍(p384)
在这里插入图片描述

1.模块化设计(ip剪裁)

→建立项目→create block designed(创建块设计)→增加zynq ip →编辑ip→下图为修改内容
在这里插入图片描述

→把gpio_0引出→连接axi
在这里插入图片描述

→鼠标右击→create output products→create hdl wrapper→在顶层文件修改如下:
inout SW;
inout LED;
在这里插入图片描述

LED,SW); // gpio_0_tri_io);(把端口名称改了)

在这里插入图片描述
在这里插入图片描述

增加约束文件
→add source →略
#led
set_property PACKAGE_PIN T22 [get_ports {LED}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED}]

#sw
set_property PACKAGE_PIN F22 [get_ports {SW}]
set_property IOSTANDARD LVCMOS33 [get_ports {SW}]

→保存→生成比特流文件→export hardware→launch sdk
→新建hello project→拷贝寄存器直接控制代码(文件夹里面有)

// void my_gpio_wr(int off,int v){ * ( (volatile unsigned int *)(0xe000a000+off) ) = v ;}
#define my_gpio_wr(a,v) * ( (volatile unsigned int *)(0xe000a000+a) ) = v
void main(void){
init_platform();
my_gpio_wr( 0x204, 1<<7 );//DIRM0
my_gpio_wr( 0x208, 1<<7 );//OEN0
while(1){
my_gpio_wr( 0x40, 1<<7 );//DATA
sleep(1);
my_gpio_wr( 0x40, 0x0 );//DATA
sleep(1);
}
}
→保存→下载bit文件→run as→launch hardware→下载成功后液晶右边的红色小灯mo7会闪烁
在这里插入图片描述

这个是pdf文档看它的基地址用的;程序里面会用到;

2.sdk 编译驱动程序

→sdk里新建project→选择

2.1制作启动文件boot.bin和 boot.mcs;

设置为发布状态:→build all
在这里插入图片描述

→把bit文件拷贝过去;(16视频里boot_img文件夹)
→\project_16\project_16.sdk\FSBL\Release的FSBL.elf拷过去
→同样的把gpio.elf拷贝过去;

→点击makeboot 生成boot.bin 和boot.mcs,
→boot.bin拷贝到sd卡里面(设置sd卡启动就可以实现刚才的调试结果);boot.mcs拷贝到 Flash里面;

→把这个替换hello里面的程序
#include “xgpiops.h”
XGpioPs Instance ;
XGpioPs_Config Config ;
void set_gpio(int pin ,int val)
{
XGpioPs_SetOutputEnablePin(&Instance , pin, 1 );
XGpioPs_SetDirectionPin(&Instance ,pin, 1 );
XGpioPs_WritePin(&Instance ,pin , (val!=0) );
}
int get_gpio(int pin ){
XGpioPs_SetDirectionPin(&Instance, pin, 0);
XGpioPs_SetOutputEnablePin(&Instance,pin, 0);
return ( 0!= XGpioPs_ReadPin(&Instance, pin ) ) ;
}
int main(){
init_platform();
XGpioPs_CfgInitialize ( &Instance , &Config,0xe000a000 );
while(1)
{
set_gpio(7,get_gpio(50));
set_gpio(55,get_gpio(54));
}
}

→sdk 会出现生成gpio.elf,把他复制到制作.bin的文件夹里面重新制作.bin
把boot.bin 拷贝到sd卡启动出现按bt8 一下 ,亮一下,开sw1,led1亮;

这个是sd卡制作的启动;也可以直接在sdk里下载进去进行debug,结果是一样的。(我实验过的,时间可能有点长,能成功)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值