《LabVIEW ZYNQ FPGA宝典》第6章>>实验3:LabVIEW开发ZYNQ PS(ARM)端MIO引脚(控制PS端LED灯点亮熄灭)

1、实验内容

        前面介绍过ZYNQ芯片本身是由PS端ARM和PL端FPGA两部分组成的,其中PS端ARM一共有54个MIO引脚可以控制,其中绝大部分MIO引脚都被常规外设占用了,一般用于UART、CAN总线、USB、Ethernet、EMMC之类的,所剩无几。好在正点原子领航者ZYNQ开发板上预留了3个PS端MIO引脚来控制LED灯和2个MIO引脚读取外部按键状态,以此向用户展示ZYNQ PS端ARM也可以单独操控这些GPIO口。

        而市面上其他厂家ZYNQ开发板很少会预留PS端MIO引脚,说明不细心。

        对于一些简单的应用来说,直击操作PS端ARM引脚要比操作PL端FPGA简单,因为我们只需要对MIO引脚的寄存器读写就可以了,类似访问单片机或者ARM芯片;这样就能很轻松的实现对外部继电器或者接触开关这类传感器进行输出或者捕捉了。

        为了向大家演示如何使用LabVIEW操控ZYNQ PS端MIO引脚,我们将控制LED灯的PS端MIO输出和捕捉按键是否按下的PS端MIO输入分成两个实验进行讲解,本节实验给用户编写一个ZYNQ PS端Linux RT应用程序,直接控制挂在ZYNQ底板上的2个PS端LED灯和挂在ZYNQ核心板上的1个PS端LED灯,下一个实验再讲解如何读取ZYNQ底板上的2个按键对应的PS端MIO引脚输入电平状态。

2、实验目标

        本节实验我们需要学会利用LabVIEW编写一个可以控制ZYNQ底板上2个PS端用户LED灯和ZYNQ核心板上的1个PS端LED灯,一共3个LED灯的Linux RT程序,编译部署下载到ZYNQ芯片的PS端ARM里面去运行,利用LabVIEW Linux RT应用程序在线前面板交互式运行,手动点击前面板上的按钮动态点亮或者熄灭ZYNQ开发板上的这3个PS端LED灯,再次复习并熟练掌握ZYNQ平台PS(ARM)端的LabVIEW Linux RT程序开发过程和原理。

3、硬件介绍

        本节实验只需要用到正点原子领航者ZYNQ开发板,Xilinx JTAG下载器本节实验用不上,因为本节实验我们不需要对PL端FPGA进行编程,所以也不需要观察FPGA部分的状态变化,只需要借助网线部署下载Linux RT程序到PS端ARM里面运行即可。

        原子领航者ZYNQ底板上有2个挂在PS端的LED灯(标号分别是PS_LED0和PS_LED1),ZYNQ核心板上还有1个挂在PS端的LED灯(标号是LED2),如图3-1所示。这3个LED灯也是原子为了展示PS端ARM引脚可编程专门预留的。

图3-1:正点原子领航者ZYNQ开发板上挂在PS端ARM上的总共3个用户LED灯

4、原理图介绍

        正点原子ZYNQ领航者底板上的2个PS端LED灯对应的MIO引脚原理图,如图3-2所示,可以看出,这两个LED灯分别与ZYNQ芯片PS端ARM的MIO7和MIO8这两个引脚相连;挂在ZYNQ核心板上的1个PS端LED灯对应的MIO引脚原理图,如图3-3所示,这个LED灯连在了PS(ARM)端BANK500引脚的MIO0上面。请大家记住这3个引脚名称,后面我们用LabVIEW编写Linux RT程序时候,需要调用MIO0、MIO7、MIO8这3个引脚。

图3-2:原子ZYNQ底板上的2个PS端LED灯对应的MIO引脚原理图(MIO7、MIO8)

图3-3:原子ZYNQ核心板上的1个PS端LED灯对应的MIO引脚原理图(MIO0)

