ZedBoard学习手记(三)为自定义外设编写裸奔控制软件

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第1张

由于Xilinx已经为我们做了大部分的铺垫工作,因此裸奔控制外设这一步就显得十分简单了,如果不用Linux图形界面显示,大概我的作品早早的就完成了吧。上一次我们已经成功生成了BitStream文件,下面继续上次的 *** 作,打开PlanAhead工程,选择Export Hardware for SDK,如下图:

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第2张

在d出的窗口中选上Launch SDK,OK以后进入SDK界面。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第3张

 SDK界面下编写裸奔软件的方法在ZedBoard_CTT文档中已经悉数介绍了,这里和官方文档中的唯一差异就是需要添加控制AXI总线设备的底层代码。首先新建一个C工程。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第4张

工程模板选择Hello World,点击Next。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第5张

 BPS部分默认即可,点Finish完成。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第6张

 之后添加我们自己建立的my_gpio外设的控制代码。不会控制AXI总线设备?没关系,由于之前在创建外设的时候勾选了生成driver的配置项,Xilinx已经自动生成了裸奔的控制代码。代码位于XPS工程的文件目录下,兔子这里的路径是“Hello_ZedHello_Zed.srcssources_1edkmodule_1driversmy_gpio_v1_00_asrc”,将里面的my_gpio.h直接拖进SDK左边的hello_world工程里,并在helloworld.c文件里添加对my_gpio.h的引用:#include "my_gpio.h" 有的童鞋可能在编译的时候会遇到问题,提示找不到xbasic_types.h文件。同时在my_gpio.h文件的左下角会显示一个小叉。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第7张

 出现此问题时,可以手动添加这个头文件的路径,一般就在Xilinx ISE的安装目录中,我的电脑上就是:#include"D:Xilinx14.2ISE_DSEDKswXilinxProcessorIPLibdriverscommon_v1_00_asrcxbasic_types.h" 如果这个时候编译工程不出问题,就可以开始写测试代码了。在my_gpio.h中定义了一些控制AXI总线设备寄存器的函数,如mReadSlaveReg和mWriteSlaveReg。通过这些函数就能够读写寄存器内容了。需要注意的是,想要控制外设还需要知道它的设备物理地址,该地址可以在工程中的XML文件中查看,比如在这里my_gpio设备的地址就是0x75C00000。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第8张

 这里附上一个简单的测试例,可以测试我们的外设是否符合设计要求。其功能为:读取两个寄存器值,根据终端输入修改寄存器,最后再次读出验证修改效果。代码如下:#include#include "platform.h"#include "my_gpio.h" #define MY_GPIO_ADDR    0x75C00000 //设备物理地址int reg0, reg1; int main(){    init_platform();    //读取寄存器初始值    printf("======= My_GPIO Test ======= ");    printf("Reading my_gpio registers... ");    reg0 = MY_GPIO_mReadSlaveReg0(MY_GPIO_ADDR, 0);    reg1 = MY_GPIO_mReadSlaveReg1(MY_GPIO_ADDR, 0);    printf("Reg0=0x%x, Reg1=0x%x ", reg0, reg1);    //向寄存器写入数据    printf("Input Reg0. ");    scanf("%d", ®0);    printf("Input Reg1. ");    scanf("%d", ®1);    printf("WriTIng to my_gpio registers... ");    MY_GPIO_mWriteSlaveReg0(MY_GPIO_ADDR, 0, reg0);    MY_GPIO_mWriteSlaveReg1(MY_GPIO_ADDR, 0, reg1);    //读取寄存器验证修改结果    printf("Read my_gpio registers... ");    reg0 = MY_GPIO_mReadSlaveReg0(MY_GPIO_ADDR, 0);    reg1 = MY_GPIO_mReadSlaveReg1(MY_GPIO_ADDR, 0);    printf("Reg0=0x%x, Reg1=0x%x ", reg0, reg1);     cleanup_platform();    return 0;}  下面让我们将代码写入Zynq,运行一下看看吧。首先编译一下工程,完成后选择Program FPGA,为PL部分载入逻辑配置。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第9张

 因为从PlanAhead导出到SDK时,已经选择了包含BitStream文件,因此这一栏已经自动完成了,未自动添加路径的可以根据图中的地址手动添加。点击Program,开始下载配置数据。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第10张

 稍等片刻,Program完成后,选择Run ConfiguraTIons配置运行选项。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第11张

 在d出的窗口中,右击Xilinx C++/C++ Elf,选择New,新建一个Debug项。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第12张

 选择新建的hello_world_0 Debug项,点击Run就可以运行代码了。这里C/C++ ApplicaTIon一栏已经自动填充了elf文件的路径,如果没有填充(可能是工程还未编译完成),就从Debug文件夹中手动添加。Run ConfiguraTIons中的选项都采用了默认配置,这些选项的作用和设置方法请参见ZedBoard_CTT文档,此处不再赘述。

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第13张

 代码运行后,打开串口终端软件(兔子用的是SecureCRT),在115200bps波特率下,串口开始输出信息。首先会显示两个寄存器中的默认值(皆为0x0),然后将SW7、SW5、SW3、SW1向上拨,设为高电平,其他保持低电平。再通过键盘输入两次85和回车,即向两个寄存器中都写入0x55。由于寄存器0为只读寄存器,其内容只根据Switch状态改变,因此reg0结果为0xAA,即我们对开关设置的数值,同时LED0、LED2、LED4、LED6会被点亮。代码正常工作啦,串口输出如图:

ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,ZedBoard学习手记(三)为自定义外设编写裸奔控制软件,第14张

 上实测照片:

 确实很简单吧,Xilinx看来在方便用户这点上还做的不错。在验证完逻辑的正确性后,就要开始为Linux控制外设做准备了, 请见下回。来源:电子懒兔的博客

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2580147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存