TMS320F2812启动过程

TMS320F2812从内部Flash启动的详细流程说明:

1>程序硬件复位或者软件复位;

2>判断XMP/MC信号状态;若该信号为高电平时是微处理器模式,此时外部接口Zone7有效,Zone7被映射到存储空间的高位,这样向量表指向外部,系统从Zone7启动。若该信号为低电平时是微计算机模式,此时Zone7被禁止,向量表指向Boot ROM,这样系统既可以从内部存储空间启动,也可以从外部存储空间启动。

3>到Boot ROM的0x3FFC00处取出复位向量,跳到Boot函数;(TMS320F2812有一块Flash地址从0x3FF000-0x3FFFFF在出厂时TI已经固化好了引导程序InitBoot,InitBoot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如Flash Boot模式,检测SPICLKA(GPIOF2),SPISTEA(GPIOF3),SCITXDA(GPIOF4),MDXA(GPIOF12)的电平,当都为高电平时表明是片内Flash Boot模式,那么InitBoot执行完后跳转到0x3F7FF6处,这个时候指令占据两个字节,刚好在代码模块之前。一定是跳转指令才行)

4>采集I/O管脚状态;

5>根据I/O状态选择Boot方式;

6>如果是Flash,程序退出Boot函数,跳转到0x3F7FF6(codestart);

7>取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00(0x3F6000)处(DSP281x_CodeStartBranch.asm中);

8>在C初始化的入口_C_INT00对一些变量,堆栈和寄存器进行必要的设置,该函数在C的库函数内(RTS Library);

9>进入main函数(0x3F658E,这个地址不是固定的,但是在Flash里面)。

从上电到我们的主函数运行之间这段时间里TMS320F2812到底做了些什么?TMS320F2812是怎样引导程序运行的?下面叙述其启动过程:

  在TMS320F2812中有一个引脚XMP/MC,当该引脚的为高电平时表示是微处理器模式(Microprocessor),当该引脚为低电平时表示微机算计模式(Microcomputer)。当为微处理器模式时,TMS320F2812内部的Boot ROM被禁止,通过Zone7(0x3FC000)从外部调引导程序启动,TMS320F2812复位以后,其复位向量是固定的0x3FFFC0,如果为微处理器模式,那么复位后的复位向量指向的外部的地址,即0x3FFFC0是Zone7处的地址;若为微机算计模式,那么0x3FFFC0指向的是TMS320F2812的片内Flash的址。下面就以微机算计模式加以说明其过程。

  上电复位后,复位向量是指向片内Flash的0x3FFFC0,TMS320F2812有一块Flash地址从0x3FF000-0x3FFFFF在出厂时已经固化好了引导程序。在0x3FFFC0处是一条跳转指令,跳到InitBoot(地址0x3FFC00)函数处执行InitBoot代码,该InitBoot代码就是TI在DSP出厂时固化在Flash中的。InitBoot Assembly Routine将选择SelectBootMode Function启动模式函数。这个函数由GPIO 引脚的状态决定启动类型。

引导模式选择


SCITXDA

(GPIOF4)


MDXA

(GPIOF12)


SPISTEA

(GPIOF3)


SPICLK

(GPIOF2)

Mode Selected
1  x  x  x
跳转到地址为0x3F7FF6的Flash,用户必须在这里编写分支语句优先于复位,以按需要重新定位代码的执行

0 1  x x
调用SPI_Boot 以从外部的EEPROM载入

0 1 1
调用SCI_Boot 以从SCI-A载入

0 1 0
J跳转到 H0 SARAM 0x3F8000

0 0 0 1
跳转到OTP地址0x3D7800

