如何将程序烧写至FLASH
第 1 行表示该段的装载在 PAGA0 的 FLASHD 中 第 2 行表示该段的运行地址在 PAGE0 的 RAML0 中 LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量 RamfuncsLoadStart,该变量指向段 ramfuncs 的装载地址的首地址(LOAD_ START 为编译伪指令,请见 CCS 的帮助文档); LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量 RamfuncsLoadEnd,该变量指向段 ramfuncs 的 装载地址的末地址(LOAD_ END 为编译伪指令,请见 CCS 的帮助文档); LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量 RamfuncsRunStart,该变量指向段 ramfuncs 的运行地址的首地址(LOAD_ START 为编译伪指令,请见 CCS 的帮助文档); 从第 1 和 2 行可以看出,段 ramfuncs 中的函数 DSP28x_usDelay()的装载地址和运行地址是不同的,本程 序中装载在 Flash 的块 FLASHD 中,而在 SARAM L0 中运行,这只是目标,实际运行时 DSP 并不会自动将 Flash 中的代码拷贝到 SARAM 中,因此需要手动添加代码来完成。 在 C 函数中,为了使用变量 RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart,必须先声明, 本工程在文件 DSP2833x_GlobalPrototypes.h 中做了如下声明: extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart; 然后就可以使用了。在 Main.c 中,使用 MemCopy()函数将段 ramfuncs 中的函数 DSP28x_usDelay()的代码 从装载地址 RamfuncsLoadStart—RamfuncsLoadEnd 拷贝到 RamfuncsRunStart 开始的 SARAM 空间中。之后 在程序运行时,只要调用 DSP28x_usDelay()函数,都会自动地指向 SARAM 中相应的函数入口地址,这一点 是自动完成的。MemCopy()函数原型在 MemCopy.c 中,DSP2833x_GlobalPrototypes.h 声明。
7.如何将一个函数放到 ram 中运行?
参考 TI 公司头文件中自带 InitFlash 函数,这些函数会以 C ODE_SEC TION 申明。如:#pragma C ODE_SEC TION(InitFlash, "ramfuncs");
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将一些在内存中运行的代码从 flash 复制到内存中,然后程序才能正常运行。
5.写好的代码再 ram 中能正常运行但是烧写到 flash 中后,函数 DSP28x_usDelay()不能正常运行为什么? 因为在 DSP2833x_usDelay.asm 中有.sect "ramfuncs",即把该函数定义在段"ramfuncs"中, 而此段需要 在内存中运行,故需要使用函数
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);将 ramfuncs 段复制到内存中然 后运行。只算以这样设计是因为函数 DSP28x_usDelay()精准运行对运行速度有要求故必须放在段 ramfuncs"中.
6.cmd 中以下代码如何解释? ramfuncs : LOAD = FLASHD, RUN = RAML0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0
F28335 如何烧写代码到 flash 中并运行
1.DSP reset 后运行的起始地址是多少?
0x3FFFC0
2 . 仿 真器烧写程序的 步骤是?
根据 cmd 文件把程序烧到指定位置,然后执行。 3.DSP 的 Flash 启动过程是什么?
首先硬件配置 GPIO84~87 上拉为 1,即处于 Flash 启动过程。当 DSP 复位后,会从复位向量 0x3FFFC0 处取 得复位向量,并跳转到 InitBoot 处开始执行,InitBoot 会读 GPIO84~87 的值发现全为 1 判断为 Flash 启 动方式。然后会跳到 0x33FFF6 处执行。在 CCS5.2 工程的 cmd 文件中有如下代码:
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。 添加以下代码:
MEMORY { PAGE 0 :
BEGIN here
: origin = 0x33FFF6, length = 0x000002 */
/* Boot to M0 will go
... }ቤተ መጻሕፍቲ ባይዱ
SECTIONS {...
codestart
: > BEGIN
PAGE = 0
...}
即表示把 codestart 段放到 0x33FFF6 位置处,文件“DSP2833x_CodeStartBranch.asm”中有 codestart 段 的定义,实际上 codestart 段只是包含了一个跳转指令,是程序跳转到_c_int00 处,_c_int00 在 boot.asm in RTS library 中有定义,_c_int00 的代码最终会调用 c 的 main 函数,之后就是 main 函数的执行。