gpio的结构体系
zynq的gpio,分为两种,mio(multiuse i/o)和emio(extendable multiuse i/o)。
zynq的gpio由4个bank组成,其体系结构如图1所示。其中bank0有32个gpio引脚,bank1有22个引脚,共54个gpio引脚直接通过mio连接到ps上,每个引脚可以通过寄存器的设置来确定该引脚为输入、输出或者中断,因为54个mio引脚直接连接在ps上,像其他普通arm一样,不需要通过xps进行硬件配置,直接通过sdk编程即可。
bank2和bank3通过emio接口将cpu的gpio连接到pl部分的引脚上,其中每个bank各有32个引脚,通过emio扩展的gpio连接到pl上,可以在pl部分进行逻辑设计,进行特定功能的ip核制定。然后在ps部分,像控制普通mio一样进行编程。因此,使用emio引脚必须通过xps进行硬件配置,然后在ps部分使用sdk进行编程控制。
图1 gpio的组成
gpio的内部结构和内部数据流及寄存器结构如图2所示。上半部分为gpio中断相关的寄存器,下半部分为gpio查询方式读写的寄存器。
图2 gpio寄存器数据流组成
data_ro寄存器是读取gpio引脚值寄存器,不论该gpio引脚配置为输入还是输出,都能正确读取该gpio引脚值。如果该引脚的功能没有配置成gpio功能,读取的值为随机值,因为该寄存器只能读取gpio引脚值。
data寄存器的值是要输出到gpio引脚上的数值,当读取该寄存器的数值时,结果是前一次写入data寄存器里的数值,而不是当前gpio引脚的数值。
mask_data_lsw和mask_data_msw寄存器是传统的数据寄存器(data)和屏蔽寄存器(mask)的结合,该寄存器32位,分成高16位和低16位,其中高16位作为传统的mask使用,低16位作为传统的data使用。因此,mask_data_lsw是对gpio的16位引脚进行设置和屏蔽寄存器。当某位在mask_data_lsw高16位屏蔽时,即使修改mask_data_lsw低16位的数据,也不影响该位gpio值。
dirm寄存器是方向控制寄存器,控制gpio的输入或者输出,该寄存器值不影响输入,即gpio输入功能始终有效。
oen寄存器是输出时能寄存器,当gpio引脚被配置成输出引脚时,该寄存器控制该引脚是否输出;当gpio引脚被配置成输出禁止时,该引脚为三态;当oen[x] = 0时,输出无效。
gpio使用实例
zynq核的添加及配置
step1:新建一个名为为miz701_sys的工程
step2:选择rtl project 勾选do not specify source at this time
step3:选择芯片型号xc7z010clg400-1
step4:单击finish
使用ip integrator创建硬件系统
step1:单击create block design
step2:输入system
step3:添加ip按钮
step4:搜素单词z选择zynq7 processing system,然后双击
step5:添加进来了zynq cpu ip,双击zynq cpu ip。
step6: 修改时钟输入为50mhz,可以看到arm时钟为650mhz ddr为525mhz(1050mhz),并且修改fclk_clk0 为100mhz
step7:修改内存型号为mt41k256m16re-125 m,单击ok。
setp8:选择mio configuration选项卡,再看到i/o peripherals 中的gpio一栏,勾选上其中的emio一栏,并选择4位引脚输出(最多可以选择64位,但是这个使用只需要4位足够了)。
setp9:按照上图设置好了之后,点击ok,仔细观察发现的zynq核心多出一组引脚名为gpio_0,这个正是我们刚刚设置的一组emio,我们右击该引脚,选择make external把gpio_0引脚引出(或者单击该引脚处,按快捷键ctrl +t,也可以将引脚引出)。效果如下图所示:
step10::单击run block automation 进行自动连线,vivado软件会根据信号的命名规则智能连线。
step11:在你点击了ok后,你会发现ddr以及ficed_io自动的延伸出来,然后把时钟fclk_clk0和m_axi_gpi0_aclk连接,其实就是给m_axi_gp0_aclk提供一个时钟。方法:当把鼠标靠近的时候会自动连接。
产生hdl和约束文件
setp1:接下来依然是,右键单击block文件,文件选择generate the output products,是文件得到一定的约束。
setp2:弹出如下对话框,直接点击generate
setp3:继续右键单击block文件,选择create a hdl wrapper,根据block文件内容产生一个hdl 的顶层文件:
setp4:并选择让vivado自动完成
setp5:这里我们看到,vivado给我创建了这样的顶层文件,其中的gpio_0_tri_io就是我们配置的emio
emio的管脚约束修改
我们发现,之前引出的emio叫做gpio_0,到了顶层他的名字gpio_0_tri_io,而不是gpio_0。所以分配引脚的时候就要注意了名字别错了,创建一个约束文件,分配引脚如下:
产生bit文件
此时可以,开始生成bit文件了:
导出bit文件
编译成功之后,依然是导出硬件:
加载到sdk
通过4个gpio口输出高低电平到引出的引脚上。
配置gpio的步骤如下:
通过gpio的外设id找到对应的外设信息;
填充gpio外设寄存器基地址和一些相关信息;
配置gpio口的方向为输出方向;
配置gpio口的输出使能;
设置gpio口输出高低电平;
打开sdk,然后新建一个工程,以及添加一个main.c文件。
添加程序如下:
黑科技!Santa Cruz计划用按钮 摇杆替换当前控制器触控板
基于DRV8825驱动芯片的步进电机
如何自制简单的夹具来测量电容器的特征参数
院士谈共融机器人产业群的创新发展和跨越发展
PLC与多台变频器的MODBUS/RTU通信方案
ZYNQ开发案例:GPIO的结构体系及使用案例
如何使平板电脑背光耗电减少
AMD明年初推出下一代GPU架构 命名Vega10和Vega11
受三星S8冲击,华为P10销量不佳!
柔性薄膜电池问世,可穿戴设备再突破
中国光伏陷利润、出口、资金链三大困境分析
3D打印面具成功解锁iPhone X
大众ID Buzz电动汽车将推迟到2023年在美国上市
GSM测试仪 HP8922M HP8922M HP8922M
如何选择图像传感器的镜头
食品安全综合检测仪的生产厂家如何选择?
智能猫眼很可能成为叩开智能家居大门的最佳契机
f5负载均衡工作原理详解
自动焊接机器人的编程好学吗?
工业自动化网络设计是怎样的设计