广告

原创 Vivado嵌入式系统设计(4)——编写软件程序

2017-9-29 09:27 1056 1 1 分类: FPGA/CPLD

  下面将为前面构建的嵌入式系统硬件编写软件应用程序,功能是写zebboard 板上的LED灯。通过修改链接脚本文件,将从BRAM运行脚本程序。

      新建一个lab4的文件夹,将上篇文章的lab3目录下的所有文件复制到lab4。然后打开工程。


(1)创建应用工程

  本节将导出硬件到SDK,然后创建应用工程。在Vivado主界面的Flow Navigator 窗口下,点击Open Block Design,或者在源文件下打开system.bd文件。同时找到Implementation选项,单击Open Implementation Design,打开实现后的设计;在viavdo 主菜单,执行FileExportExport Hardware,在弹出的对话框中,选中Include bitstream 前面的复选框,单击OK。弹出 Module Already Exported 对话框,提示已经存在导出文件,是否覆盖文件信息,单击Yes,覆盖前面的的导出文件。

  在Vivado 的主界面的主菜单下,依次点击FileLaunch SDK,弹出对话框,在该对话框中,单击OK。在SDK主界面的左侧Project Explorer 窗口下,选中system_wrapper_hw_platform_1.单击鼠标右键,出现浮动菜单,执行命令Delete。类似的,分别选择standalone_bsp_0TestApp,将其从磁盘删除。

  在SDK主界面菜单下,执行FileNew, Application Project,弹出对话框,下面的参数配置:Projact name:lab4;点击Next按钮,弹出New Project-Templates对话框,选择Empty Application选项,单击Finish按钮。

  在SDK主界面下,找到lab4,在展开项中找到src,选中src,单击鼠标右键,出现浮动菜单。执行Import,弹出对话框,展开General文件夹。选中File System。单击Next,单击Browse按钮,选择lab4.c文件,单击Finish。

lab4.c代码如下

#include "xparameters.h"
#include "xgpio.h"
#include "led_ip.h"

int main(void)
{
XGpio dip,push;
int i, psb_check,dip_check;

xil_printf("--Start of the Program--\r\n");

XGpio_Initialize(&dip,XPAR_SWITCHES_DEVICE_ID);
XGpio_SetDataDirection(&dip,1,0xffffffff);

XGpio_Initialize(&push,XPAR_BUTTONS_DEVICE_ID);
XGpio_SetDataDirection(&push,1,0xffffffff);

while(1)
{
psb_check = XGpio_DiscreteRead(&push,1);
xil_printf("Push Buttons Status %x\r\n",psb_check);
dip_check = XGpio_DiscreteRead(&dip,1);
xil_printf("DIP Switch Status %x\r\n",dip_check);

LED_IP_mWriteReg(XPAR_LED_IP_S00_AXI_BASEADDR,0,dip_check);
for(i=0;i<9999999;i++);

}

}


(2)为LED_IP分配驱动

  在SDK主界面菜单下,执行菜单命令Xilinx ToolsReposiories,弹出Preferences 对话框,单击 New 按钮看,定位路径到 LED IP的路径。


  在SDK主界面,点击Xilinx ToolsBoard Support Package Settings,弹出Select a board support package 对话框,选择lab4_bsp

  单击OK按钮,弹出Board Support Package Settings 对话框,在该对话框左侧选择drivers

  单击OK按钮。当创建IP 模板时,自动创建驱动程序代码,驱动程序包含更高级的函数,这些函数可以通过用户程序进行调用。驱动程序用于实现更低层次的功能,用于控制外设。

 定位到如下目录,E:\vivadoProject\zynq_3\led_ip\ip_repo\led_ip_1.0\drivers\led_ip_v1_0\src,打开led_ip.c文件,它只包含用于IP的头文件。


(3)分析汇编目标文件

  下面启动shell  objdump lab4.elf,查看不同的段。

  在SDK主界面,单击Xilinx ToolsLaunch Shell,先后输入

cd lab4
cd debug

 

输入下面的命令

arm-xilinx-eabi-objdump –h lab4.elf


如图可以看到不同的段分配

(3)验证设计

  连接PC  Zedboard之间的JTAGUART

  选择SDK Terminal 标签,按前几篇文章的方法设置UART参数。

  在SDK主界面,执行Xilinx ToolsProgram FPGA,弹出对话框。单击Program按钮,将比特流下载到FPGA

SDK主界面左侧,选择lab4,单击鼠标右键,在浮动菜单内,执行Run As Launch on Hardware(GDB),把应用程序下载到板子,并且执行ps7_init  lab4.elf



广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1  ...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.    ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产...
我要评论
0
1
广告