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.

[参考译文] CCS/TMS320F280049:CCS/TMS320F280049:从闪存运行

Guru**** 2595805 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/673957/ccs-tms320f280049-ccs-tms320f280049-running-from-flash

器件型号:TMS320F280049
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好、

我有 一个用于 TMS320F280049 微控制器的定制板。 我将示例项目与支持新微控制器的 C200ware 结合使用。 头文件看起来是与开发板或其他器件一起使用的。 这是我发布的有关我的设计 https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/673208/2478927#2478927的另一个主题。

我在从闪存运行代码时遇到困难、但是、它从 RAM 运行正常。 我已将变量".TI.ramfunc"更改为"ramfuncs"、以匹配所有其他微控制器系列。  

我已将我的代码包含在此帖子中。

/包含的文件
//
#include "F28x_Project.h"


//
//定义
//
#define DEVICE_GPIO_PIN_LED1 12.
uint32_t NewVar=10;

//
//主函
//
void main (void)

//
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、&RamfuncsLoadEnd -&RamfuncsLoadStart);


//初始化设备时钟和外设
//

InitSysCtrl();  此函数在内部更改为使用内部振荡器" InitSysPll (INT_OSC2、19、1、1);"

//
//初始化 GPIO 并将 GPIO 引脚配置为推挽输出
//
InitGpio();

GPIO_SetupPinMux (DEVICE_GPIO_PIN_LED1、GPIO_MUX_CPU1、0);

GPIO_SetupPinOptions (DEVICE_GPIO_PIN_LED1、GPIO_OUTPUT、GPIO_PushPull);

//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
InitPieVectTable();

NewVar = 12;

//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

NewVar = 13;


//
//永久循环
//
for (;;)

//
//打开 LED
//
GPIO_WritePin (DEVICE_GPIO_PIN_LED1、0);

//
//延迟一位。
//
DELAY_US (1000000);
//
//关闭 LED
//
GPIO_WritePin (DEVICE_GPIO_PIN_LED1、1);
NewVar = 15;

//
//延迟一位。
//
DELAY_US (1000000);

//
//文件结束
//

空 InitSysCtrl (空)

//
//禁用看门狗
//
DisableDog ();

#ifdef _flash
//
//将时间关键代码和闪存设置代码复制到 RAM
//这包括以下函数:InitFlash();
// RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
//memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、&RamfuncsLoadEnd -&RamfuncsLoadStart);
#endif

//
// PLLSYSCLK =(XTAL_OSC)*(IMULT + FULT)/(PLLSYSCLKDIV)
//
//InitSysPll (XTAL_OSC、IMULT_10、FULT_0、PLLCLK_by_2);

//InitSysPll (INT_OSC2、IMULT_19、FULT_0pt25、PLLCLK_by_2);
InitSysPll (INT_OSC2、19、1、1);

//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
InitFlash();

//
//打开所有外设
//
InitPeripheralClocks();

//
// InitFlash -此函数初始化闪存控制寄存器
//注意
//必须在 RAM 中执行此函数。 执行它
//超出 OTP/Flash 将产生不可预测的结果
//
#ifdef __cplusplus
#pragma CODE_SECTION ("ramfuncs");
#endif
空 InitFlash (空)

EALLOW;

//
//重置组和泵处于睡眠状态
//闪存访问将自动为组和泵加电
//闪存访问后,组和泵进入低功耗模式(可配置
//在 FBFALBACK/FPAC1寄存器中)-如果没有进一步的闪存访问
//为闪存组和泵加电、这也设置的回退模式
//闪存和泵激活
//
Flash0CtrlRegs.FPAC1.bit.PMPPWR = 0x1;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR0 = 0x3;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR1 = 0x3;

//
//在更改等待状态之前禁用缓存和预取机制
//
Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 0;
Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 0;

