4-关于JTAG调试、启动代码烧写
- 格式:doc
- 大小:845.50 KB
- 文档页数:16
嵌入式系统基础之:实验内容——使用JTAG 烧写Nand
Flash
4.4 实验内容使用JTAG 烧写NandFlash1.实验目的通过使用JTAG 烧写Flash 的实验,了解嵌入式硬件环境,熟悉JTAG 的使用,为今后的进一步学习打下良好的基础。
本书以优龙的FS2410 及Flash 烧写工具为例进行讲解,不同厂商的开发板都会提供相应的Flash 烧写工具,并有相应的说明文档,请读者在了解基本原理之后查阅相关手册。
2.实验内容(1)熟悉开发板的硬件布局。
(2)连接JTAG 口。
(2)安装giveio(用于烧写Flash)驱动。
(3)打开SJF2410_BIOS.BAT(Flash 烧写程序)进行烧写。
3.实验步骤(1)熟悉开发板硬件设备。
(2)用20 针的排线将20 针的JTAG 接口与JTAG 小板的JP3 接口相连。
(3)安装giveio 驱动,如图4.24 所示。
图4.24 安装givieo
单击Install 按钮,出现如图4.25 所示的效果,这就表明驱动安装成功。
图4.25givieo 驱动安装完成
(4)打开SJF2410_BIOS.BAT,如图4.26 所示。
图4.26 打开SJF2410_BIOS.BAT
(5)在Selectthefunctiontotest:输入0,表示对K9S1208(FS2410 的NandFlash 的芯片型号)进行烧写,如图4.27 所示。
图4.27 选择烧写对应芯片。
altera cyclone器件告别AS下载模式,直接用JTAG配置器件进行编程看CYCLONE II的器件手册时,看到一段关于配置器件的描述:可以通过JTAG接口对串行配置器件进行编程,可是里面没有详细的使用方法,在altera的网站上找到了一些关于这个的资料先介绍一下SFL:Serial Flash Loader,它是通过JTAG接口在系统编程(isp)串行配置器件。
这种方法主要是通过FPGA作为一个JTAG与串行配置器件之间的桥梁,优点是能通过一个JTAG接口对器件进行配置,缺点是慢,因为在编程前要对FPGA进行配置。
废话少说,首先编译生成SOF文件,也就是JTAG方式下的下载文件,然后1 在“文件”里选择“Convert Programming Files”,出现对话框后2 在programming file type里选.jic3 在configuration device里选择相应的串行配置器件4 file name选择转换文件5 选sof data,单击add file选择sof文件6 flash loader单击add device选择FPGA器件然后OK生成JIC文件,后面的事情跟JTAG下下载一样,只是将文件类型选为JIC文件,可惜我转换的时候选EPCS1时,老提示容量不够,选EPCS4就没有问题了,大家可以试试。
cyclone器件, jtag和as下载模式JTAG是直接烧到FPGA里面的,由于是SRAM,所以断电后要重烧;AS是烧到FPGA的配置芯片里保存的,每次上电就写到FPGA里;pof文件可以通过as方式下载(保证byteblasterII/usb blaster连接正确);sof文件或者转换的jic可以通过jtag方式下载;这两种下载模式使用的接口外形是完全一样的,要注意区分!使用Flash Loader(JTAG模式)下载EPCS器件一般来说Altera公司Cyclone或者CycloneII系列FPGA相应的配置器件会选择EPCS系列串行FLASH。
jtag烧写flash原理JTAG烧写Flash原理一、JTAG简介JTAG(Joint Test Action Group)是一种标准的芯片测试和编程接口,它可以在不需要物理插头的情况下测试和编程芯片。
它是由IEEE (Institute of Electrical and Electronics Engineers)制定的标准,目前已经成为了一个广泛应用于数字电路测试和调试的标准接口。
二、JTAG烧写Flash原理Flash存储器是一种非易失性存储器,它可以在断电后保持数据。
因此,Flash存储器被广泛应用于各种嵌入式系统中。
在设计和开发过程中,需要对Flash存储器进行烧写操作以更新或修改程序代码。
JTAG接口可以用于烧写Flash存储器。
其原理如下:1. JTAG接口连接首先,将目标设备的JTAG接口与烧写设备的JTAG接口相连。
这个连接通常包括四个信号线:TCK、TMS、TDI和TDO。
2. 进入ISP模式通过向目标设备发送特定的命令序列,在目标设备中进入ISP(In-System Programming)模式。
在ISP模式下,目标设备将会响应来自烧写设备的命令,并将Flash存储器暴露给烧写设备。
3. 读取Flash存储器状态烧写设备通过JTAG接口向目标设备发送命令,以读取Flash存储器的状态。
这些状态包括Flash存储器的大小、页大小、块大小以及是否需要擦除等信息。
4. 擦除Flash存储器在烧写新程序代码之前,必须先将Flash存储器擦除。
为了提高效率,通常只需要擦除需要烧写的代码所在的块。
5. 写入新程序代码在完成Flash存储器的擦除后,可以开始写入新程序代码。
烧写设备通过JTAG接口向目标设备发送命令和数据来完成这个过程。
通常,数据是按页或块大小分批次写入的。
6. 验证新程序代码在完成新程序代码的烧写后,需要进行验证以确保数据正确性。
烧写设备通过JTAG接口向目标设备发送命令和数据来读取已经烧写到Flash存储器中的数据,并将其与原始数据进行比较。
如何通过JLINK烧写STM32程序JLink是一种常用的调试工具,可以用于烧写STM32芯片上的程序。
下面是使用JLink烧写STM32程序的步骤:1. 首先,确保你已经安装了JLink驱动程序并且JLink调试工具已经连接到了电脑上。
2. 打开JLink调试工具,并选择你要烧写的目标芯片。
如果你不知道目标芯片的型号,你可以通过查看芯片上的标识或者查询相关的文档来确定。
3.确定你的目标芯片的烧写模式。
一般情况下,有两种常见的模式可以选择:SWD和JTAG。
SWD是一种常用的调试接口,相对较快且占用较少的引脚。
JTAG是一种通用的调试接口,相对较慢且占用较多的引脚。
根据芯片的具体支持情况和你的需求,选择适当的模式。
4. 调整JLink调试工具的配置,以便与目标芯片进行通信。
你需要提供目标芯片的设备ID和速度等参数。
这些参数可以通过查询芯片型号相关的文档或者使用JLink提供的查询命令来获取。
5. 准备好要烧写的程序文件。
程序文件可能是一个.bin文件,也可能是一个.hex文件。
你可以使用Keil或者其他的编译器生成这些文件。
6. 在JLink调试工具中选择“烧写”或者类似的功能选项。
根据JLink调试工具的不同,这个选项的名称可能有所不同。
7. 在弹出的烧写对话框中,指定要烧写的程序文件,并选择烧写的目标地址。
通常情况下,程序文件将会烧写到芯片的Flash存储器中。
8. 确认配置无误后,点击“开始烧写”或者类似的按钮,开始烧写程序。
烧写过程可能会需要一些时间,具体的时间取决于程序文件的大小和JLink调试工具的速度。
9.等待烧写完成,检查是否有错误出现。
如果烧写过程没有出现错误,那么程序应该已经成功烧写到了芯片上。
10. 断开JLink调试工具的连接,重新启动目标芯片。
目标芯片应该能够正常运行烧写的程序。
请注意,上述步骤只是一个基本的烧写流程示例。
具体的步骤可能会因为你使用的JLink调试工具和编译器的不同而有所不同。
JTAG烧写Flash原理一、什么是JTAG?JTAG(Joint Test Action Group)是一种用于芯片测试和调试的标准接口。
它定义了一组用于访问目标设备内部结构、获取芯片状态以及进行调试和编程的信号和协议。
JTAG具有广泛的应用,其中之一是在软件开发过程中用于烧写Flash存储器。
二、Flash存储器简介Flash是一种非易失性存储器,它可以电擦除和编程。
Flash存储器通常用于存储程序代码和数据,它在数字设备中起到了至关重要的作用。
在许多嵌入式系统中,Flash存储器被作为主存储器使用,因此在研发过程中烧写程序代码和数据到Flash存储器是非常常见的任务。
三、JTAG烧写Flash的基本原理JTAG烧写Flash的基本原理是通过JTAG接口读取目标设备的内部状态、控制信号以及访问存储器地址,然后将要烧写的数据写入Flash存储器。
下面将详细介绍JTAG烧写Flash的过程。
JTAG接口的连接首先,需要将烧写设备(如JTAG调试器)与目标设备上的JTAG接口连接。
JTAG 接口通常包括TCK(时钟信号)、TMS(状态信号)、TDI(数据输入信号)和TDO (数据输出信号),通过连接这些信号,烧写设备可以与目标设备进行通信。
进入和退出JTAG模式在JTAG烧写Flash之前,需要将目标设备进入JTAG模式。
这可以通过在JTAG接口上发送一系列特定的JTAG命令来实现。
进入JTAG模式后,目标设备的内部状态机会切换到与JTAG相关的状态,以便进行后续的烧写操作。
完成烧写后需要退出JTAG模式,将目标设备恢复到正常的运行模式。
读取目标设备状态在进行烧写操作之前,需要读取目标设备的当前状态。
这可以通过发送特定的JTAG命令,并从目标设备的TDO信号上读取返回的状态信息。
目标设备的状态包括Flash存储器是否就绪、是否处于保护状态等。
根据不同的状态,可以确定是否可以进行烧写操作。
编程Flash存储器一旦目标设备进入了JTAG模式并且处于可编程状态,就可以开始进行烧写操作了。
STM32的几种烧写方法STM32是意法半导体(STMicroelectronics)推出的一系列32位ARM Cortex-M微控制器。
在开发STM32项目时,常常需要通过烧写程序将代码加载到芯片中。
以下是几种常见的STM32烧写方法。
1. ST-Link/V2烧写器ST-Link/V2是STM32系列芯片的官方烧写器。
它是通过USB接口与开发主机连接,并通过调试线与目标芯片连接。
ST-Link/V2支持多种烧写方式,如JTAG、SWD和SWIM。
它可以与STM32编程工具(如ST-Link Utility和STM32CubeProg)结合使用,实现快速、可靠的编程。
2.UART烧写一些STM32系列芯片(如STM32F10x系列)集成了UART引导加载程序(Bootloader),可以通过串口通信进行烧写。
首先,需要将芯片的BOOT0引脚设置为高电平,然后通过串口线将开发主机与芯片连接。
最后,在开发主机上运行特定的烧写工具(如ST Flash Loader Demonstrator),上传并烧写程序到芯片中。
BDFU烧写USB Device Firmware Upgrade(DFU)是一种用于通过USB接口更新固件的标准协议。
STM32系列芯片中的USB DFU引导加载程序可以使设备进入DFU模式,并使用特定的DFU烧写工具(如DfuSe、dfu-util)通过USB接口加载新的固件。
4. IAP烧写(In-Application Programming)IAP是一种在应用程序运行时更新固件的方法。
通过使用IAP库函数,应用程序可以擦除、编程和读取闪存中的数据。
具体实现方式是将新的固件数据传输到目标芯片的特定存储区域,然后由应用程序将固件写入闪存。
5.SD卡烧写一些STM32系列芯片(如STM32F7系列)支持通过SD卡加载程序。
在SD卡上存储已编译的二进制文件,然后将SD卡插入与芯片相连的卡槽,在芯片上电时,引导加载程序将自动读取SD卡上的固件并烧写到存储器中。
jtag标准调试流程JTAG(Joint Test Action Group)是一种用于测试和调试集成电路的标准接口。
下面是JTAG标准调试流程的详细步骤:1. 硬件连接:将JTAG调试器与目标设备连接起来。
通常使用JTAG调试器的JTAG接口连接到目标设备的JTAG接口上,确保连接正确无误。
2. 软件设置:打开调试软件,并选择正确的目标设备和调试器。
根据实际情况,可能需要设置一些调试选项,如时钟频率、通信速率等。
3. 初始化:调试软件会发送一些初始化命令到目标设备,以确保设备处于正确的状态。
这些命令可能包括复位设备、加载调试固件等。
4. 读取设备信息:调试软件会读取目标设备的一些基本信息,如设备ID、版本号等。
这些信息可以用于确认目标设备是否正确连接,并且与调试软件兼容。
5. 设置断点:调试软件可以设置断点,以便在程序执行到指定位置时暂停执行。
断点可以设置在特定的代码行、函数调用或内存地址上。
6. 单步执行:调试软件可以逐步执行程序,以便检查每一步的执行情况。
可以使用单步执行命令,逐条执行指令,或者逐个时钟周期执行。
7. 查看寄存器状态:调试软件可以读取和修改目标设备的寄存器状态。
这些寄存器包括通用寄存器、特殊功能寄存器等,用于存储和控制设备的状态信息。
8. 查看内存内容:调试软件可以读取和修改目标设备的内存内容。
可以查看程序代码、数据等存储在内存中的信息,以便分析和调试程序。
9. 跟踪程序执行:调试软件可以跟踪程序的执行流程,记录程序运行时的各个环节。
可以查看函数调用栈、程序计数器值等,以便分析程序的执行路径。
10. 分析错误:如果程序发生错误或异常,调试软件可以捕获并显示错误信息。
可以查看错误代码、错误位置等,以便定位和修复问题。
11. 退出调试模式:调试完成后,可以选择退出调试模式。
调试软件会发送相应的命令到目标设备,使其恢复正常工作状态。
以上是JTAG标准调试流程的一般步骤,具体的流程可能会根据不同的调试工具和目标设备而有所差异。
1、首先安装H-JTAG V2.1RELEASE.exe或者更高版本的软件。
默认安装即可。
2、开发板的JTAG口连接好20PIN排线,WRIGGLE板连好PC机的并口。
3、给开发板上电,运行H-JATG软件,运行后如下图
4、选择菜单栏“Settings”-“USB/LPT Selection”-LPT并口
5、点击“OK”按钮之后,提示“Deteting target...”
6、点击这个图标,进入H-Flasher下载界面。
7、选择菜单栏“Load”,选择所需要的配置文件,文件名后缀.hfc
8、去掉Production里的勾,如下图;
9、进入“Programming”
10、如果要烧写UBOOT,直接在“Src File”里选择需要下载的文件就行了。
11、如果要烧写NBOO1ST.BIN,对于“Dst Addr:”选择Block-0000;如果要写NBOOT2ND.BIN,则选择Block-0002;YC-UMON.BIN和SJF烧写一样,具体对应的套餐烧写对应的块数。
FTU程序烧写说明烧写程序必须在Windows98下进行。
1.电源板插入J3端子。
2.短接主板的S2短路插针。
3.用JTAG仿真器将微机并口与主板MCU_JTAG1端子相连(仿真器端子的凸出侧朝内)。
4.为主板加电。
5.运行“JTAG .exe”。
6.运行“ARM DEBUG for Windows . EXE”。
7.打开“File | Load Image…”,在对话框中选择“ICE_Boot . axf”文件。
8.按运行命令运行约2秒后按停止命令停止运行,如程序停止在“b loop”语句上表示微机与单片机连接正常,否则为连接不正常,可重复第7步直至连接正常。
9.打开“File | Load Image…”,在对话框中选择“host_progflash_intel_double . axf”文件。
10.打开“Veiw | Sourse Files”,选择“host_progflash_intel_double .c”文件。
在文件的FlashEraseChip、FlashWrite、FlashWrite函数上设置断点。
11.按运行命令运行FlashEraseChip函数,擦除Flash芯片。
12.打开“File | Get File…”,在对话框中首先修改ADDRESS值为0x80000,选择“Flashboot.bin”文件后按打开按钮。
13.运行FlashWrite函数烧写入Flashboot.bin文件。
14.打开“File | Get File…”,在对话框中首先修改ADDRESS值为0x90000,选择“Zzkx.bin”文件后按打开按钮。
15.运行FlashWrite函数烧写入Zzkx.bin文件。
16.拔下S2短路插针,至此程序烧写完成。
1检测与调试1.1测试的意义测试是借助合适的手段方法,为了保证PCB设计和制板的正确性,以及对系统性能,可靠性,稳定性进行检查验证。
只有保证硬件系统达到设计时要求的健康性、稳定性和功能性,才能进行上层开发。
1.2PCB检测的步骤1.2.1目检制板之后需要对实际硬件进行检测,首先是目视焊接检查(visual examination),目检虽然不借助任何仪器但是但却是实际硬件测试的序曲,要使用人眼这一部高精密的仪器,对整版进行外观上的“扫描”。
主要察看是否有芯片方向错焊,甚至芯片歪斜的情况;是否出现蚀刻铜箔断裂缺失甚至剥离的情况;检查双列贴片类型的芯片,是否有引脚间堆锡(短路)或者引脚虚焊(断路)以及其它一些诸如裂纹、分层、起泡、残余铜等属于加工工艺方面出现问题的情况。
1.2.2电压检查当认为PCB不具有难以接受的影响系统的缺陷时,便可以开始和电相关的测试。
供电的检查是整个系统上电检查的前奏,目的是排除任何可能发生的供电错误,如电源短路包括电源平面间短路,开路、芯片错碰电平。
虽然是电压的检查,但是此时还不宜上电,避免击穿芯片烧毁电路。
需要对照原理图、PCB,按照系统中所标出的电压,逐个检查芯片的电源脚是否处于对应的电源网络。
首先,用万用表拨蜂鸣档检查电源适配接头的+5V和GND,以不鸣为正常。
然后,将万用表黑笔与地相接,红笔逐个试探各电压测试点,以检测不同电源平面和地之间是否短路,以不鸣为正常。
接着,将万用表黑笔与其中一个电源相接,红笔逐个试探个电压测试点,以检测不同平面之间是否存在短路,检测是否存在供电错误的问题,以不鸣为正常。
最后,对于个别芯片,为确保万无一失,对其电源脚和接地脚进行检测。
测量电源脚的时候,需要用万用表黑笔接在该芯片的供电电平测试脚处,红笔接芯片对应电源脚,以万用表鸣叫为正常。
测量接地脚的时候,同法用黑笔接参考地端,红笔接芯片接地端。
当PCB确定无误的时候,可以尝试加电进行下一步。
1.2.3上电检查上电后留意主要元件以及电源周围钽电容的状态,如果听见锡膏融化被挤压的尖锐声音、发现元件红热、闻到树脂焦糊味或者是电容爆炸,必须立即断电。
当PCB 上电源指示LED工作正常时,即可开始进行其它点的检测。
上电检测的一个重点内容是串口的好坏,因为还没有数据进出,因此主要对串口电平进行检测,对照第三章中的图3.5,检测两只MAX3232的管脚2(C+)、6(C-)、7(T2out)、9(R2out)、12(R1out)、14(T1out)的电平,检验值应符合以下电压值:C+的值为+5.5V~+6V、C-的值为-5.5V~-6V,R1out、R2out值为+3.3V,T1out、T2out 值为-6V。
检验的目的是保证MAX3232空闲状态下内部已经处于正常状态,一旦加载启动代码就可以输出调试信息。
4.3第一次烧写启动代码刚完成上电检测,所有电平都正确的时候,整个系统还不具备任何一丁点的功能。
因此需要首先为系统配置引导程序,引导程序使用三星公司的标准程序经ADS 编译后生成镜像,将20针MultiICE-JTAG口接在电路板的对应接口上,从PC上启动SJF-2440.exe烧写工具,选择对应的FLASH型号K9F1208U0C,输入烧写的真实地址0x00000000,进行烧写。
在嵌入式系统中,不像PC那样,在主板上有一个CMOS,用来存放固件,而是用一个被称作bootloader的程序,用以启动系统和作简单的管理。
实际上,在一个稍微复杂的嵌入式系统中,bootloader是十分重要的,它有如下的一些作用:(1)把内核(kernel)复制到RAM,然后启动它;(2)初始化硬件;(3)下载程序并写入flash;(4)检测目标板.Vivi是什么?Vivi是mizi公司设计,为ARM处理器系列设计的一个bootloader,因为vivi目前只支持使用串口和主机通信,所以您必须使用一条串口电缆来连接目标板和主机。
一、安装BIOS1、安装BIOS到ARM板连接JTAG 烧写板到目标板,打开板子电源,使用命令行工具sjf2410.exe 可以烧写bios到NandFlash 或者Nor flash。
烧写sbc_vivi 到Nand Flash 的典型界面如下:2、安装USB驱动BIOS 烧写完毕,取下JTAG 烧写板,并选择从Nand Flash 启动系统,打开dnw.exe 软件,点菜单Configuration,设置串口如下:再点菜单Serial Port->Connect,按住电脑键盘空格键以进入vivi模式,此时打开板子电源或者复位系统,可以看到从串口打印出如图信息,如果信息不全,请再次使用上面的步骤安装一次BIOS。
提示:如果此时接上USB 电缆,将会看到dnw.exe 标题栏显示USB:OK,这表明您可以使用USB 来下载程序了,详见以下安装步骤。
二、安装Linux安装Linux 系统主要有以下步骤:(1)格式化Nand Flash在vivi 模式下输入:bon part 0 192k 1216k 对板子进行分区。
说明:bon 是分区命令,以上命令的意思是把Nand Flash 从0 开始分为三个区:0- 192k:大小为192k192k-1216k:大小为1M1216k-64M:大小为62.8M注意:分区后不要关电或者掉电,因为此时NandFlash中已经被清空,需要照下面的步骤再重新下载一次BIOS,否则你将需要使用SJF2410.exe再次下载一次。
(2)重新安装BIOS接上面的步骤,输入:load flash vivi u此时出现如下提示界面,板子等待用户进行USB 下载传输,点USB Port->Transmit,找到并选择sbc_vivi 开始下载,下载完毕,vivi 将会被自动烧写到Nand Flash。
提示:用户也可以使用load flash vivi x命令,通过超级终端的xmodem 协议来下载程序。
(3)安装内核文件接上一步骤,输入:load flash kernel u此时点击USB Port->Transmit 选择您所需要的的内核文件开始下载。
下载完毕,Linux内核文件将会被自动烧写到Nand Flash。
提示:用户也可以使用load flash kernel x命令,通过超级终端的xmodem 协议来下载程序,不过速度比较慢。
(4)安装文件系统接上一步,输入:loadyaffs–e root u此时点击USB Port->Transmit 选择相应的文件系统映象开始下载。
下载完毕,Linux内核文件将会被自动烧写到Nand Flash。
提示:此过程大概需要2-3 分钟。
(5)启动系统接上一步,在vivi 模式下输入boot,或者重新启动SBC2410X 可以正常启动系统。
三、ADS编译过程:1、将JTAG调试小板连接到计算机并口,并和调试目标连上。
在打开H-JTAG的时候,H-JTAG会自动执行检测操作。
用户也可以通过H-JTAG的菜单/工具栏进行检测,如下图所示。
如果检测成功,H-JTAG主界面将会显示检测到的芯片类型和ID,如果检测失败,请检查H-JTAG设置和硬件连接。
图4-1 检测目标板2、打开ADS,添加工程文件,以串口调试为例,添加工程文件UART.mcp,如下所示:3、选择“DebugRel Setting”,弹出设置窗口如下:选择ARM Assembler,选择芯片类型,此处我们选用ARM920T,如图所示:再点击ARM C Comple,同样选择ARM920T,如下图所示:再点击ARM Linker,设置RO Base为0x3000000,设置RW Base为0x3040000,最后点击确定。
如下图所示:3、点击make,点击Debug, 弹出AXD界面。
对AXD进行配置ADS(ARM DEVELOPER SUIT)是ARM公司原厂的IDE,拥有众多的用户。
AXD是ADS自带的调试软件。
下面介绍如何配置AXD以配合H-JTAG进行调试。
首先,点击“Optio n”→“Configure Target”菜单,如图所示:图Configure Target 菜单接下来用户会看到如图所示的Configure Target配置窗口。
Configure Target配置窗口在上图所示的配置窗口中,点击ADD按钮,用户会看到如图4-3所示的选择DLL文件的对话框。
在对话框中选择H-JTAG安装目录下的H-JTAG.dll,点击确定。
图4-3选择H-JTAG.dll确定后,用户可以看见H-JTAG已经添加到AXD里去了,如图4-4所示。
双击H-JTAG或者单击Configure按钮,用户就可以看到如图4-5所示的H-JTAG信息。
在图4-4中,点击OK,ADX的配置就全部完成了。
图4-4 配置完成图4-5H-JTAG信息4、在AXD里面加载镜像文件。
如下图所示。
点击“fil e”→“load image”,找到所调试的程序→选择DebugRel下面的“.axf”文件。
点击“open”,加载成功。
5、点击“运行”调试程序,此时如果程序没有问题,在超级终端可以观察到相应的程序运行结果。
1.3内存测试程序内存测试程序的目的是检测内存的所有存储单元是否能被正常读写。
只要可以正常访问所有存储单元,也即从另方面证明,MCU与SDRAM间通信良好,信号可正常在MCU到SDRAM的每一根传输线上传播。
根据3.4.2章节的设计,测试的地址范围从0x30200000,到0x31ff0000。
因为将偏移地址0x00000000到0x00200000的共计2M字节的空间划分给系统用于存储启动代码,启动代码会在系统上电后被全部从FlashROM装入到RAM。
所以,能够启动硬件从串口得到调试信息,就证明了SDRAM中起始2M空间的无误性。
测试程序定义了一个MemTest( )函数,函数分为两个部分,首先设定一个指针变量pt,用来存储内存的每一个存储单元的地址,因为本系统构建了32位的数据总线,因此pt的类型为无符号整形unsigned int。
第一部分为对内存单元的写操作,将指针指向的地址存入指针指向地址的存储空间。
第二部分对内存单元进行读操作和校验数值,操作指针依次指向每一个存储空间,读每一个存储空间,并将其值与指针变量中存储的值进行比较,如果有误则说明存储系统出现问题,用一个标准输出语句报错并将问题单元格的地址输出。
主要代码如下:Uart_Printf("Memory Test(%xH-%xH):WR",_RAM_STARTADDRESS+0x00200000,(_ISR_STARTADDRESS&0xffff0000)); //输出log,信息为存储测试开始,首先进行men写操作,输出操作范围为地址0x00200000H到0x33ffff00Hpt=(U32 *)(_RAM_STARTADDRESS+0x00200000); //开始,首先将起始地址赋给指针变量pt,指针指向测试的起始地址0x00200000while((U32)pt<(_ISR_STARTADDRESS&0xffff0000))//定义一个循环语句,循环结束的条件是pt>0x31ffff00{*pt=(U32)pt; //将pt本身的地址值赋给pt指向的存储单元,32位地址数据被分为2个字分别存储到两片内存的对应单元中pt++;//pt指向下一个存储单元格}Uart_Printf("\b\bRD"); //开始进行读操作并对单元格内容进行校验pt=(U32 *)(_RAM_STARTADDRESS+0x00200000); //开始,首先将起始地址赋给指针变量pt,指针指向读操作的起始地址0x00200000while((U32)pt<(_ISR_STARTADDRESS&0xffff0000))//定义一个循环语句,循环结束的条件是pt>0x31ffff00{data=*pt; //将指针变量pt所指向单元格中的内容赋给32位辅助变量data if(data!=(U32)pt) //判断pt所指向单元格中的内容是否与pt指向的地址一至,如果不一致,进入大括号执行里面的语句{memError=1;//内存出错标志变量置1Uart_Printf("\b\bFAIL:0x%x=0x%x\n",i,data);//报错并举出出错的地址break; //报错后跳出校验循环}pt++; //指针指向下一个单元,准备下一循环读操作}if(memError==0)Uart_Printf("\b\bO.K.\n"); //条件比较中看标志变量memError是否为假,如果为假即无错误发生,检测结束,输出“O.K.”,程序结束。