Dm642启动制作与映像
一、原理与概述
二、复位启动与引导说明
Cpu 引导1K
三、引导代码与说明
1K引导4K
四、内存初始化以及简单文件启动
4K
五、启动结构与配置说明
六、启动1K代码说明
七、启动4K代码说明
八、sram运行说明
九、SDram运行说明
十、制作向导与应用
一、原理与概述
配置Dm642为EMIF启动,即设置 A22,A21 为有效,即1K拉高 。Cpu 上电复位后,默认配置Emif Ce0 Ce1 Ce2 Ce3 均为 8位同步存储,内部sram为地址模式0X00000000~0X3FFFF, 然后开始自动读取 0X90000000 处 1Kbyte 的代码到 内部Sram 0X00000000 ,然后跳转到 内部Sram 0X00000000处开始执行代码。
0x00000000的1K代码 (简称Boot_1K)主要任务是继续读取0X90000000,的引导代码,并且跳转执行。本设计中我们引导了0X90000000处 4K代码到 0X0003F000,并且调转到0X0003F100处。
0X0003F000的4K代码 (简称Boot_4K),则负责将 SDRAM初始化,IO初始化,并且再次引导启动代码到指定地址。其中我们使用了BootConfig结构体存放了启动初始化配置参数以及启动引导的代码与目标地址。
至此引导过程全部完成。
Boot4K为 Boot1K+Boot4K源代码。
BootLoadVersionMgr为VC项目, 产生Boot4K的映像(8,bin格式)
FlashTool为执行烧写的PC程序
注意问题:
1、 读写速率
a) 启动时外部存储使用 EMIF的时钟(设计中采用150M有效时钟, A20 ,A19),读取操作速度为外部时钟 频率/ (RDSETUP * RDSTRB) ,
本设计中EMIF采用150M, 所以Flash操作速率150M / (1111 11 1111 ) ~= 150K ,Flash读写速度一般都大于1M,因此CPU的启动基本不会有问题。
CE2 (0X100 ) ,对应地址0X90000000~ , 8 bit | ||||||||
WRSETUP |
WRSTRB |
WRHLD |
RDSETUP |
TA |
RDSTRB |
MTYE |
WRHLDMSB |
RDHLD |
1111 |
11 1111 |
11 |
1111 |
11 |
11 1111 |
0000 |
0 |
011 |
2、 上电复位
由于CPU启动需要约200CLOCK时钟周期, 因此在时钟同步完成 时候持续200*mms 即可复位处理器(Reset置高)约为1ms。实际中考虑按键等因素,复位匹配 为 4.7K上拉, 1K下拉 , 1uf 复位电容即可。
3、启动默认配置 为 Ce2 0X90000000 为8 bit 同步存储,内部Cache 禁用 ,地址0X0000000 ~0X3FFFF 为可写可读 高速Sram.本设计为 300M
CPU引导完成后交付程序执行
3、 引导失败可能由于 Flash的地址、数据线连接失败,可以采用示波器查看以下信号
1、 CE2 是否有一个有效(---___---)
2、 ADDR[10..0]是否出现波形 —--
3、 DATA[7..0]是否出现波形
4、 FLASH_R是否有一个有效(---___---),要同步CE2
5、 通过仿真器察看 0X90000000地址的数据是否正确(确保数据线正确)
6、 通过仿真器察看 0X90000000~0X90000400数据是否正确(确保地址线正确)
二、复位启动与引导说明
Boot_1K 主要功能 将Boot_4K调入到Sram
以下参看代码(main.c):
void Init() ;
#pragma CODE_SECTION( c_int00,".BOOT_ENTRY_00000")
//将代码c_int00定位在初始位置
// BOOT_ENTRY_00000 : origin = 0x03F000, len = 0x000040
//.BOOT_ENTRY_00000 : {} > BOOT_ENTRY_00000
void c_int00()
{
asm(" MVKL .S2 0X04C0 , SP");
asm(" MVKH .S2 0X04C0 , SP");
// Init();
asm(" MVKL .S2 0X000040 , B3");
//asm(" MVKH .S2 0X0003F100 , B3");
asm(" B B3 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
}
#define BOOT_LOAD_ADDR 0X90000000
#define BOOT_LOAD_ENTRY 0X0003F000
#define BOOT_LOAD_SIZE 0X00001000
#pragma CODE_SECTION( Init,".BOOT_ENTRY_00040")
//将代码c_ Init定位在有效位置
// .BOOT_ENTRY_00040 : {} > BOOT_ENTRY_00040
// BOOT_ENTRY_00040 : origin = 0x03F040, len = 0x0000C0
void Init()
{
int i=0;
unsigned char *pCode =(unsigned char *)BOOT_LOAD_ADDR ;
unsigned char *pEntry =(unsigned char *)BOOT_LOAD_ENTRY ;
WaitMs(1000);
for(i=0; i<BOOT_LOAD_SIZE; i++)
{
pEntry[i]=pCode[i];
}
//if(pEntry[0]==0XFF) while(1);
//asm(" MVKL .S2 0X0003FFF0 , SP");
//asm(" MVKH .S2 0X0003FFF0 , SP");
asm(" MVKL .S2 0X0003F100 , B3");
asm(" MVKH .S2 0X0003F100 , B3");
asm(" B B3 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
asm(" NOP 8 ");
}
1、 采用c_int00能让编译器直接使用本函数,而不是使用类库的默认函数
将c_int00定位在0X3F000:1、 由于实际烧写的时候为 内部Sram 0X3F000~0X3FFFF 所处的代码或者数据 –〉Flash 0X90000000~0X90000FFF (烧写器实际从Flash 0x00000开始烧写); 而CPU启动 Flash 0X90000000~0X90000FFF -〉Sram 0X0000,所以该代码实际出现在 CPU 0X00000处
2、 Init 将代码Flash 0X90000000~0X90000FFF 拷贝到 0X3F000
a) 为了保证Flash初始化完成,可以考虑稍微等待一会
b) 代码可以直接跳转,但是注意设置好堆栈 SP, 因为0X3F000处的0X100字节包含了c_int00 与 Init 的代码, 而该代码已经无效,所以充当堆栈使用
c) WaitMs代码不应该过大,确保 BOOT_ENTRY_0000 + BOOT_ENTRY_00040 小于256字节
三、引导代码与说明
Boot_4K代码本身占用了地址:0X3F000~0X3FFFF,所以预留为执行程序空间为0X0000~0X3EFFF共 252K连续Sram空间;另外采用结构配置函数将Sdram初始化,可以使用 0X80000000处地址为程序所用; 0X9000000处也被初始化为Flash,也可以作代码地址使用。
Boot_4K开始执行有效的引导代码 ,配置地址空间。为了灵活起见,使用了配置结构:
typedef struct {
//Emif 16 0X00
u32 GBLCTL ;// EMIF global control register
u32 CE0CTL ;// EMIF CE sPACe control registers
u32 CE1CTL ;// EMIF CE space control registers
u32 CE2CTL ;// EMIF CE space control registers
u32 CE3CTL ;// EMIF CE space control registers
u32 CE0SEC ;// EMIF CE space secondary control registers
u32 CE1SEC ;// EMIF CE space secondary control registers
u32 CE2SEC ;// EMIF CE space secondary control registers
u32 CE3SEC ;// EMIF CE space secondary control registers
u32 SDCTL ;// EMIF SDRAM control register
u32 SDTIM ;// EMIF SDRAM refresh control register
u32 SDEXT ;// EMIF SDRAM extension register
u32 PDTCTL ;// EMIF peripheral device transfer control register
//u32 CE0SIZE ;
//u32 CE1SIZE ;
//u32 CE2SIZE ; //
u32 EmifNull[3] ;
//code 16 0X40
u32 CodeSrcAddr ;
u32 CodeSrcLen ;
u32 CodeDestAddr ;
u32 LoadNull;
u32 CodeSrcAddr1 ;
u32 CodeSrcLen1 ;
u32 CodeDestAddr1 ;
u32 LoadNull1;
u32 CodeSrcAddr2 ;
u32 CodeSrcLen2 ;
u32 CodeDestAddr2 ;
u32 LoadNull2;
u32 CodeSrcAddr3 ;
u32 CodeSrcLen3 ;
u32 CodeDestAddr3 ;
u32 LoadNull3;
//entry 4 0X80
u32 entry;
u32 cpuRunClock;//khz
u32 entryNull;
u32 configFlag;
//Gpio 4 0X90
u32 gpioEn;
u32 gpioDir;
u32 gpioValue;
u32 ledFlag;
//Cache 4 0XA0
u32 CCFG ;
u32 MAR_60_7F ;
u32 MAR_80_9F ;
u32 MAR_A0_BF ;
//0XB0
u32 bootLoadNull[4];
//0XC0
//u32 bootLoadNull2[16];
u32 sramAddr ;
u32 sramSize ;
u32 flashAddr ;
u32 flashSize ;
u32 sdramAddr ;
u32 sdramSize ;
u32 cacheAddr ;
u32 cacheSize ;
//0XE0
u32 bootLoadNull2[8];
}BootLoadStruct;
该结构共占用了256字节,放置在Flash 0X9003FF00处,即占用Boot_4K的最后0X100字节。由于Boot1K引导 0X90000000~0X90000FFF 到 Sram 0X0003F000~0X0003FFFF,所以程序将结构体直接指到CONFIG_BASE_ADDR:
#define CONFIG_BASE_ADDR (0X3F000 + 0X00F00 )
BootLoadStructConfig = (BootLoadStruct *)CONFIG_BASE_ADDR ;
1、 程序将 根据 EMIF参数将配置内存以及Flash
a) 设计中采用了256M 150M SDram 配置参看 BootloadVersiomMgr
b) Flash使用了 缺省的8Bit配置 容量为512K 地址为0X90000000
c) CE2/Ce3 使用了缺省配置
2、GPIO口设置为输入
3、 根据CodeSrcAddr(Flash的执行代码),CodeSrcLen (长度),CodeDestAddr(目标地址)三个参数,进行二次引导
程序一共引导了4段代码或者数据
4、引导完成后 ,根据需要配置Cache
5、然后直接跳转到指定的入口
注意:由于配置了Cache ,但是代码全部在SRAM,所以一旦跳出后,Sram内的数据将被Cache重写,不再有效,所以代码不能返回。
四、内存初始化以及简单文件启动
十、制作向导与应用
该程序主要是制作启动映像:
BootVersionMgr
网站www.dspserver.com 资料下载中有详细使用说明以及该项目的VC源代码.
注意Boot4K代码以及测试程序均在www dspserver com 网站有下载
- 北京汇科动力科技有限公司 [加为商友]
- 联系人dsp(先生) 部门经理
- 地区北京
- 地址北京市海淀区知春里甲10号誉得写字楼613室