dsp2812启动过程1.docx

上传人:b****3 文档编号:27133793 上传时间:2023-06-27 格式:DOCX 页数:22 大小:299.18KB
下载 相关 举报
dsp2812启动过程1.docx_第1页
第1页 / 共22页
dsp2812启动过程1.docx_第2页
第2页 / 共22页
dsp2812启动过程1.docx_第3页
第3页 / 共22页
dsp2812启动过程1.docx_第4页
第4页 / 共22页
dsp2812启动过程1.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

dsp2812启动过程1.docx

《dsp2812启动过程1.docx》由会员分享,可在线阅读,更多相关《dsp2812启动过程1.docx(22页珍藏版)》请在冰豆网上搜索。

dsp2812启动过程1.docx

dsp2812启动过程1

2812的内部Flash启动过程

2812的内部flash启动过程

2812从内部flash启动的详细流程说明:

a)        程序硬件复位或者软件复位

b)       判断mp/mc是否为0

c)        为0则从bootrom启动,否则从外部启动

d)       到bootrom的0x3FFFC0处取出复位向量,跳到boot函数

e)        采集IO管脚状态,

f)        根据IO状态选择boot方式

g)       如果是flash,程序退出boot函数,跳转到0x3F7FF6

h)       取出跳转指令,跳转到自己的指定地址或者C初始化的入口_C_INT00处

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

j)         进入main函数

 

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

    在2812中引脚XMP/~MC,当该引脚的为高电平时表示是微处理器模式(microprocessor),为低电平时表示微机算计模式(microcomputer),当为微处理器模式时,2812内部的bootrom被禁止,通过zone7(0x3FC000)从外部调引导程序启动。

2812复位以后,其复位向量是固定的0x3FFFC0,如果为微处理器模式,那么复位后的复位向量指向的外部的地址,即0x3FFFC0是zone7处的地址,若为微机算计模式,那么0x3FFFC0指向的是2812的片内FLASH的地址。

下面就以微机算计模式加以说明其过程。

    上电复位后,复位向量是指向片内Flash的0x3FFFC0,2812有一块flash地址从0x3FF000-0x3FFFFF在出厂时已经固化好了引导程序。

在0x3FFFC0处是一条跳转指令,跳到iniboot(地址0x3FFC00)函数处执行iniboot代码,该iniboot代码就是TI在dsp出厂时固化在flash中的。

InitBootassemblyRoutine将选择SelectBootModefunction启动模式函数。

这个函数由GPIO引脚的状态决定启动类型。

引导模式选择

GPIOF4

GPIOF12

GPIOF3

GPIOF2

(SCITXDA)

(MDXA)

(SPISTEA)

(SPICLK)

PU

NoPU

NoPU

NoPU

ModeSelected

1

X

X

X

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

0

1

X

X

调用SPI_Boot以从外部的EEPROM载入

0

0

1

1

调用SCI_Boot以从SCI-A载入

0

0

1

0

J跳转到H0SARAM0x3F8000

0

0

0

1

跳转到OTP地址0x3D7800

0

0

0

0

调用Parallel_Boot从GPIO端口B载入

一旦启动结束,选择启动模式函数返回一入口地址给InitBoot函数。

入口地址是退出bootloader之后代码开始执行的起始点。

InitBoot接着将会调用ExitBoot子程序,把CPU寄存器的状态恢复到复位状态。

比如flashboot模式,那么initboot执行完后跳转到0x3F7FF6处(codestart处),此位置刚好在128位(CSM)密码位置之前,你要在0x3F7FF6处放置跳转指令,以跳转到你要去的地方,比如是bootloader或应用代码,通常的跳转去处是_c_int00。

在0x3F7FF6处放置跳转指令的方法如下(中):

.sect"codestart"

code_start:

  .ifWD_DISABLE==1

    LBwd_disable   ;Branchtowatchdogdisablecode

  .else

    LB_c_int00    ;BranchtostartofinRTSlibrary

  .endif

  .ifWD_DISABLE==1

  .text

wd_disable:

  SETCOBJMODE    

  EALLOW       

  MOVZDP,#7029h>>6 

  MOV@7029h,#0068h 

  EDIS        

  LB_c_int00    

.endif

.end

MEMERY

 {

    Page0:

      ………..

RAML0:

origin=0x008000,length=0x001000/*on-chipRAMblockL0*/

OTP:

origin=0x3D7800,length=0x000400/*on-chipOTP*/

FLASHD:

origin=0x3F0000,length=0x002000/*on-chipFLASH*/

FLASHC:

origin=0x3F2000,length=0x002000/*on-chipFLASH*/

FLASHA:

origin=0x3F6000,length=0x001F80/*on-chipFLASH*/

CSM_RSVD:

origin=0x3F7F80,length=0x000076

BEGIN:

origin=0x3F7FF6,length=0x000002

   ………..

 }

 SECTIONS

