查看: 4768|回复: 1

i.MX RT启动数据DCD的结构及配置

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3303

    主题

    6550

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32055
    最后登录
    2024-4-30
    发表于 2020-5-28 15:03:42 | 显示全部楼层 |阅读模式
    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
    前几个字段都是内置的Boot ROM在初始化芯片时需要被读取的数据。初始化完成后会跳转到用户代码开始执行,也即Reset_handler。


    SDK的例程中关于IVT/FCB/DCD/LUT的定义及地址分配
    2.png
    3.png
    下面以常见的FlexSPI NOR Flash的启动为例,说明启动的过程
    4.png
    芯片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
    除了DCD文件,如果IDE使用IAR,我们也可用SDRAM的预处理文件(如evkmimxrt1050_sdram_init.mac)文件来初始化SDRAM。mac文件主要是SDRAM Debug模式时使用,当然在mac文件中配置的内容是和DCD一致的,在IDE的属性中可以找到mac文件的链接位置。
    6.png
    下面介绍一下DCD的结构及如何生成一个DCD文件。DCD 仅限于对启动有至关重要的内存区域和外设地址的设置。


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



                 DCD data format
    7.png
    DCD 头为 4 字节,格式如下:
    8.png
    ·标签(Tag):单字节字段设置为0xD2
    ·长度(Length):包含DCD总长度的大端模式的两字节字段(以字节为单位),包括标头
    ·版本(Version):单字节字段设置为0x41


    写入数据命令(CMD)


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



    下表是写入数据命令的格式(在大端字节数组中):
    9.png
    ·标签(Tag):单字节字段设置为0xCC
    ·长度(Length):大端模式的双字节字段,包含写入数据的长度,命令(以字节为单位),包括标头
    ·地址(Address):必须将数据写入的目标地址
    ·值/掩码(Value/Mask):要写入上述地址的数据值(或位掩码)



    参数字段(Parameter)是由位字段组成的单字节,如下所示:
    10.png
    ·字节(bytes):以字节为单位的目标地址的宽度(1、2或4)
    ·标志(flags):命令行为的控制标志
    ·数据掩码=位3:如果设置,目标地址上只能覆盖特定位(否则所有位都可以覆盖)
    ·数据集=位4:如果已设置,目标地址的位将使用此标志覆盖(否则将被忽略)


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



    成功后,此命令将按照如下标志写入每个目标地址:
    11.png
    检查数据命令


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



    检查数据命令是一个大端字节数组,其格式如下表所示:
    12.png
    ·标记(Tag):单字节字段设置为0xCF
    ·长度(Length):包含检查数据长度的大端字节格式的两字节字段命令(以字节为单位),包括标头
    ·地址(Address):要测试的源地址
    ·掩码(Mask):要测试的位掩码
    ·计数(Count):可选轮询计数;如果未指定计数,则此命令无限轮询,直到满足退出条件。如果计数=0,则此命令与NOP一样。



    参数字段是一个由位字段组成的单字节,如下所示:
    13.png
    ·字节(bytes):以字节为单位的目标地址的宽度(1、2或4)
    ·标志(flags):命令行为的控制标志
    ·数据掩码 (Data Mast)=位 3:如果设置,则只能在目标地址覆盖特定位(否则所有位都可以覆盖)
    ·数据集(Data Set)=位 4:如果已设置,目标地址的位将使用此标志覆盖(否则将被忽略)



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



    此命令不起作用。NOP 命令的格式是一个大端四字节数组,如下表所示:
    15.png
    ·标记(Tag):单字节字段设置为0xC0
    ·长度:大端模式的两字节字段,包含以字节为单位的NOP命令的长度(固定为值 4)
    ·未定义:此字节将被忽略,可以设置为任何值。


    Unlock 命令


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



    下表显示了解锁命令的格式(在大端字节数组中):
    16.png
    下面是一个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
    DCD.c
    18.png
    Dcdgen工具是个命令行工具,可以生成符合DCD要求的C或Binary的代码
    19.png
    下面是MCUBootUtility中如何生成DCD.c或DCD.bin,可以看到可使用已有的DCD.cfg文件,也可以自定义这些寄存器。
    20.png
    下面是MCUXpresso Config Tool中如何生成DCD.c,其中只能在Device Configuration Data(DCD)窗口中把要配置的寄存器、命令属性、寄存器赋值一一添加进去,在Code Preview中就能看到生成的DCD.c的代码了。
    21.png
    当然除了使用上述几种工具,也可以手动直接修改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
    也就是还要修改evkmimxrt1060_sdram_ini_dcd.c中对应的SEMC_SDRAMCR0寄存器即可。
    23.png
    当然如果要使用SDRAM debug 模式,也可以直接修改mac文件中的相应寄存器配置即可,如下图所示。
    24.png
    需要注意的是对于i.MX RT105x系列产品,SDRAM的配置选项的列地址数没有8bit的选项,因此i.MX RT105x系列的产品不支持小容量的SDRAM,支持的最小SDRAM容量是16MB。






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

    签到签到
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    7
    最后登录
    2024-2-29
    发表于 2024-2-29 16:41:34 | 显示全部楼层
    请问如果使用8MB的SDRAM具体要如何配置呢?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-2 18:00 , Processed in 0.114920 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表