5、驱动VI函数讲解

        正式开始采用LabVIEW编写ZYNQ PS端Linux RT MIO引脚配置输出之前,我们先来了解一下本节实验要用到的Linux RT下的通用GPIO驱动VI函数功能。

        为了方便用户使用,我们提前将底层通用GPIO引脚配置函数封装到LabVIEW Linux RT环境下的“PowerGod-RIO-RT”选板里面,变成一个个小图标,一目了然。

        要完成本节实验,我们需要用到3个函数选板,分别是“PS_Load_KO”、“PS_MIO_Pins”和“PS_Reg_Address”,如图3-4所示。

图3-4:神电测控研发的“PowerGod-RIO-RT”函数选板里面的3个常用选板

        下面,我们分别介绍一下这3个选板里面的VI功能和应用场合。

        1)为了提高ZYNQ芯片PS端的内存使用率,我们将很多外设KO驱动做成了动态加载和卸载。比如本节实验,我们需要控制PS端的MIO引脚,属于通用IO,也就是GPIO类,所以在Linux RT程序初始化之前,我们需要利用下面图3-5里面的GPIO动态加载Load_GPIO_KO函数(PSLoadGPIOKO(SubVI).vi)加载GPIO驱动,等到Linux RT程序停止退出的时候,再调用Unload_GPIO_KO卸载函数(PSUnloadGPIOKO(SubVI).vi)卸载GPIO驱动以便释放GPIO占用的内存和资源。

图3-5:GPIO外设驱动动态加载和卸载函数

        2)ZYNQ芯片PS端因为是ARM,所有的外设的配置和操控,本质上就是对寄存器地址空间的访问和读写,也就是说,所有PS端外设都可以通过查看ZYNQ芯片手册,找到对应的物理寄存器地址,然后利用下图3-6所示的“PS_Reg_Address”寄存器函数选板里面的4个基础VI实现全部所有功能。理论上,有了这4个基础寄存器操作函数,就能实现ZYNQ PS端ARM里面所有外设的控制。在本节实验总结里面,我们会给出利用这4个寄存器函数实现对PS端54个MIO引脚的批量读写和控制。

图3-6:ZYNQ芯片PS端ARM寄存器操作函数

        注意:只要是对PS端外设进行操作的场合,都需要调用上面“PS_Reg_Address”函数选板里面的第1个和第4个VI,也就是“PS_reg_Open”和“PS_Reg_Close”,相当于对寄存器函数的初始化和程序退出前的寄存器关闭,至于中间的Reg寄存器读写两个VI,可以根据实际情况选择,因为后续为了简化编程,我们对很多外设寄存器实际进行了二次封装,直接只需要调用相应的函数即可,而不需要死记硬背寄存器地址。

        3)虽然,我们可以借助上面的4个寄存器VI函数实现对PS端任何外设的操控,不一定是GPIO,其他的外设只要知道了寄存器地址就可以。但是如果大家都去查找ZYNQ芯片资料去死记硬背这些外设的寄存器地址,会浪费很多宝贵的时间。

        因此,为了简化用户编程复杂度,我们将常见的外设寄存器地址进行了封装,利用LabVIEW特有的图形化优势,将其封装成LabVIEW多态VI或者封装成下拉列表,这样用户只需要拖拽几下或者点击一下鼠标就能一目了然的完成PS端的外设访问。

        比如,本节实验需要对ZYNQ PS端MIO引脚进行控制,为了简化编程,我们将底层不同功能的GPIO寄存器按照不同的功能利用上面图3-6里面的寄存器读写VI重新进行了二次封装,将这些GPIO功能VI函数单独做成了一个名为“PS_MIO_Pin”的函数选板,如图3-7所示。这些VI函数一看名称就知道各自实现的功能,从左往右依次完成的是“MIO时钟使能/关闭”、“MIO读写方向设置”、“MIO引脚中断使能/关闭”、“MIO引脚输出使能/禁止”、“MIO引脚输入电平读取”和“MIO引脚电平输出”。总共6个VI。

图3-7:将GPIO外设按照功能模块化封装成独立的VI(方便用户理解和调用)

6、程序开发讲解

