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