发布信息当前位置: 首页 » 供应 » 监控/机器视觉 » 图像采集设备 » 图像采集卡 » 供应Dm642启动制作与映像

供应Dm642启动制作与映像

点击图片查看原图
公司: 北京汇科动力科技有限公司 
单 价: 面议 询价 
最小起订量:    
供货总量:
发货期限: 自买家付款之日起 天内发货
有效期至: 长期有效
最后更新: 2012-03-14
相关信息
 
产品详细说明

 

       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室
  •   
  相关产品
同类产品

[ 供应搜索 ]  [ ]  [ 告诉好友 ]  [ 打印本文 ]  [ 关闭窗口 ]  [ 返回顶部 ]

中国测控网郑重提醒:网上过低的价格有可能是虛假价格信息,请买家谨慎对待,谨防价格欺诈行为。投诉或价格欺诈行为,请发送邮件至 1365099215@qq.com