{    ……….

/*Allocateprogramareas:

*/

.cinit:

>FLASHAPAGE=0

.pinit:

>FLASHA,PAGE=0

.text:

>FLASHCPAGE=0

codestart:

>BEGINPAGE=0

ramfuncs:

LOAD=FLASHD,

RUN=RAML0,

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

PAGE=0

csmpasswds:

>CSM_PWLPAGE=0

csm_rsvd:

>CSM_RSVDPAGE=0

/*Allocateuninitalizeddatasections:

*/

.stack:

>RAMM0PAGE=1

.ebss:

>RAML1PAGE=1

.esysmem:

>RAML1PAGE=1

/*ForSDFlashtoprogramthese,theymustbeallocatedtopage0*/

.econst:

>FLASHAPAGE=0

.switch:

>FLASHAPAGE=0

    ……….

 }

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

a.为系统堆栈产生.stack块,并初始化堆栈指针;

b.从.cinit块将初始化数据拷贝到.bss块中相应的变量;

c.对寄存器进行必要的配置,调用main函数开始运行C程序;

没有过多的资料介绍_c_int00这块,无法知道它的具体功能实现以及怎样跳转到主函数的,用户可以对c_int00函数进行修改,但修改后的函数必须完成以上任务。

TMS320F2812flash运行时的启动过程

2812启动过程与2407所用的传统单片机的Vectors启动模式不同,且仿真运行与脱离仿真器运行时差别较大,所以一开始比较难理解。

其启动过程可以分为Flash启动、SPI_Boot、SCI_Boot、H0_Boot、Parallel_Boot等几种模式,而最常用的就是内部Flash运行,也就是将程序编译好后通过JTAG口将程序文件下载到芯片内部falsh中运行,所以此处就这种运行方式的启动过程作一说明。

图12812内部地址图

首先要搞清楚的就是2812的内部地址,如图1所示,

(1)为放中断向量表的RAM,中断向量表在初始化中由用户完成设置;

(2)为放程序的Flash,其中最底的128Bits(8Words)存放Password用;(3)为BootRom,即专门为DSP启动所设立的一块ROM,其中内容为厂家固化。

由图2可以更清晰地看到BootRom的内容,其中0x3FF000~0x3FFC00放置的是IQmath库中用到的函数表,0x3FFC00~0x3FFFC0放置的是Bootloaderfunctions,最底部分放置的是VectorTable。

内部Flash运行的启动过程如图3所示:

图22812内部BootRom地址图

图32812内部Flash启动过程

 

a)程序硬件复位或者软件复位

b)判断mp/mc是否为0,微计算机模式(为1,当为微处理器模式时,2812内部的bootrom被禁止,通过zone7从外部调引导程序启动。

c)为0则从bootrom启动,否则从外部启动(0x3FFC00)

d)到bootrom的0x3FFC00处取出复位向量,跳到boot函数:

2812有一块flash地址从0x3FF000-0x3FFFFF在出厂时ti已经固化好了引导程序iniboot:

Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flashboot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flashboot模式,那么initboot执行完后跳转到0x3F7FF6处)

e)采集io管脚状态,确定启动模式。

2812提供几种启动模式:

SCITXDA(GPIOF4)MDXA(GPIOF12)SPISTEA(GPIOF3)SPICLK(GPIOF2)

1xxxFLASH启动

01xxSPI启动

0011SCI启动

0000PARALLEL启动

f)根据io状态选择boot方式

g)如果是flash,程序退出boot函数,跳转到0x3F7FF6(codestart)

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

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

j)进入main函数(0x3F658E)

注:

1》根据INTERNET上别人的资料,以及针对程序的推敲,总结如上。

2》地址均为我程序实际观测到的值,和网上别人所言有出入。

如:

有言bootrom地址为0x3FFFC0,iniboot(起始地址0x3FFB50)。

 

dsp2812烧写经验总结收藏

1、一般不用你换文件,用原来的就可以.

2、换完FLASH的CMD后,不要烧写,看下.MAP文件,主要是看0X3F7FF8处有没有烧内容.如果有别烧,改,直到这处没有烧入内容.

一般网上的都可以用,只要没有在此出烧入内容