6.0:编程思路

        也就是说,要想完成对ZYNQ芯片PS端MIO引脚的输出和读取,必须按照下面的流程至少调用10个VI函数,调用次序如下,后面Linux RT程序编写就是参考这个流程来。Load_GPIO_KOàPS_Reg_OpenàMIO_CLKàMIO_DIRàMIO_INTàMIO_Out_EnàMIO_Read/MIO_WriteàPS_Reg_CloseàUnload_GPIO_KO

        了解完ZYNQ芯片PS端MIO驱动VI和操作流程后,接下来,我们就可以利用LabVIEW编写一个Linux RT MIO引脚输出高低电平,下载到ZYNQ PS端ARM里面去控制ZYNQ核心板和底板上的PS端LED灯了。提醒:本节实验只有ZYNQ PS端Linux RT程序开发,不需要PL端FPGA参与,所以也就不要编写PL端FPGA程序了,简单很多。

6.1:新建或者打开已有的LabVIEW ZYNQ Linux RT项目

  打开前面第五章我们新建好的LabVIEW ZYNQ项目(My_FPGA_Stater_Board_ZYNQ7020_PS+PL.lvproj),如果大家不记得怎么新建一个同时包含ZYNQ PS端和PL端的LabVIEW ZYNQ项目,可以回顾一下前面第五章里面的内容。

        打开之后的LabVIEW ZYNQ项目(My_FPGA_Stater_Board_ZYNQ7020_PS+PL.lvproj),如图3-8所示。

图3-8:打开前面我们创建好的同时包含ZYNQ PS(ARM)端和PL(FPGA)端的LabVIEW ZYNQ项目

        由于本节实验,我们用不到ZYNQ芯片里面的PL端FPGA部分,因此,可以先将FPGA Target终端收起来,如图3-9所示。

图3-9:将My FPGA终端暂时收起来(本节实验用不到FPGA参与)

6.2:编写LabVIEW Linux RT应用程序(控制PS端MIO引脚关联的LED灯)

        1)右击Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“New/新建”一个“Virtual Folder/虚拟文件夹”,如图3-10所示。将其重命名为“实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端)”,如图3-11所示,以示分类管理好区分。

图3-10:右击Linux RT终端选择新建一个虚拟文件夹

图3-11:将刚刚新建出来的虚拟文件夹重命名为“实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端)”

        2)接着,右击刚刚创建的虚拟文件夹“实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端)”选择“New/新建”一个VI程序,如图3-12所示,然后将这个VI另存为“实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端).vi”,如图3-13所示。

图3-12:右击虚拟文件夹新建一个VI

图3-13:将新建出来的VI保存并重命名为“实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端).vi”

        3)打开这个新的VI,将前面第5节“PowerGod-RIO-RT”函数选板里面3个相关的10个子VI函数拖拽到程序框图里面,然后按照6.0节里面的步骤进行排序串联,最后在前面板上创建相应的控件,即可完成本节PS端LED灯控制实验程序的开发,最终形成完整的Linux RT程序框图,如图3-14所示,提醒:看不清的用户可以缩放一下pdf,因为这里贴的程序框图是直接复制的LabVIEW原始矢量图,不是截图。

图3-14:完整的ZYNQ PS(ARM)端LED灯控制亮灭Linux RT程序框图

        其中,左边的顺序结构里面有4个分支,分别实现的功能是:MIO时钟使能、MIO禁止中断、MIO输出读写方向设置(输出方向)、MIO输出使能,相应的4个分支框图如图3-15~3-18所示。

图3-15:使能ZYNQ芯片PS端GPIO引脚时钟

图3-16:关闭ZYNQ芯片PS端GPIO引脚中断

图3-17:将ZYNQ芯片PS端GPIO引脚设置为输出模式

图3-18:使能ZYNQ芯片PS端GPIO输出

        提醒:我们将ZYNQ PS端54个GPIO(MIO)引脚做成了下拉枚举形式,这样大家就能直接根据原理图上PS端的MIO序号,直接在下拉列表里面选择一下即可,不需要去死记硬背那些寄存器地址了。

        4)对应的PS端LED灯Linux RT控制程序前面板如图3-19所示。用户可以直接在前面板上按下或者松开这3个按钮,就可以相应的控制ZYNQ核心板和底板上总计3个PS端LED灯亮灭了。

