本帖最后由 qgyhd1234 于 2018-5-6 19:32 编辑
之前在x1上跑RT_Thread时,因为官方未做适配,所以学习了下1052的启动加载。
x1板子上拨码开关SW7可以选择1052的启动模式,主要有Hyper Flash启动,QPSI Flash启动,SD卡启动,usb或串口下载,更具体的介绍可以去看https://forum.anfulai.cn/forum.ph ... 0888&extra=page%3D1
rt1052内部的rom不给用户使用,所以需要外接flash来保存代码,x1接的是Hyper Flash。
为适应不同的flash,当RT1052的片上ROM在检测到启动模式为FlexSPI接口后,会根据BootPin的配置信息配置该模式下需要使用的FlexSPI接口管脚的复用模式并将FlexSPI的时钟配置成默认的30MHz,然后会以0x6000_0000为首地址读取前512Byte作为外部Flash的配置信息(几线制的SPI Flash,SPI的时钟频率,LUT查找表,DDR/SDR模式以及片选CS管脚的hold/setup time等信息)并以此来配置FlexSPI模块以满足外部flash的特性。
然后1052会读取接下来的跟用户Image相关的几个关键信息,即IVT(Image Vector Table),Boot Data和DCD(Device configuration data)。其中IVT需要放在外部Flash的固定偏移地址(对于NorfFlash来说其需要存储在基地址+4KB的偏移地址)供ROM读取以便让系统知道用户Image的第一条执行指令放在哪里以及BootData和DCD的存放地址,BootData则保存了完整Image的首地址和整个image所占的空间大小,而DCD则包含了一些配置命令以便在跳到用户程序入口之前供ROM调用配置内部外设以更好的匹配外部IC,一般如果系统外挂了SDRAM的情况则需要配置好DCD(因为有时需要主程序在跑起来之前,外部SDRAM就得处于ready状态,以供CPU把data或者code copy到SDRAM里时不会出错)。
x1自带的工程里xip文件夹下的三个文件包含了我们需要的flexspi配置信息,dcd_data,image_vector_table和boot_data,直接将这三个文件添加到工程就好了,然后要做的就是修改分散加载文件了,直接打开RT-Thread的分散加载文件,根据上面的描述,先定义放flash配置文件和vector_table的地址和大小
#define m_flash_config_start 0x60000000
#define m_flash_config_size 0x00001000
#define m_ivt_start 0x60001000
#define m_ivt_size 0x00001000
然后加入两个加载时域,第一个加载时域地址是0x60000000,放flash配置文件,第二个加载时域地址是 0x60001000,放IVT,Boot Data和DCD,记得要把IVT输入段放在第一个,确保IVT在0x60001000。
LR_m_rom_config m_flash_config_start m_flash_config_size { ; load region size_region
RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
* (.boot_hdr.conf, +FIRST)
}
}
LR_m_rom_ivt m_ivt_start m_ivt_size { ; load region size_region
RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
* (.boot_hdr.ivt, +FIRST)
* (.boot_hdr.boot_data)
* (.boot_hdr.dcd_data)
}
}
由于 xip三个文件中的四个变量——Flash配置参数,IVT表,Boot data及DCD没有被程序中的其他函数调用,为了防止被编译器自动优化掉,需要在linker窗口中添加4条keep变量, --keep=*(.boot_hdr.ivt) --keep=*(.boot_hdr.boot_data) --keep=*(.boot_hdr.dcd_data) --keep=*(.boot_hdr.conf)
将这些改完后生成的固件里就自带了Flash配置参数,IVT表,Boot data,DCD和用户image了,可以像stm32一样直接用mdk下载程序到1052里了
|