//
//根据频率设置等待状态
//注意
//闪存操作所需的最小等待状态
//在给定的 CPU 速率下,必须由 TI 进行表征。
//有关最新信息,请参阅数据表。
//
#if CPU_FRQ_100MHz
if ((ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0x0)||
(ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL == 0x2)||
(ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL == 0x3))

Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x5;

其他

Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x4;

#endif

//
//启用缓存和预取机制以提高性能
/从闪存执行的代码。
//
Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 1;
Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 1;

//
//复位时启用 ECC。 如果应用软件禁用了它
//以及应用程序是否再次希望启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;

EDIS;

//
//强制流水线清空以确保写入
//返回前发生最后配置的寄存器。
//
_asm (" RPT #7 || NOP");

//
// FlashOff -此函数关闭闪存
//注意
//必须在 RAM 中执行此函数。 执行它
//超出 OTP/Flash 将产生不可预测的结果。
//注意:闪存泵和闪存组断电后的闪存访问将会进行
//唤醒泵和组
//
#ifdef __cplusplus
#pragma CODE_SECTION ("ramfuncs");
#endif
空 FlashOff (空)

EALLOW;

//
//将备用电源模式配置为睡眠
//
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR0 = 0;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR1 = 0;

//
//将备用电源模式配置为睡眠
//
Flash0CtrlRegs.FPAC1.bit.PMPPWR = 0;

EDIS;

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

    您在使用闪存配置时遇到了哪些困难? 它是为项目中的闪存设置编译配置、在闪存配置中进行调试还是另一个问题?

    如果您尚未看到".TI.ramfunc"和"ramfuncs"之间的区别、请访问以下资源:
    processors.wiki.ti.com/.../Placing_functions_in_RAM

    您提到您正在使用 C2000Ware 示例工程、因此您可能会注意到它们提供了闪存构建配置。 这是一个很好的参考、用于说明如何在您自己的项目中设置闪存构建配置。

    还可以在 C2000Ware 中找到适用于闪存配置的链接器命令文件:
    C:\ti\c2000Ware_1_00_03_00\device_support\f28004x\con\cmd\28004x_general_flash_lnk.cmd

    此致、
    Elizabeth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Elizabeth、
    感谢您的回答。 我不熟悉".TI.ramfunc"和"ramfuncs"语句之间的差异。 不过,我不能确定问题的原因。 我已经尝试将闪存构建配置与示例项目一起使用、它会正常加载代码。 但是、我关闭电源并重新打开电源、我希望代码正常运行、正如我希望从闪存引导的那样(如果这是错误的、我对微控制器编程非常陌生)。

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

    是的、在闪存配置中、代码应在下电上电后继续运行。 您提到过您将定制板与 F280049搭配使用。 如果您可以访问实验套件(即 www.ti.com/.../TMDXDOCK280049M)、您能否查看是否遇到了相同的问题? 如果您没有看到实验套件和 C2000Ware 示例的问题、则这可能与您的电路板设计有关。

    此致、
    Elizabeth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Elizabeth、
    问题仍然存在。 我没有控制卡/开发套件可与之进行比较。 遗憾的是、所有示例代码都是专门为开发套件制作的、与其他 F28xx 系列不同。
    穆罕默德
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mohamed、

    C2000Ware 中适用于任何给定器件的示例项目主要是使用实验套件开发和测试的、因为这是 TI 提供的硬件。 但是、该软件仍是为了展示外设的功能而开发的、以便客户可以为其应用程序构建模块以适合其设计的硬件。 您似乎需要对电路板进行更多调试。

    此致、
    Elizabeth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Elizabeth!
    感谢您的耐心等待。 开发套件似乎包含用于选择引导模式的开关。
    我已更改 F28004x_DCSM_z1otp.asm 文件
    在.sect "b0_DCSM_OTP_Z1_linkpointer "中、新值为.long 0x5AFFFFF
    在.sect "b0_DCSM_OTP_Z1_bootctrl"中、新值为.long 0xFFFFFF03

    我使用了 DCSM 链接器、现在它是固定的! 感谢集思广益:)

    穆罕默德