0 0 0 0
调用Parallel_Boot从GPIO 端口B载入

  一旦启动结束,选择启动模式函数返回一入口地址给InitBoot函数。入口地址是退出BootLoader之后代码开始执行的起始点。InitBoot接着将会调用ExitBoot子程序,把CPU寄存器的状态恢复到复位状态。比如Flash Boot模式,那么InitBoot执行完后跳转到0x3F7FF6处(codestart处),此位置刚好在128位(CSM)密码位置之前,你要在0x3F7FF6处放置跳转指令,以跳转到你要去的地方,比如是BootLoader或应用代码,通常的跳转去处是_c_int00。在0x3F 7FF6 处放置跳转指令的方法如下(DSP281x_CodeStartBranch.asm中):

 1 ***********************************************************************
 2 *File:DSP281x_CodeStartBranch.asm
 3 *Apply to:F2810,F2811,F2812 devices.
 4 *Author: David Chan, WintechDigital System Inc.
 5 ***********************************************************************
 6
 7 WD_DISABLE    .set    1        ;set to 1 to disable WD, else set to 0
 8
 9     .ref _c_int00
10
11 ***********************************************************************
12 * Function: codestart section
13 *
14 * Description: Branch to code starting point
15 ***********************************************************************
16
17     .sect "codestart"
18
19 code_start:
20     .if WD_DISABLE == 1
21         LB wd_disable       ;Branch to watchdog disable code
22     .else
23         LB _c_int00         ;Branch to start of boot.asm in RTS library
24     .endif
25
26 ;end codestart section
27
28
29 ***********************************************************************
30 * Function: wd_disable
31 *
32 * Description: Disables the watchdog timer
33 ***********************************************************************
34     .if WD_DISABLE == 1
35
36     .text
37 wd_disable:
38     SETC OBJMODE        ;Set OBJMODE for 28x object code
39     EALLOW              ;Enable EALLOW protected register access
40     MOVZ DP, #7029h>>6  ;Set data page for WDCR register
41     MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD
42     EDIS                ;Disable EALLOW protected register access
43     LB _c_int00         ;Branch to start of boot.asm in RTS library
44
45     .endif
46
47 ;end wd_disable
48
49
50     .end
51
52 ; end of file CodeStartBranch.asm
  1 MEMORY
  2 {
  3     PAGE 0 :
  4         RAMM0          : origin = 0x000000, length = 0x000400
  5         /******************************************************************
  6         *On F281x L0 SARAM is 0x008000-0x008FFF, and L1 SARAM is
  7         *             0x009000-0x009FFF.
  8         * Hence, whole SECURE_RAM is 0x008000-0x009FFF
  9         *******************************************************************/
 10         SECURE_RAM    : origin = 0x008000, length = 0x002000
 11         BEGIN_FLASH    : origin = 0x3F7FF6, length = 0x000002    /*RAM run:0x3F9FFa*/
 12
 13         RESET          : origin = 0x3FFFC0, length = 0x000002
 14         VECTORTS    : origin = 0x3FFFc2, length = 0x00003e
 15
 16         FLASH         : origin = 0x3d8000, length = 0x01FF80  /* for Flash */
 17
 18         /*PRAMH0     : origin = 0x3F8000, length = 0x001ff4 */      /*for RAM 0x001ffe*/
 19
 20
 21     PAGE 1 :
 22        /* SARAM                     */
 23        RAMM1    : origin = 0x000400, length = 0x000400
 24        DRAMH0     : origin = 0x3f8000, length = 0x002000
 25
 26 }
 27
 28
 29 SECTIONS
 30 {
 31    /* Allocate program areas: */
 32    secureRamfuncs    : LOAD=FLASH, PAGE = 0    /*PRAMH0*/
 33                          RUN=SECURE_RAM,PAGE=0
 34                          RUN_START(_secureRamFuncs_runstart),
 35                          LOAD_START(_secureRamFuncs_loadstart),
 36                          LOAD_END(_secureRamFuncs_loadend)
 37    .reset           : > FLASH,      PAGE = 0    /*PRAMH0*/
 38    .text            : > FLASH,      PAGE = 0    /*PRAMH0*/
 39    .cinit           : > FLASH,      PAGE = 0    /*PRAMH0*/
 40    /* zhaowritefunc  : LOAD=FLASH,PAGE=0
 41                     RUN=SECURE_RAM,PAGE=0
 42                     RUN_START(_zhaowritefunc_runstart),
 43                        LOAD_START(_zhaowritefunc_loadstart),
 44                        LOAD_END(_zhaowritefunc_loadend)
 45     zhaoreadfunc  : LOAD=FLASH,PAGE=0
 46                     RUN=SECURE_RAM,PAGE=0
 47                     RUN_START(_zhaoreadfunc_runstart),
 48                        LOAD_START(_zhaoreadfunc_loadstart),
 49                        LOAD_END(_zhaoreadfunc_loadend)
 50     transmit_work_scifunc  : LOAD=FLASH,PAGE=0
 51                     RUN=SECURE_RAM,PAGE=0
 52                     RUN_START(_transmit_work_scifunc_runstart),
 53                        LOAD_START(_transmit_work_scifunc_loadstart),
 54                        LOAD_END(_transmit_work_scifunc_loadend)
 55     transmit_work_usbfunc  : LOAD=FLASH,PAGE=0
 56                     RUN=SECURE_RAM,PAGE=0
 57                     RUN_START(_transmit_work_usbfunc_runstart),
 58                        LOAD_START(_transmit_work_usbfunc_loadstart),
 59                        LOAD_END(_transmit_work_usbfunc_loadend)*/
 60
 61  /*  frame_valid_low_test_programfuncs:  LOAD=FLASH,PAGE=0
 62                     RUN=SECURE_RAM,PAGE=0
 63                     RUN_START(_frame_valid_low_test_programfuncs_runstart),
 64                        LOAD_START(_frame_valid_low_test_programfuncs_loadstart),
 65                        LOAD_END(_frame_valid_low_test_programfuncs_loadend)
 66
 67 frame_valid_high_test_programfuncs:  LOAD=FLASH,PAGE=0
 68                     RUN=SECURE_RAM,PAGE=0
 69                     RUN_START(_frame_valid_high_test_programfuncs_runstart),
 70                        LOAD_START(_frame_valid_high_test_programfuncs_loadstart),
 71                        LOAD_END(_frame_valid_high_test_programfuncs_loadend)
 72 */
 73 /* fifo_empty_test_programfuncs  : LOAD=FLASH,PAGE=0
 74                     RUN=SECURE_RAM,PAGE=0
 75                     RUN_START(_fifo_empty_test_programfuncs_runstart),
 76                        LOAD_START(_fifo_empty_test_programfuncs_loadstart),
 77                        LOAD_END(_fifo_empty_test_programfuncs_loadend)
 78  fifo_half_test_programfuncs  : LOAD=FLASH,PAGE=0
 79                     RUN=SECURE_RAM,PAGE=0
 80                     RUN_START(_fifo_half_test_programfuncs_runstart),
 81                        LOAD_START(_fifo_half_test_programfuncs_loadstart),
 82                        LOAD_END(_fifo_half_test_programfuncs_loadend)
 83 */
 84
 85
 86 /*    tint0_sub_lowRAMFUNCS  : LOAD=FLASH,PAGE=0
 87                     RUN=SECURE_RAM,PAGE=0
 88                     RUN_START(_tint0_sub_lowRAMFUNCS_runstart),
 89                        LOAD_START(_tint0_sub_lowRAMFUNCS_loadstart),
 90                        LOAD_END(_tint0_sub_lowRAMFUNCS_loadend)  */
 91     /* Jump to the Flash boot mode Entry! */
 92     codestart        : LOAD = BEGIN_FLASH, PAGE = 0
 93
 94     /* Allocate data areas: */
 95    .stack           : > RAMM1,       PAGE = 1
 96    .bss             : > DRAMH0,      PAGE = 1
 97    .ebss            : > DRAMH0,      PAGE = 1
 98    .const           : > DRAMH0,      PAGE = 1
 99    .econst          : > DRAMH0,      PAGE = 1
100    .sysmem          : > DRAMH0,      PAGE = 1
101  }

  上面代码执行后跳到C初始化的入口_c_int00(0x3F6000) ,在C初始化的入口,_c_int00对一些变量,堆栈和寄存器进行必要的设置,这个函数在运行支持库(rts.lib)中,_c_int00函数为建立C运行环境,需完成以下工作:

  1. 为系统堆栈产生.stack块,并初始化堆栈指针;
  2. 从.cinit块将初始化数据拷贝到.bss块中相应的变量;
  3. 对寄存器进行必要的配置,调用main函数开始运行C程序。
