TMS320F28335学习笔记-启动过程

时间:2022-04-27 18:56:20 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。


TMS320F28335学习笔记-启动过程

分类:

DSP TMS320F28335项目研发笔记(11

版权声明:本文为博主原创文章,未经博主允许不得转载。 1.DSP reset后运行的起始地址是多少? 0x3FFFC0

2.仿真器烧写程序的步骤是?

根据cmd文件把程序烧到指定位置,然后执行。 3.DSPFlash启动过程是什么?

首先硬件配置GPIO84~87上拉为1,即处于Flash启动过程。当DSP复位后,会从复位向量0x3FFFC0处取得复位向量,并跳转到InitBoot处开始执行,InitBoot会读GPIO84~87的值发现全为1判断为Flash启动方式。然后会跳到0x33FFF6处执行。在CCS5.2工程cmd文件中有如下代码: MEMORY { PAGE 0 :

BEGIN : origin = 0x33FFF6, length = 0x000002 /* Boot to M0 will go here */ ... }

SECTIONS {...

codestart : > BEGIN PAGE = 0 ...}


即表示把codestart段放到0x33FFF6位置处,文件“DSP2833x_CodeStartBranch.asm”codestart段的定义,实际上codestart段只是包含了一个跳转指令,是程序跳转到_c_int00处,_c_int00boot.asm in RTS library中有定义,_c_int00的代码最终会调用cmain函数,之后就是main函数的执行。 4.F28335如何烧写代码到flash中并运行? 首先使用添加

C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_common\cmd\F28335.cmd此文件即为配置代码到flash中的TI官方配置文件。 然后参考

C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_examples_ccsv4\flash_f28335。添加以下代码:

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将一些在内存中运行的代码从flash复制到内存中,然后程序才能正常运行。

5.写好的代码再ram中能正常运行但是烧写到flash中后,函数DSP28x_usDelay()不能正常运行为什么?

因为在DSP2833x_usDelay.asm中有.sect "ramfuncs"即把该函数定义在段"ramfuncs"中,而此段需要在内存中运行,故需要使用函数

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);ramfuncs段复制到内存中然后运行。只算以这样设计是因为函数DSP28x_usDelay()精准运行对运行速度有要求故必须放在段"ramfuncs"中。参考:http://blog.sina.com.cn/s/blog_9388c4140100vs0r.html 6.cmd中以下代码如何解释? ramfuncs : LOAD = FLASHD, RUN = RAML0,

LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0


1行表示该段的装载在PAGA0FLASHD 2行表示该段的运行地址在PAGE0RAML0

LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart该变量指向段ramfuncs的装载地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档);

LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪指令,请见CCS的帮助文档);

LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档);

从第12行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是不同的,本程序中装载在Flash的块FLASHD中,而在SARAM L0中运行,这只是目标,实际运行时DSP并不会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。

C函数中,为了使用变量RamfuncsLoadStartRamfuncsLoadEndRamfuncsRunStart必须先声明,本工程在文件DSP2833x_GlobalPrototypes.h中做了如下声明: extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart;

然后就可以使用了。在Main.c中,使用MemCopy()函数将段ramfuncs中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStartRamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用

DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在MemCopy.c中,DSP2833x_GlobalPrototypes.h声明。 7.如何将一个函数放到ram中运行?

参考TI公司头文件中自带InitFlash函数,这些函数会以CODE_SECTION申明。如:#pragma CODE_SECTION(InitFlash, "ramfuncs");




本文来源:https://www.wddqw.com/doc/d153d2d2bed5b9f3f80f1c1e.html