i.MX RT启动数据DCD的结构及配置
目前NXP的i.MX RT因为很好的性能,在MCU市场上受到了广泛的欢迎。i.MX RT内部有三种SRAM,分别是ITCM、DTCM和OCRAM。主流使用的i.MX RT的内部SRAM都小于1MB,但对于有些应用,比如需要LCD显示的应用,则需要更大的RAM存放所需显示的每帧数据。如对于分辨率为WQGA(480x272)的屏,显示16bit的色深,用一个数据缓存区,显示一帧的数据至少需要260KB的RAM;如果想支持分辨率更高,得到更好的显示性能,如i.MX RT可支持分辨率WVGA(800x480)的LCD屏,显示24bit的色深,使用两个数据缓存区,则显示一帧的数据至少需要2.3MB的RAM;如果再加上其他的应用代码,1MB的内部SRAM是远远不够的。因此,很多应用需要外扩RAM,通常SDRAM用的比较多。
毫无疑问,i.MX RT支持SDRAM,并通过SEMC接口实现SDRAM的读写。
说到SDRAM的使用就不得不说i.MX RT的启动。除了内部RAM,i.MX RT启动支持以下6种外部存储器:
·Serial NOR Flash via FlexSPI
·Serial NAND Flash via FlexSPI
·Parallel NOR Flash via SEMC
·RAW NAND Flash via SEMC
·SD/MMC via uSDHC
·SPI NOR/EEPROM via LPSPI
其中Serial/Parallel NOR这两种存储器可以XIP(直接执行),其他4种存储器无法XIP,需要把代码拷贝到内部RAM或外接SDRAM里运行。对于内部RAM和SDRAM,两个都是易失性存储器,存放的代码或数据掉电会丢失,所以无法直接启动。
POR上电后,要么通过外部调试器,直接将应用程序和数据下载进SRAM/SDRAM,并将PC指向应用程序开始执行;要么通过存储在FLASH/ROM中的Bootloader程序,将应用程序和数据先加载到SRAM/SDRAM里,然后再跳转过去执行。
只不过SRAM是挂在系统总线上,一上电内部的SRAM就已经初始化完成了,而SDRAM是挂在存储器接口控制器上,因此需要先初始化SDRAM,才能向SDRAM中加载应用程序和数据。
除了从SDRAM 启动时需要在外部flash加载应用程序前提前初始化SDRAM,使SDRAM处于ready状态;有些应用同样需要在进入用户主程序前,完成SDRAM的初始化,以便CPU加载数据或代码到SDRAM时不会出错。如LCD的显示,对于字库和图形库文件的加载。
通常我们用DCD(Device configuration data)来初始化SDRAM.。但是DCD文件一般放在哪里及怎样定义呢,这里还是要说一下RT的启动,及一个可启动的image是如何构成的。
因为众所周知绝大多数的RT系列产品是没有内部FLASH的, 除了个别型号如i.MX RT1064;对于大多数有内部FLASH的MCU, FLASH地址是映射在内核的4GB系统空间内的(一般从0x0地址开始), MCU上电后可直接从内部FLASH读取应用代码并原地执行。
对于RT系列来说则是由片内的BootROM进行引导的,BootROM读取BOOT_MODE寄存器和eFUSEs的值,确定从哪个存储器启动,从外部存储器加载应用程序代码到内部SRAM、外部SDRAM或直接从Flash原地执行(XIP)。要让系统能够正常启动起来,以FlexSPI NOR flash为例,则烧写到外部SPIFlash里面的完整代码段必须按照BootROM规定的格式编写,也就是必须在用户的应用程序前加一个头文件, 这个头文件包含如下部分,这样才能正常启动。在这个头文件中就包含了SDRAM的配置信息,也就是DCD的定义。
通常可启动的Image头文件包含如下部分:
·Flash Configuration Parameters (FCP) — Flash的配置参数;
·Image Vector Table (IVT) — 包含指向固定物理地址的程序入口指针,包含指向DCD的指针,及其他的启动过程中ROM需要用到的指针,并通过查找这些入口地址找到程序的各组成部分;
·Boot data — 包含程序镜像文件的地址,大小及Plugin标志;
·Device Configuration Data (DCD) — 芯片配置数据,比如SDRAM寄存器的设置;这段数据的入口也包含在IVT中,这段数据最大为1768字
·Application — 用户程序及数据;
IVT的结构如下:
1.png (64.35 KB, 下载次数: 5)
2020-5-28 14:47 上传前几个字段都是内置的Boot ROM在初始化芯片时需要被读取的数据。初始化完成后会跳转到用户代码开始执行,也即Reset_handler。
SDK的例程中关于IVT/FCB/DCD/LUT的定义及地址分配
2.png (150.9 KB, 下载次数: 7)
2020-5-28 14:47 上传
3.png (108.64 KB, 下载次数: 3)
2020-5-28 14:48 上传下面以常见的FlexSPI NOR Flash的启动为例,说明启动的过程
4.png (104.42 KB, 下载次数: 7)
2020-5-28 14:48 上传芯片POR上电后,Arm CPU核心首先执行Boot ROM程序,判断并决定最终从QSPI Flash启动;ROM配置FlexSPI的PINMUX,时钟配置为30MHz,单线模式;读取Flash初始的512字节读取配置参数,并配置IOMUXC,LUT等;根据读取的参数配置Flash到正常运行模式;读取IVT并判断是否是XIP;如果是XIP直接从flash中执行,如果非XIP需先拷贝4K Byte数据到OCRAM。这4K Byte数据包含IVT、DCD和Boot Data。通过IVT找到DCD的入口地址后,ROM代码执行DCD检查,读取配置信息来对外设进行初始化,如SEMC的初始化;再从Boot Data中提取出程序镜像的地址和大小,然后加载到到RAM(SDRAM)中,并跳转到RAM(SDRAM)中开始执行。
当使用SDRAM时,大家经常会担心,MCU是什么时候初始化SDRAM,什么时候加载代码到SDRAM并开始执行的,会不会出现还没有初始化就开始加载代码的情况。
除了上面介绍的FlexSPI Flash的启动流程,下面以IAR的启动过程为例,可以在startup_MIMXRT1052.s中找到CPU的起始入口Reset_Handler,程序的加载过程实际上是在__iar_program_start这个函数里面实现的,这个函数是包含在IAR的lib库中。
这里可以看出来代码加载是在用户程序里执行的。但DCD的读取也就是SDRAM的初始化是在Boot Rom中执行的,所以是不会影响到后面代码和数据加载到SDRAM的。当然如果对DCD不熟,想直接初始化SDRAM,也可以把这些初始化放在SystemInit函数里面,因为SystemInit是在__iar_program_start之前执行完毕的,一样不会影响对SDRAM的读写。
5.png (60.58 KB, 下载次数: 5)
2020-5-28 14:48 上传除了DCD文件,如果IDE使用IAR,我们也可用SDRAM的预处理文件(如evkmimxrt1050_sdram_init.mac)文件来初始化SDRAM。mac文件主要是SDRAM Debug模式时使用,当然在mac文件中配置的内容是和DCD一致的,在IDE的属性中可以找到mac文件的链接位置。
6.png (98.21 KB, 下载次数: 5)
2020-5-28 14:48 上传下面介绍一下DCD的结构及如何生成一个DCD文件。DCD 仅限于对启动有至关重要的内存区域和外设地址的设置。
ROM根据IVT中的信息确定DCD表的位置。下面显示的DCD表是大端模式DCD命令字节数组。DCD最大限制为1768字节。
DCD data format
7.png (16.64 KB, 下载次数: 7)
2020-5-28 14:48 上传DCD 头为 4 字节,格式如下:
8.png (9.3 KB, 下载次数: 5)
2020-5-28 14:48 上传·标签(Tag):单字节字段设置为0xD2
·长度(Length):包含DCD总长度的大端模式的两字节字段(以字节为单位),包括标头
·版本(Version):单字节字段设置为0x41
写入数据命令(CMD)
写入数据命令用于把给定的1、2或4字节数值(或位掩码)写入到相应的目标地址中。
下表是写入数据命令的格式(在大端字节数组中):
9.png (28.68 KB, 下载次数: 6)
2020-5-28 14:48 上传·标签(Tag):单字节字段设置为0xCC
·长度(Length):大端模式的双字节字段,包含写入数据的长度,命令(以字节为单位),包括标头
·地址(Address):必须将数据写入的目标地址
·值/掩码(Value/Mask):要写入上述地址的数据值(或位掩码)
参数字段(Parameter)是由位字段组成的单字节,如下所示:
10.png (10.37 KB, 下载次数: 4)
2020-5-28 14:48 上传·字节(bytes):以字节为单位的目标地址的宽度(1、2或4)
·标志(flags):命令行为的控制标志
·数据掩码=位3:如果设置,目标地址上只能覆盖特定位(否则所有位都可以覆盖)
·数据集=位4:如果已设置,目标地址的位将使用此标志覆盖(否则将被忽略)
可以指定一个或多个目标地址和值/位掩码对。相同的字节和标志的参数应用于命令中的所有位置。
成功后,此命令将按照如下标志写入每个目标地址:
11.png (37.97 KB, 下载次数: 4)
2020-5-28 14:48 上传检查数据命令
检查数据命令用于测试源地址中给定的1字节、2字节或4字节位掩码。
检查数据命令是一个大端字节数组,其格式如下表所示:
12.png (19.19 KB, 下载次数: 6)
2020-5-28 14:48 上传·标记(Tag):单字节字段设置为0xCF
·长度(Length):包含检查数据长度的大端字节格式的两字节字段命令(以字节为单位),包括标头
·地址(Address):要测试的源地址
·掩码(Mask):要测试的位掩码
·计数(Count):可选轮询计数;如果未指定计数,则此命令无限轮询,直到满足退出条件。如果计数=0,则此命令与NOP一样。
参数字段是一个由位字段组成的单字节,如下所示:
13.png (10.45 KB, 下载次数: 5)
2020-5-28 14:48 上传·字节(bytes):以字节为单位的目标地址的宽度(1、2或4)
·标志(flags):命令行为的控制标志
·数据掩码 (Data Mast)=位 3:如果设置,则只能在目标地址覆盖特定位(否则所有位都可以覆盖)
·数据集(Data Set)=位 4:如果已设置,目标地址的位将使用此标志覆盖(否则将被忽略)
此命令轮询源地址,直到满足退出条件,或者达到轮询计数。退出条件由标志确定,如下所示:
14.png (53.38 KB, 下载次数: 4)
2020-5-28 14:49 上传NOP 命令
此命令不起作用。NOP 命令的格式是一个大端四字节数组,如下表所示:
15.png (3.99 KB, 下载次数: 3)
2020-5-28 14:49 上传·标记(Tag):单字节字段设置为0xC0
·长度:大端模式的两字节字段,包含以字节为单位的NOP命令的长度(固定为值 4)
·未定义:此字节将被忽略,可以设置为任何值。
Unlock 命令
解锁命令用于防止特定功能在退出ROM被锁定。
下表显示了解锁命令的格式(在大端字节数组中):
16.png (16.13 KB, 下载次数: 6)
2020-5-28 14:49 上传下面是一个DCD的配置函数(DCD.cfg),由此可生成符合上述要求的DCD格式的文件(如dcd.c或dcd.bin)。从DCD的配置函数中可以清楚看到哪些寄存器需要配置,但需要符合DCD的存储格式还是需要有个变换,因此可以用NXP提供的工具来完成。比如常用的dcdgen、MCUXpresso Config Tool、MCUBootUtility。其实可以看出MCUXpresso Config Tool和MCUBootUtility只是把命令行工具dcdgen集成进了各自的GUI中。
从DCD的配置文件中可以清楚的看到,SDRAM的初始化都包括哪些内容,比如时钟的初始化,SDRAM所用管脚的复用功能选择、管脚的属性配置、SEMC控制器的配置。
DCD.cfg
17.png (199.57 KB, 下载次数: 7)
2020-5-28 14:49 上传DCD.c
18.png (161.9 KB, 下载次数: 3)
2020-5-28 14:49 上传Dcdgen工具是个命令行工具,可以生成符合DCD要求的C或Binary的代码
19.png (85.27 KB, 下载次数: 5)
2020-5-28 14:49 上传下面是MCUBootUtility中如何生成DCD.c或DCD.bin,可以看到可使用已有的DCD.cfg文件,也可以自定义这些寄存器。
20.png (110.07 KB, 下载次数: 5)
2020-5-28 14:49 上传下面是MCUXpresso Config Tool中如何生成DCD.c,其中只能在Device Configuration Data(DCD)窗口中把要配置的寄存器、命令属性、寄存器赋值一一添加进去,在Code Preview中就能看到生成的DCD.c的代码了。
21.png (137.2 KB, 下载次数: 3)
2020-5-28 14:49 上传当然除了使用上述几种工具,也可以手动直接修改DCD.c的配置,尤其对于同一品牌,差异较小的SDRAM的配置改动,其实手动修改更简单方便。
如想把当前使用的32MB SDRAM换成更便宜的8MB SDRAM,如何修改DCD.c的配置呢?除了修改SEMC控制器BRx寄存器中SDRAM容量的大小,从32MB改为8MB,根据SDRAM容量的计算可知SDRAM的容量还和列地址数、Bank数,所以就要做相应的修改。
SDRAM Size(MB) = 2^(行地址数X列地址数) X BANK总数X 数据位宽 / 1024 / 1024 /8
22.png (97.34 KB, 下载次数: 4)
2020-5-28 14:49 上传也就是还要修改evkmimxrt1060_sdram_ini_dcd.c中对应的SEMC_SDRAMCR0寄存器即可。
23.png (184.11 KB, 下载次数: 7)
2020-5-28 15:02 上传当然如果要使用SDRAM debug 模式,也可以直接修改mac文件中的相应寄存器配置即可,如下图所示。
24.png (225.08 KB, 下载次数: 5)
2020-5-28 15:02 上传需要注意的是对于i.MX RT105x系列产品,SDRAM的配置选项的列地址数没有8bit的选项,因此i.MX RT105x系列的产品不支持小容量的SDRAM,支持的最小SDRAM容量是16MB。
文章出处:恩智浦MCU加油站