时间: 2024-08-26 17:51:33

TMS320F2812启动过程的相关文章

tomcat启动过程报the JDBC Driver has been forcibly unregistered问题的修复过程

最近两天在整理关于flume的总结文档,没有启动过tomcat.昨天晚上部署启动,发现报了如题的错误,全文如下: 严重: The web application [/oa-deploy] registered the JBDC driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] but failed to unregister it when the web application was stopped. To prevent a mem

Linux启动过程笔记

Linux启动过程 1.启动流程(BIOS->MBR:Boot Code->引导GRUB->加载内核->执行init->runlevel) 2./boot/grub/下有多个文件   其中stage1为MBR镜像(512字节) stage2为引导程序 3./boot/grub/grub.conf为引导的配置文件 default=0#默认加载下边哪个系统 timeout=3#引导等待时间 splashimage=(hd0,1)/boot/grub/splash.xpm.gz#引

SpringMVC启动过程

1.  对于一个web应用,其部署在web容器中,web容器提供一个其一个全局的上下文环境,这个上下文环境就是ServletContext,它为后面的spring IoC容器提供宿主环境: 2.  web.xml中有配置ContextLoaderListener,也可以自定义一个实现ServletContextListener接口的Listener方法,web.xml中的配置实例如下: <listener> <listener-class>com.manager.init.Syst

