本文主要介绍如何在不使用sdk的情况下进行zynq7020的编程。本实验为点亮一盏LED灯,使用MIO0引脚。
废话不多说,开始正题。
本文使用正点原子启明星zynq7020开发板进行开发。
开发环境为Ubuntu。
一、相关寄存器介绍
要使用GPIO点亮LED灯,第一步当然是设置GPIO的引脚。将MIO0映射到GPIO上。因此要对SLCR寄存器编程。编程之前先要对SLCR进行写使能。
把0xDF0D写入SLCR_UNLOCK寄存器中,地址为0xF8000008。
引脚输出属性设置,在本实验中GPIO为输出模式,故输入缓冲使能(DisableRcvr位置1),不使用上拉电阻(PULLUP位置0),led电压为3.3V(IO_Type位设置001),缓的CMOS边沿(Speed位置0),MIO0映射到GPIO上(7-1位设置为0000000),三态使能(TRI_ENABLE位置0)。
把0x2600写入MIO_PIN_00寄存器中,地址为0xF8000700。
该寄存器控制输出的高低电平,0为低电平,1为高电平。本实验led点亮为高电平,因此将第0位(MIO0)设置为1。
该寄存器0为输入,1为输出。MIO0用作GPIO输出。第0位(MIO0)设置为1,。
该寄存器控制输出是否使能,0为不是能,1为使能。因此将第0位(MIO0)设置为1。
二、编写程序
在Ubuntu下新建文件夹test。在文件夹里新建文件start.S。
敲入代码:
.text
.global _start
_start:
//设置堆栈指针
ldr sp,=0x30000
/*
解锁slcr寄存器为
*/
ldr r0,=0xF8000008
ldr r1,=0xDF0D
str r1,[r0]
/*
设置MIO0为GPIO输出
*/
ldr r0,=0xF8000700
ldr r1,=0x2600
str r1,[r0]
/*
设置GPIO0为输出模式
*/
ldr r0,=0xE000A204
ldr r1,=1
str r1,[r0]
/*
设置GPIO0输出使能
*/
ldr r0,=0xE000A208
ldr r1,=1
str r1,[r0]
/*
设置GPIO0输出高电平
*/
ldr r0,=0xE000A040
ldr r1,=1
str r1,[r0]
loop:
b loop
新建文件zynq.lds,此文件为连接脚本。
SECTIONS
{
._start 0x00000000:
{
* (.text)
}
}
编译start.S,Ubuntu下预先装了xsdk,这里使用xsdk自带的交叉编译器。设置环境变量。在shell执行如下命令
source /opt/sdk/SDK/2018.3/settings64.sh
arm-none-eabi-gcc -c start.S
arm-none-eabi-ld -o led.elf -Tzynq.lds start.o
至此,可执行文件led.elf文件已经生成,接下来使用bootgen工具把他转换为bin文件放入sd卡中。
新建文件zynq.bif,内容为
myboot:
{
[bootloader]led.elf
}
在shell执行如下命令
bootgen -image zynq.bif -o BOOT.bin
最后把BOOT.bin文件放进sd卡中,开发板设置为sd卡启动,插入sd卡,上电,大功告成,led亮了。