3、如果没有烧入其他的内容,则可以烧了.烧完后,RESETCPU看是不是到0X3FFFC0处,如果不是,看是不是你的MP/MC=0了,并且是不是FLASH启动模式,即所有4个脚都是高(只要第一个脚是高就可以,即1XXX)

4、如果RESETCPU是到0X3FFFC0处,即可以断电,并且拔掉与板子相连的仿真器接口(注意拔电脑上的USB不好使),然后上电,自动运行.

注意:

其中遇到的问题:

烧写\时说初始化RAM,和寻找都不用管_

如果说是NOTANexecuTivefile,则在PROJECT_BULITOPTION_LINK_OUTMODLE_absolutefile

最重要是可以断电,并且拔掉与板子相连的仿真器接口(注意拔电脑上的USB不好使),然后上电,自动运行.我遇到的是这些,我用以上方法解决了,但不知道为什么,所以大家都说说经验,让新手烧走弯路,少LOCK2812

2812从内部flash启动的过程

a)程序硬件复位或者软件复位

b)判断mp/mc是否为0,微计算机模式(为1,当为微处理器模式时,2812内部的bootrom被禁止,通过zone7从外部调引导程序启动。

c)为0则从bootrom启动,否则从外部启动(0x3FFC00)

d)到bootrom的0x3FFC00处取出复位向量,跳到boot函数:

2812有一块flash地址从0x3FF000-0x3FFFFF在出厂时ti已经固化好了引导程序iniboot:

Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flashboot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flashboot模式,那么initboot执行完后跳转到0x3F7FF6处)

e)采集io管脚状态,确定启动模式。

2812提供几种启动模式

SCITXDA(GPIOF4)MDXA(GPIOF12)SPISTEA(GPIOF3)SPICLK(GPIOF2)

1xxxFLASH启动

01xxSPI启动

0011SCI启动

0000PARALLEL启动

f)根据io状态选择boot方式

g)如果是flash,程序退出boot函数,跳转到0x3F7FF6(codestart)

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

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

j)进入main函数(0x3F658E)

2812上电引导过程

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

在2812中引脚XMP/~MC,当该引脚的为高电平时表示是微处理器模式(microprocessor),为低电平时表示微机算计模式(microcomputer),当为微处理器模式时,2812内部的bootrom背禁止,通过zone7从外部调引导程序启动。

2812复位以后,其复位向量是固定的0x3FFFC0,如果为为处理器模式,那么复位后的复位向量指向的外部的地址,即0x3FFFC0是zone7处的地址,若为微机算计模式,那么0x3FFFC0指向的是2812的片内FLASH的地址。

下面就以微机算计模式加以说明其过程。

上电复位后,复位向量是指向片内Flash的0x3FFFC0,2812有一块flash地址从0x3FF000-0x3FFFFF在出厂时已经固化好了引导程序。

在0x3FFFC0处是一条跳转指令,跳到iniboot(地址0x3FFB50)函数处执行iniboot代码,该iniboot代码就是ti在dsp出厂时固化在flash中的。

Iniboot函数判断几个GPIO引脚来判断使用哪一种引导模式,比如flashboot模式,检测SPICLKA,SCITXA,GPIO34的电平,当都为高电平时表明是片内flashboot模式,那么initboot执行完后跳转到0x3F7FF6处,此位置刚好在128位(CSM)密码位置之前,你要在0x3F7FF6处纺织跳转指令,以跳转到你要去的地方,比如是bootloader或应用代码。

在0x3F7FF6处放置跳转指令的方法如下:

.sect"codestart"

code_start:

.ifWD_DISABLE==1

LBwd_disable;Branchtowatchdogdisablecode

.else

LB_c_int00;BranchtostartofinRTSlibrary

.endif

.ifWD_DISABLE==1

.text

wd_disable:

SETCOBJMODE

EALLOW

MOVZDP,#7029h>>6

MOV@7029h,#0068h

EDIS

LB_c_int00

.endif

.end

MEMERY

{

Page0:

………..

Start:

origin=0x3F7FF6,length=0x000002

………..

}

SECTIONS

{

……….

Codestart:

>Startpage0

……….

}

上面的代码执行后跳到_c_int00处执行,_c_int00执行结束时调用用户的主程序main,则后续就是你自己的程序的执行了。

本文来自CSDN博客,转载请标明出处:

新手小记:

F2812烧写问题的解决过程

说在前面的话:

由于是新手,今天解决的这个问题对于高手可能简单得有点可笑,但这个解决过程我想还是值得分享一下的,谢谢进入该帖子的朋友。

---------------------------------------

问题描述:

我用的是DEC2812,

