EBAZ4205 第十一个工程 的TF 卡启动 演示

ZYNQ 有多种启动方式可以选择,除了之前介绍的从NAND FLASH 的方式来启动外,还可以让系统从TF 卡的方式来启动,本文将通过一个EMIO 点LED 灯的方式来演示 TF 卡的启动过程。

本例子演示 用EMIO 映射到PL端的方式来驱动LED灯,进而演示TF卡启动的操作过程(两个LED灯直接使用EMBAZ4205主板上的红绿灯)

1)ZYNQ启动流程

1.首先了解ZYNQ的启动过程, ZYNQ的启动过程以 ARM核为主, 上电后 硬件先读取ARM核PS端的IO 以确定 系统从NAND ,QSPI ,SD Card还是 JTAG 启动系统。 (EBAZ4205板子默认硬件是从NAND FLASH 驱动的)

ZYNQ 的不同启动方式 以及 启动相关的IO 及选项,如下图所示,如果需要让系统从SD卡模式启动

下图是EBAZ4205部分启动部分的配置电阻, 其中IO0就是上图中ZYNQ的MIO5, IO1就是上图中的MIO4

所以要从 NAND FLASH 启动改成TF 卡启动 只需要将IO0 即MIO5从低电平改成高电平, 也就是将R2584的 20K 更换位置到R2577的地方即可(图上的位置是 NAND FLASH 启动,更换这个电阻由下面变到上面即可)

3) 软件部分配置

1.创建工程–>create block design–>”+”–>检索zynq7 processing system 并添加

2.添加ZYNQ 7处理器模块

依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K128M16JT 125,数据位宽选择16bit 最后点击“OK”,如下图所示。

在MIO Configuration 中 使能SD 0的功能

接下来添加2路EMIO 用于点亮LED 来进行演示

保存后 点选Run Block Automation 默认设置,并点OK

手动连接 M_AXI_GP0_ACLK 到 FCLK_CLK0

右键框图里的GPIO_0 ,并选MAKE EXTERNAL 来拉出GPIO_0资源

之后点选保存,并点source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper如下图所示。

在弹出的对黄框里保持默认

软件自动为我们生成HDL文件

按下绿色箭头对工程进行编译

添加LED 的管脚定义

RTL_ANALYSIS –> Schematic –> IO/Ports

这次我们直接点亮主板上的两个LED指示灯(非转接板上的指示灯),根据原理图可以看到两个灯分别是接到W13和W14上, 将W13 和W14填入两个IO的选项中,并将电平选项修改成3.3

保存设置(会提醒 创建约束的名称,随意点入即可)

按下Generate Bitstream 完成综合以及生成bit文件

4 SDK部分配置

1)File→Export→Export hardware…,在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。

2)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”,如下图所示。

系统将自动打开SDK开发环境

3)再创建一个LED 工程,负责LED 指示灯的闪烁

a. 创建一个新的空工程,可以取名叫LED

b.右键工程LED 的SRC目录,然后新建一个SOURCE FILE

c.取名 main.c

d. 复制以下代码 到main.c (代码是SDK中 GPIO的示例代码)


#include "xparameters.h"
#include "xgpiops.h"
#include "xplatform_info.h"

#define LED_RED         54
#define LED_GREEN  	55

#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs Gpio;	/* The driver instance for GPIO Device. */

void Gpio_Init(void){
	XGpioPs_Config *ConfigPtr;

	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

	XGpioPs_SetDirectionPin(&Gpio, LED_RED, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, LED_RED, 1);
	XGpioPs_WritePin(&Gpio, LED_RED, 0);

	XGpioPs_SetDirectionPin(&Gpio, LED_GREEN, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, LED_GREEN, 1);
	XGpioPs_WritePin(&Gpio, LED_GREEN, 0);

}

int main(void){
	volatile int Delay;
	Gpio_Init();

	while(1){
		XGpioPs_WritePin(&Gpio, LED_RED, 0);
		XGpioPs_WritePin(&Gpio, LED_GREEN, 1);
		for (Delay = 0; Delay < 20000000; Delay++);
		XGpioPs_WritePin(&Gpio, LED_RED, 1);
		XGpioPs_WritePin(&Gpio, LED_GREEN, 0);
		for (Delay = 0; Delay < 20000000; Delay++);
	}
}

代码解读, 因为我们是用EMIO 的方式来点亮LED ,而EMIO 是从54开始的, 我们在FPGA端一共设置了两路EMIO,所以这里定义了

#define LED_RED 54

#define LED_GREEN 55

对LED_RED IO 输出高电平:

XGpioPs_WritePin(&Gpio, LED_RED, 1);

对LED _RED_IO 拉低

XGpioPs_WritePin(&Gpio, LED_GREEN, 0);

延时

for (Delay = 0; Delay < 20000000; Delay++);

main 函数的循环中 LED_RED 和LED_GREEN 不停的输出高和低, 这样在板子上就是两个灯不停的交叉亮灭

e.在线调试看看 程序是否正常运行

先对FPGA部分进行配置,点选XILINX –>Program FPGA , 弹出的对话框点选 PROGRAM 进行配置

在项目列表中选中刚才创建的LED工程,右键,选择run as–> launch 进行调试,

如果看到主板上的两个LED灯交替闪烁了,说明程序正常工作了

5. 创建TF卡的 镜像文件

创建镜像文件分两步1. 创建FSBL模块,2.创建image(boot.bin)文件

1)在SDK中新建如下,然后设置工程名fsbl,点next选择FSBL模板

2.选中刚才创建的LED 工程,点 XILINX–>Create Boot Image(必须要选中 不然接下来的窗口会是空的 不会自动填入)

正常的话,系统会自动帮我们填入里面的的信息, 如果项目创建了多个应用工程,需要仔细确认下图中的信息 是否有误

如果信息是空白的或者有误 可以在前面要求选中的地方,先鼠标左键选择其他的目录,之后再点回我们的应用 ,这样再打开create image 信息就恢复正常了

如果系统仍然没有 自动填入,或者信息有误,可以参考我之前的工程,里面有手动填入这些信息的方法

EBAZ4205 第八个工程 程序固化 NAND FLASH

之后点击Create Image ,生成镜像文件, 并且记住导出的文件夹(后面要用)

6. 验证SD TF 卡启动

  1. 在刚才create boot image 中的 ouput中 bif 和boot.bin文件的导出文件夹中,复制出这两个文件到空的TF卡中 (切记 需要格式化成FAT32格式)

2. 将TF 卡插入到 主板的卡槽中

3. 将板子设置成 TF卡启动模式(前面提到,需要修改电阻位置)

4.重新断电后 再上电, 正常情况下 系统的两个指示灯开始交替闪烁,说明TF卡启动成功了

如果启动不成功,有可能是以下几种情况

a. TF卡的 格式不对,

b. TF卡有多个分区,需要统一成一个再进行格式化,(用老毛桃等工具做过启动盘的会出现这种情况)

c. TF卡不支持,尝试更换不同品牌 不同容量大小的TF卡, 大容量,越高速的TF卡的兼容性越差

完整的工程如下

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注