热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracledcd设置,i.MXRT启动数据DCD的结构及配置

i.MXRT启动数据DCD的结构及配置目前NXP的i.MXRT因为很好的性能,在MCU市场上受到了广泛的欢迎。i.MXRT内部有三种SRAM,分别是IT

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的结构如下:

none.gif

1.png (64.35 KB, 下载次数: 5)

2020-5-28 14:47 上传前几个字段都是内置的Boot ROM在初始化芯片时需要被读取的数据。初始化完成后会跳转到用户代码开始执行,也即Reset_handler。

SDK的例程中关于IVT/FCB/DCD/LUT的定义及地址分配

none.gif

2.png (150.9 KB, 下载次数: 7)

2020-5-28 14:47 上传

none.gif

3.png (108.64 KB, 下载次数: 3)

2020-5-28 14:48 上传下面以常见的FlexSPI NOR Flash的启动为例,说明启动的过程

none.gif

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的读写。

none.gif

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文件的链接位置。

none.gif

6.png (98.21 KB, 下载次数: 5)

2020-5-28 14:48 上传下面介绍一下DCD的结构及如何生成一个DCD文件。DCD 仅限于对启动有至关重要的内存区域和外设地址的设置。

ROM根据IVT中的信息确定DCD表的位置。下面显示的DCD表是大端模式DCD命令字节数组。DCD最大限制为1768字节。

DCD data format

none.gif

7.png (16.64 KB, 下载次数: 7)

2020-5-28 14:48 上传DCD 头为 4 字节,格式如下:

none.gif

8.png (9.3 KB, 下载次数: 5)

2020-5-28 14:48 上传·标签(Tag):单字节字段设置为0xD2

·长度(Length):包含DCD总长度的大端模式的两字节字段(以字节为单位),包括标头

·版本(Version):单字节字段设置为0x41

写入数据命令(CMD)

写入数据命令用于把给定的1、2或4字节数值(或位掩码)写入到相应的目标地址中。

下表是写入数据命令的格式(在大端字节数组中):

none.gif

9.png (28.68 KB, 下载次数: 6)

2020-5-28 14:48 上传·标签(Tag):单字节字段设置为0xCC

·长度(Length):大端模式的双字节字段,包含写入数据的长度,命令(以字节为单位),包括标头

·地址(Address):必须将数据写入的目标地址

·值/掩码(Value/Mask):要写入上述地址的数据值(或位掩码)

参数字段(Parameter)是由位字段组成的单字节,如下所示:

none.gif

10.png (10.37 KB, 下载次数: 4)

2020-5-28 14:48 上传·字节(bytes):以字节为单位的目标地址的宽度(1、2或4)

·标志(flags):命令行为的控制标志

·数据掩码=位3:如果设置,目标地址上只能覆盖特定位(否则所有位都可以覆盖)

·数据集=位4:如果已设置,目标地址的位将使用此标志覆盖(否则将被忽略)

可以指定一个或多个目标地址和值/位掩码对。相同的字节和标志的参数应用于命令中的所有位置。

成功后,此命令将按照如下标志写入每个目标地址:

none.gif

11.png (37.97 KB, 下载次数: 4)

2020-5-28 14:48 上传检查数据命令

检查数据命令用于测试源地址中给定的1字节、2字节或4字节位掩码。

检查数据命令是一个大端字节数组,其格式如下表所示:

none.gif

12.png (19.19 KB, 下载次数: 6)

2020-5-28 14:48 上传·标记(Tag):单字节字段设置为0xCF

·长度(Length):包含检查数据长度的大端字节格式的两字节字段命令(以字节为单位),包括标头

·地址(Address):要测试的源地址

·掩码(Mask):要测试的位掩码

·计数(Count):可选轮询计数;如果未指定计数,则此命令无限轮询,直到满足退出条件。如果计数=0,则此命令与NOP一样。

参数字段是一个由位字段组成的单字节,如下所示:

none.gif

13.png (10.45 KB, 下载次数: 5)

2020-5-28 14:48 上传·字节(bytes):以字节为单位的目标地址的宽度(1、2或4)

·标志(flags):命令行为的控制标志

·数据掩码 (Data Mast)=位 3:如果设置,则只能在目标地址覆盖特定位(否则所有位都可以覆盖)

·数据集(Data Set)=位 4:如果已设置,目标地址的位将使用此标志覆盖(否则将被忽略)

此命令轮询源地址,直到满足退出条件,或者达到轮询计数。退出条件由标志确定,如下所示:

none.gif

14.png (53.38 KB, 下载次数: 4)

2020-5-28 14:49 上传NOP 命令

此命令不起作用。NOP 命令的格式是一个大端四字节数组,如下表所示:

none.gif

15.png (3.99 KB, 下载次数: 3)

2020-5-28 14:49 上传·标记(Tag):单字节字段设置为0xC0

·长度:大端模式的两字节字段,包含以字节为单位的NOP命令的长度(固定为值 4)

·未定义:此字节将被忽略,可以设置为任何值。

Unlock 命令

解锁命令用于防止特定功能在退出ROM被锁定。

下表显示了解锁命令的格式(在大端字节数组中):

none.gif

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

none.gif

17.png (199.57 KB, 下载次数: 7)

2020-5-28 14:49 上传DCD.c

none.gif

18.png (161.9 KB, 下载次数: 3)

2020-5-28 14:49 上传Dcdgen工具是个命令行工具,可以生成符合DCD要求的C或Binary的代码

none.gif

19.png (85.27 KB, 下载次数: 5)

2020-5-28 14:49 上传下面是MCUBootUtility中如何生成DCD.c或DCD.bin,可以看到可使用已有的DCD.cfg文件,也可以自定义这些寄存器。

none.gif

20.png (110.07 KB, 下载次数: 5)

2020-5-28 14:49 上传下面是MCUXpresso Config Tool中如何生成DCD.c,其中只能在Device Configuration Data(DCD)窗口中把要配置的寄存器、命令属性、寄存器赋值一一添加进去,在Code Preview中就能看到生成的DCD.c的代码了。

none.gif

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

none.gif

22.png (97.34 KB, 下载次数: 4)

2020-5-28 14:49 上传也就是还要修改evkmimxrt1060_sdram_ini_dcd.c中对应的SEMC_SDRAMCR0寄存器即可。

none.gif

23.png (184.11 KB, 下载次数: 7)

2020-5-28 15:02 上传当然如果要使用SDRAM debug 模式,也可以直接修改mac文件中的相应寄存器配置即可,如下图所示。

none.gif

24.png (225.08 KB, 下载次数: 5)

2020-5-28 15:02 上传需要注意的是对于i.MX RT105x系列产品,SDRAM的配置选项的列地址数没有8bit的选项,因此i.MX RT105x系列的产品不支持小容量的SDRAM,支持的最小SDRAM容量是16MB。

文章出处:恩智浦MCU加油站



推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
author-avatar
就是!有梦想
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有