将仿真调试好的程序换了网上提供的标准和.lib文件后,重新编译生成烧写用的.out文件。

但是在烧写过程中提示:

Warning:

ThisprogramcontainsinitializedRAMdata.

ItmayrunsuccessfullyunderCodeComposerStudio

butnotasastandalonesystembecauseofthis.If

yourFlashprogramrequiresinitializeddatainRAM,

youwillneedtowriteFlashcodetoinitializeRAMmemory.

Erase/Program/VerifyOperationsucceeded

----------------------------------------------

解决过程:

1.首先在论坛里找了半天,碰到这个问题的人还真不少,都说是.cmd文件的问题:

“这个问题是cmd中有程序写在了RAM中,看看改到Flash就可以了”。

但是没有具体的方法。

我用的是网上下载的TI标准版,看了半天没发现什么异常,只好查自己的程序,了解自己把一些变量初始化是放在main()之外,作为全局变量处理的。

未必这些就是所谓“写在RAM”的数据因此我把这些变量初始化统统移到main()里面了。

这下更惨,编译都报错了:

declarationmaynotappearafterexecutablestatementinblock

第1步失败!

2.由于在编译期间还有如下报警,但是并不影响.out文件的生成,我就认为是这个报警导致烧写过程中的问题。

>>C:

\\MyProjects\sci_testflash\,line82:

warning:

          (.const)notfound

>>warning:

loadaddressofuninitializedsection.constignored

于是自己写了个很短的串口通信程序,仿真通过后,用编译,还是出现上述报警。

不管了烧下去再说,发现一切正常,板子复位后可独立运行。

看来这个编译报警似乎并不影响程序运行。

3.在google上用initializeRAMmemory搜索,发现有个哥们的blog记载了同样错误,他没搭理,直接复位运行,说是没有问题。

于是大喜,不管那么多,有报警也l烧写进去再说。

结果发现断电复位让程序单独运行,通信根本不通。

未必板子没有跑起来由于手上无示波器,立即在程序里加了定时器中断,反复点亮目标板上的小灯,用来表征程序运行。

再编译,烧写,期间报警照旧。

断电复位后,发现灯在闪烁,大喜,立即建立通信,结果灯不闪了,通信不通,程序显然死掉了。

反复进行了几次,都是一样的现象。

很郁闷,只好又上网到处问,碰到同样烧写报警的人是多,但都说是.cmd文件的问题,又没有具体的方法。

4.看来还是.cmd文件的问题,在坛子里面搜索“.cmd”关键字的帖子,一篇篇翻看。

突然发现一篇有关.switch定义的帖子,突然想起我的通信程序就是switch语句构成。

进去一看发现里面贴出的.cmd文件和我的不同。

多了好几项定义,其中就包括.switch。

另外.const的定义也不一样,直接定义到FLASHA中,不像我的标准版,又是load=FLASHA又是run=RAML0L1,还有一堆_const_run,(.const)什么的。

于是照着帖子修改我的,该加的加,.const的一堆语句都删掉,直接定义到FLASHA。

一编译,居然又报错了:

说是我的里面的_const_run之类没有定义。

晕,刚刚才在.cmd中删掉的,换了个.lib还是同样报错。

晕了。

真是越改麻烦越多了。

5.好了,直奔主题。

最后又重新加载标准的,毕竟这个版本还是能生成.out文件的。

想了半天,可能问题还是.switch定义上。

第2.节中,我编的串口通信小程序的确也用了switch语句,但是数量很少,所以在.cmd中没有.switch的定义,也能正常烧写。

正式的程序switch语句多,里面还有常量。

于是硬着头皮只在标准的中加了.switch定义。

编译,(.const)notfound报警依旧;烧写,居然顺利通过!

于是断电复位,板子独立运行,指示灯闪烁。

现在关键看通信,随着串口调试助手上发送键的按下,我紧张到极点,瞬间,数据接收区显示到接收到数据!

成功!

   首先说下,我接触2812也不久,遇到的问题只知道弄好了,但不知道原因,但我想把我说遇到的,清楚的说下,对新手有帮助。

下面是正题:

先说我遇到的

一:

正常的烧写

不用你换文件,用原来的就可以.

二:

换完FLASH的CMD后,不要烧写,看下.MAP文件,主要是看 0X3F7FF8处有没有烧内容.如果有别烧,改,直到这处没有烧入内容.

   一般网上的都可以用,只要没有在此出烧入内容

三:

如果没有烧入其他的内容,则可以烧了.烧完后,RESETCPU看是不是到0X3FFFC0处,如果不是,看是不是你的MP/MC=0了,并且是不是F

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1