Linux内核分析 实验三:跟踪分析Linux内核的启动过程

贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 1.打开shell,输入启动指令,内核启动完成后进入menu程序,支持三个命令help.version和quit. 2.然后使用gdb跟踪调试内核,输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 3.按住

systemd启动过程

理解Linux启动过程 在我们打开Linux电脑的电源后第一个启动的进程就是init.分配给init进程的PID是1.它是系统其他所有进程的父进程.当一台Linux电脑启动后,处理器会先在系统存储中查找BIOS,之后BIOS会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由MBR控制. 主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程

深入理解UIApplication和ios程序启动过程

在深入理解UIApplication前我们先了解ios程序的启动过程: UIApplication类在ios里面为app的管理和协调提供一个集中的点,每一个app有一个UIApplication的实例,当app启动时,系统会调用main函数里面的UIApplicationMain函数,该函数会创建一个UIApplication的实例,设置run loop,启动info.plist里面指定的main.storyboard,加载UIview.

(作业3)Linux内核的启动过程(从start_kernel到init进程启动)

作业题目: 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下: 题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动: 博客中需要使用实验截图 博客内容中需要仔细分析

linux基础:5、linux启动过程

linux启动过程 1.BIOS(basic in out system) 通电检查硬件,然后加载第一可用启动项的mbr: #可通过BIOS设置各种介质存储设备的启动顺序,比如:cdrom.disk.usb 2.MBR(main boot recorder) 磁盘的第一个扇区,共512字节,446字节的boot程序空间,64字节的分区表,2字节的校验位. 执行MBR内保存的boot loader程序,一般为GRUB,通过GRUB来找到kernel和initrd(centos6里面此文件更名)并将

Linux启动过程

Linux启动过程 传说]散人--南宁1,开机,读取BIOS并进行自我检测2,透过BIOS取得第一个开机装置,读取MBR取得开机管理程序3透过开机管理程序,取得KERNEL(内核)加载内存且侦测系统硬件4核心计动呼叫INIT的程序5INIT程序开始执行系统初始化6依据INIT的程序进行daemon start7加载本机设定 22:19:25[传说]Ed1 2015/1/20 22:19:25 启动第一个程序init,读取配置文件fstab22:20:37[传说]散人--南 2015/1/20 2