This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] F28M35H52C:在C28x中从RAM加载并运行程序

Guru**** 2391415 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/658599/f28m35h52c-load-and-run-program-from-ram-in-c28x

部件号:F28M35H52C

我尝试从RAM加载和运行程序,因为使用闪存需要很长时间。 我从C28x的盲板项目开始,可以让它发挥作用。 然后我决定尝试从RAM中加载并运行它,为此,我更改了项目的属性。 我修改了配置并设置了RAM [ Active ],这更改了用于链接的.cmd文件。 但是,它不允许我开始执行程序。 实际上,当我单击调试按钮时,Code Composer (代码编辑器)似乎会加载程序,但当它完成时,设备已经在运行(我不能像在其他情况下那样自行开始执行),当我暂停执行时,将出现一个如图所示的窗口:

 我认为启动模式有问题,但我看到了交换机的可能配置,其中任何一种配置都允许我从RAM启动De C28x。

有人能帮帮我吗? 提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    连接仿真器后,设备将在仿真引导中引导,因此请参阅设备TRM的仿真引导部分,并进行适当的设置以从RAM引导C28x。

    此致,

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。

    我不知道什么是仿真引导。 请您更深入地解释一下吗?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对不起,我的错了。 在此特定设备上,不支持引导仿真。 在这种情况下,您正在M3上加载什么代码? TRM有一节“6.6 .5.1 C-Boot ROM Boot-to-RAM Entry Point”,其中提供了一些有关信息。 您可以尝试的其他方法是,不要单击调试按钮,而是启动目标配置文件,然后连接到两个Core,并手动将代码加载到C28x上,然后查看其是否按预期工作。

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不能让它发挥作用。 我正在M3上加载的代码如下:

    //###################################################################
    //文件:LAB1_M3.c
    //##############################################################################################################################################################################################################
    //
    
    #include <string.h>
    
    #include "inc/HW_ints.h"
    #include "inc/HW_memmap.h"
    #include "inc/HW_NVIC.h"
    #include "inc/HW_gPI.h"
    #include "inc/HW_types.h"
    #include "gPIR****************/unsigned rib.lib/runsigned rwsctl.h"#include
    "lib/undlib.ran/undlib.rundlib/unsigned
    
    
    ran"#indl.rwsclib.rfundlib.rw.rw.rw.rw.rl.rw.rw.rw.rw.rw.l/undlib.rw.l/undlib.rw.l/undlib.rw.l"#include "l/unsigned rm.l"#include.l/rmwx"r
    
    
    
    
    
    
    
    
    //闪烁LED LD3
    //*************************************************************************************************
    void main (void)
    {
    挥发性无符号长ulLoop;
    
    //禁用保护
    HWREG (sysctl_MWRALLOW)= 0xA5A5A5A5;
    
    //设置PLL,M3运行频率为75 MHz,C28运行频率为150 MHz
    SysCltlClockConfigSet(sysctl_use_PLL |(sysctl_SPLLIMULT_M & 0xF)|
    sysctl_SYSDIV_1 | sysctl_M3SSDIV_2 |
    sysctl_XCLKDIV_4);
    
    //将时间关键代码和Flash设置代码复制到RAM
    //这包括以下函数:InitFlash();
    //
    链接器创建RamfuncsLoadStart,RamfuncsLoadSize和RamfuncsRunStart //符号。 请参阅设备.cmd文件。
    memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
    
    //调用闪存初始化以设置闪存等待//
    此功能必须驻留在RAM中
    FlashInit();
    
    //发送boot命令以允许C28应用程序开始执行
    IPCMtoCBootControlSystem (CBROM_MTOC_bootmode_boot_from_RAM);
    
    //为GPIOC启用时钟电源
    SysCtlPeripheralEnable(sysctl_Periph_gpicoc);
    
    //为端口C引脚6提供C28控制
    GPIOPinConfigureCoreSelect (GPIO _PORTC_BASE,0x40,GPIO PIN _C_CORE _SELECT);
    
    //禁用看门狗模块的时钟电源
    SysCtlPeripheralDisable(sysctl_Periph_WDOG1);
    SysCtlPeripheralDisable(sysctl_Periph_WDOG0);
    
    //启用处理器中断。
    IntMasterEnable();
    
    //设置LED LD3的引脚
    GPIOPinTypeGPIOOutput (GPIO _PORTC_BASE,GPIO PIN_7);
    GPIOPinWrite (GPIO _PORTC_BASE,GPIO PIN_7,~0);
    
    同时(1)
    {
    GPIOPinWrite (GPIO_PORTC_BASE,GPIO PIN_7,0);	// LD3开
    对于(ulLoop = 0;ulLoop < 275万;ulLoop ++);	//延迟
    GPIOPinWrite (GPIO _PORTC_BASE,GPIO PIN_7,~0);	// LD3关闭
    for (ulLoop = 0;ulLoop < 275万;ulLoop ++);	//延迟
    }
    } 

    我从F28M35x车间获取了此代码。 我唯一改变的是下一行:

    IPCMtoCBootControlSystem (CBROM_MTOC_bootmode_boot_from_RAM); 

    最初是:

    IPCMtoCBootControlSystem (CBROM_MTOC_bootmode_boot_from_flash); 

    我遵循了本文档中提供的指南,即F28M35x Whorshop:e2e.ti.com/.../F28M35x_5F00_Workshop_5F00_3_2D00_0.pdf

    
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现我必须强制一些目标代码位于.cmd文件的M0 RAM中,以使程序从RAM加载和执行工作:

    ...
    启动 :> RAMM0
    { F28M35x_sysctrl.obj (.text:_InitPeripheralClocks)
    --library=rts2800_fpu32.lib<boot28.obj>(.text)
    F28M35x_sysctrl.obj (.text:_InitSysCtrl)
    Blinky_c28.obj (.text:_main)
    --library=rts2800_fpu32.lib<exit.obj>(.text)
    F28M35x_GPIO.obj (.text:_InitGpio)
    F28M35x_PIECTRL.OBJ (.TEXT:_InitPieCtrl)
    --library=rts2800_fpu32.lib<cpy_tbl.obj>(.text)
    F28M35x_PieVect.obj (.text:_InitPieVectorTable)
    --library=rts2800_fpu32.lib<memcpy.obj>(.text)
    --library=rts2800_fpu32.lib<args_main.obj>(.text)
    F28M35x_DefaultIsr.obj (.text:_empty_isr)
    F28M35x_DefaultIsr.obj (.text:_ADCINT1_ISR)
    F28M35x_DefaultIsr.obj (.text:_ADCINT2_ISR)
    F28M35x_DefaultIsr.obj (.text:_ADCINT3_ISR)
    --library=rts2800_fpu32.lib<pre_init.obj>(.text)
    --library=rts2800_fpu32.lib<startup.obj>(.text)
    }
    ...

    问题是其中一个是包含main函数的linky_c28.obj (.text:_main),当我在其中添加一些代码时,它不适合M0 RAM。 我试图将blinky_c28.obj (.text:_main)放入RAM内存的另一部分,但当我这样做时,程序甚至没有启动。 为了避免这种情况,我将添加到main函数的所有额外代码移到了从main调用的另一个函数中,并且允许Blinky_c28.obj (.text:_main)位于M0 RAM中。 但是,当我这样做的时候,该方案没有发挥作用。 看起来主函数和它调用的所有函数都必须输入到M0 RAM中。
    因此,我得出的结论是,必须将某些目标代码放入M0 RAM中。 这是否可行? 这意味着您只能从main函数执行几个指令...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,对于RAM引导,入口点是0x0,因此部件应该在M0中,但从那里代码应该能够分支到main()函数,该函数可以在其他RAM中。 在我们的代码示例中,作为入口点的code_start函数被放置在codegstart部分,映射在M0 (0x0)中。 从code_start函数执行分支到放在.text部分(而不是M0)中的其他代码。
    请检查“device_support\f28m35x\v208\F28M35x_common\source”文件夹中的F28M35x_CodeStartBranch.asm文件。

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    完美 考虑到您所说的这一点,我意识到当我将部分放入共享RAM时,实际上会出现问题(这是否有意义?)。 我使用该RAM是因为我添加的额外代码不适合其他存储器(RAM L0到RAM L1是不够的)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,这将是任何问题。 默认情况下,Shared的主拥有权是与M3的主拥有权。 在M3代码中,您需要在引导C28x之前将共享RAM的所有权更改为C28x。 您还具有L2和L3 RAM (LX RAM的总32 KB),可用于代码。 尝试一下,如果这还不够,则必须使用共享RAM。

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,我会尝试将共享RAM的所有权授予C28x,因为LX RAM是不够的(我猜它们是32 KB)。 我在控制套件中找到了一个示例,希望我不会遇到这方面的问题。
    但是,有一个问题需要我注意,那就是即使C28x没有共享RAM的所有权,共享RAM也会写入代码。 我的意思是,在.cmd中,我在共享RAM中放置了一些代码(.text),它就在那里(我在Disassembly (分解)窗口中看到),因此... C28x是否不能读取?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    仅对非主服务器阻止写入和执行。 读取永远不会被阻止。 同样,从调试器进行的写入访问也不会被阻止,因此即使主拥有权不是C28x,代码也会被加载和显示。

    以下来自TRM的快照-

    此致,

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 它终于奏效了。 关键是要了解M3如何影响C28x对共享RAM的访问,以及“仅禁止非主服务器的写入和执行”...
    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很好。 很高兴知道它现在正在工作。