图3-19:ZYNQ PS端3个LED灯Linux RT控制程序前面板

7、硬件接线实物图

        提醒:由于本节实验没有用到ZYNQ PL端FPGA部分,没有必要编写FPGA VI程序,所以也就无须外接Xilinx下载器来观察FPGA VI的在线前面板运行情况了。

        因此,只需要一根CAT5+或者CAT6类千兆网线将ZYNQ开发板跟上位机开发电脑互联起来即可,上位机开发电脑通过网线与正点原子ZYNQ开发板之间的硬件接线实物图,如图3-20所示。

图3-20:完整的硬件接线实物图(千兆网线接到PS端网口里面)

8、程序编译下载

        1)由于ZYNQ开发板与上位机电脑之间是通过网线直连的,中间没有经过路由器,所以,上位机要利用ZYNQ PS端Linux RT默认的静态IP地址:192.168.2.99来部署下载上位机写好的Linux RT程序,因此,上位机网卡IP地址也要设置成同一个网段,比如192.168.2.10,如图3-21所示。

图3-21:将上位机开发电脑网卡IP地址设置成跟下位机ZYNQ里面的eth0:1虚拟网卡静态IP地址在同一个网段内

        2)然后检查一下LabVIEW ZYNQ PS端Linux RT终端里面的IP地址是否为下位机ZYNQ里面的固定IP地址(192.168.2.99),如果不是的话,右击终端选择“Properties/属性”,如图3-22所示;再在属性设置页面里面修改一下即可,如图3-23所示。

图3-22:如果IP地址不一样的话,可以右击LabVIEW Linux RT终端选择属性

图3-23:在Linux RT属性配置里面将IP地址改成ZYNQ直连方式下的固定静态IP地址

        3)右击ZYNQ PS端Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“Connect/连接”,如图3-24所示;不出意外的话,会弹出来一个“Deployment Progress”部署成功的提示框,如图3-25所示;最后点击一下“Close/关闭”该对话框即可,此时,可以看到LabVIEW Linux RT终端左下角的指示灯点亮了,如图3-26所示,表明上位机Linux RT终端与下位机ZYNQ板子通过网线建立起了连接。

图3-24:右击LabVIEW Linux RT终端(ZYNQ7020_PS_Linux_RT)选择“Connect/连接”

图3-25:弹出一个部署进度与部署成功的提示框(Close即可)

图3-26:连接成功后Linux RT终端logo图标指示灯亮起

        4)右击Linux RT终端(ZYNQ7020_PS_Linux_RT)里面的程序生成规范,选择“New/新建”一个“Real-Time Application/实时应用程序”,如图3-27所示;然后在弹出来的RT应用程序属性配置页面里面,将程序生成规范重命名为“实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端)”,如图3-28所示;再选择左侧目录里面的“Source Files/源文件”里面的本节实验3编写的VI程序(实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端).vi)添加到右侧的“Startup Vis/启动VIs”列表里面,如图3-29所示。

图3-27:右击Linux RT终端下的程序生成规范新建一个RT应用程序规范

图3-28:将新建出来的RT程序生成规范重命名以示区分

       图3-29:将源文件里面的本节实验3编写的Linux RT VI添加到右侧启动VIs列表里面

        5)然后右击刚刚创建的实验3对应的RT应用程序生成规范,选择“Build/编译”,如图3-30所示;大概几秒钟就能编译完成,并且会有一个编译成功的提示框,如图3-31所示;点击“Done/完成”按钮退出这个提示框,再右击实验3程序生成规范,选择“Deploy/部署”将刚刚编译出来的Startup.rtexe以及附件全部部署下载到ZYNQ板子里面去,如图3-32所示;一切顺利的话,会有一个部署进度条和部署成功的提示框出现,如图3-33所示。

图3-30:右击实验3 Linux RT应用程序生成规范进行Build/编译

图3-31:编译完成后会有一个编译进度条和编译成功提示框

