不使用SDK生成BSP手动建立zynq软件工程

本介绍不使用SDK自动生成的BSP,而手动建立zynq的SDK工程的一般方法并解决出现的一个错误。

Xilinx的工具的确非常强大,从vivado到SDK中软件编程,大多数事情都可以使用鼠标点击设置即可完成,这固然对快速开发有很多好处,但是对于初学者,却不那么合适了,这会导致初学者只知道如何操作而不知道具体原理,即知其然,而不知其所以然。所以这里给出不使用SDK中自动生成的BSP,而软件工程全部手动建立。可以对BSP和vivado在zynq中PS部分设置稍有理解。

建立SDK工程

vivado部分不变,配置好zynq,导出硬件,Launch SDK。

在SDK中File->New->Project…;然后从C/C++下选择C Project,点击Next后可以看到以下窗口

不使用SDK生成BSP手动建立zynq软件工程_第1张图片

同图中,输入工程名,选择Xilinx ARM Executable,Next->Finish即可创建工程完毕;然后在工程下创建src目录(当然不用也可)

src目录中新建boot.s启动汇编文件,指定0地址的内容,即指定复位中断执行的命令(当然这里复位中断用了两条指令,占用了未定义指令的空间,所以要使用未定义指令中断则需修改),内容如下

.org 0
.text
.global _boot
.section .boot,"axS"
_boot:
    ldr r13,=0xfffffe00
    bl main
.end

再在src目录中新建链接脚本文件zynq.lds,内容如下

SECTIONS
{
    .boot 0x00000000: {
        * (.boot)
        * (.main)
        * (.text)
        * (.gnu.linkonce.t.*)
    }
}

最后在src目录中添加c应用源文件,这里给出简单控制GPIO电平的程序,文件内容如下

/*
 * main.c
 *
 *  Created on: 2016年7月24日
 *      Author: hsp
 *  本文件实现简单的GPIO控制,输出到板子上的一个LED
 */

#define MIO_PIN_00  0xf8000700
#define DIRM_0      0xe000a204
#define OEN_0       0xe000a208
#define DATA_0      0xe000a040

#define REG(addr) (*(volatile unsigned int *)addr)

int main()
{
    REG(MIO_PIN_00) = 0x0fffff600;  // 设置MIO 0为GPIO

    REG(DIRM_0) = 0x000000001;      // 设置MIO 0为输出
    REG(OEN_0) = 0x000000001;       // 设置MIO 0输出使能

    while(1)
    {
        REG(DATA_0) = 0x000000001;  // 设置MIO 0输出1
        REG(DATA_0) = 0x000000000;  // 设置MIO 0输出0
    }
    return 0;
}

由上文件可见,没有包含一个头文件,没有调用一个库函数,直接通过设置寄存器来控制GPIO,其中各寄存器的定义可以查看Xilinx官方文档。看到这样清爽的代码,是不是这样感觉更清晰了。

一个错误

当编译完成后,在调试时出现以下错误(Unexpected error while launching program:Path for project must have only one segment.)

不使用SDK生成BSP手动建立zynq软件工程_第2张图片

当然网上也没找到解决办法,只有自立根生了。进入调试配置窗口的Application界面,发现Project Name中没有工程名,当然点击后面的Browse…选择工程,但是点击进入后竟然没有工程可选,没办法死马当作活马医,直接输入工程名,再调试,奇迹般竟然可以了。如下图,直接在Project Name中输入刚刚新建的工程的名称(这里假定为gpio_mio)。

不使用SDK生成BSP手动建立zynq软件工程_第3张图片

你可能感兴趣的:(zynq,解决问题)