图3-32:右击Linux RT实验3程序生成规范选择“Deploy/部署”下载

图3-33:ZYNQ PS端Linux RT程序及其组件会一起部署下发到ZYNQ里面去

9、实验现象

        1)直接点击本节实验3 Linux RT程序(实验3-PS端MIO引脚输出控制LED灯亮灭(ZYNQ PS端).vi)左上角的运行箭头,可以看到上位机LabVIEW会把这个VI程序及其组件和驱动一起部署下载到ZYNQ芯片里面运行,如图3-34所示;同时PS端里面的Linux RT应用前面板活了,自动进入在线前面板交互式运行模式,此时,前面板上的“Running”显示控件里面的数值开始递增,说明PS端的Linux RT程序里面的while循环开始运行起来了,如图3-35所示。

图3-34:上位机实验3对应的Linux RT程序成功部署到了下位机ZYNQ芯片里面运行

图3-35:“Running”显示控件数值递增,表明Linux RT程序里面的while循环开始运行

        2)接下来,按下Linux RT前面板上的“PS_Core_LED”按钮,如图3-36所示,此时,ZYNQ核心板上挂在PS端ARM上的LED灯点亮了,而ZYNQ底板上的“PS_LED0”和“PS_LED1”处于熄灭状态,这是因为我们没有按下前面板上对应的按钮,如图3-37所示;如果将“PS_Core_LED”按钮松开,对应的核心板上的LED灯也会熄灭。

图3-36:按下ZYNQ PS端Linux RT程序前面板上的“PS_Core_LED”按钮

图3-37:ZYNQ核心板上挂在PS端的LED灯点亮了

        3)最后,我们可以同时按下Linux RT程序前面板上的“PS_LED0”和“PS_LED1”两个按钮,如图3-38所示,相应的ZYNQ底板上挂在PS端的两个LED灯也全部点亮了,而ZYNQ核心板上的“PS_Core_LED”指示灯熄灭了,这是因为我们释放了Linux RT前面板上左侧的按钮,如图3-39所示;反之如果松开按钮,则底板上的LED灯也会熄灭。

图3-38:按下ZYNQ PS端Linux RT前面板上的“PS_LED0”和“PS_LED1”按钮

图3-39:ZYNQ底板上挂在PS端的两个LED灯点亮了

11、实验总结

        我们总结一下本节实验学到的内容和需要注意的事项。

        本节实验如果对ZYNQ单个PS(ARM)端GPIO进行配置和操作,使用封装好的下拉类别操作比较方便,如果要批量对这54个MIO一起配置和读写的话,下拉列表方式操作效率就不高了,此时我们可以直接操作ZYNQ的寄存器来显示批量读写,54个MIO实际上是两个32位寄存器合在一起的,其中有一个32位寄存器只有低22位是有效的,关于如何批量设置和操作这54个MIO引脚,可以参考我们范例程序里面的拓展实验3-1和3-2,我们已经将其添加到了Linux RT项目下了,如图3-50所示;对应的程序框图分别如图3-51和3-52所示。后续视频教程里面我会给大家演示一下这两个批量操作PS端GPIO的实验效果,其中,就包含了PS端LED灯的3个引脚在里面,这里不再赘述了。

图3-50:通过寄存器地址的方式批量操作32位寄存器(扩展实验)

图3-51(a):批量操作ZYNQ PS端前32个MIO引脚(前面板)

图3-51(b):批量操作ZYNQ PS端前32个MIO引脚(程序框图)

图3-52(a):批量操作ZYNQ PS端后22个MIO引脚(前面板)

图3-52(b):批量操作ZYNQ PS端后22个MIO引脚(程序框图)

        最后,提醒一下用户:本节实验虽然简单,没有涉及到ZYNQ PL端FPGA部分程序编写,但是对于初学者来说,里面的每个步骤和操作过程都要熟练掌握,虽然都是一些基础知识,但是熟能生巧,后面的实验例程会越来越复杂,功能越来越多,需要同时对ZYNQ PS端ARM和PL端FPGA进行LabVIEW编程,希望大家都能轻松学会掌握。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值