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.

[参考译文] TMS320F28069:CLA:全局数组值被移位

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054374/tms320f28069-cla-global-array-values-get-shifted

器件型号:TMS320F28069

我在 CLA 代码中有一个奇怪的错误。 我按如下方式初始化 CLA 存储器中全局数组的值:

interrupt void InitVars(void) {
    // TODO: Calculate these during initialization from Fourier coefficients specified in MotorControl.h
    float32 BackEmfProfInit[PROF_SIZE] =
        {0.9778235f,  0.9403109f,  0.8992523f,  0.8542375f,  0.8049480f,  0.7511688f,  0.6927969f,  0.6298467f,
         0.5624517f,  0.4908623f,  0.4154409f,  0.3366528f,  0.2550543f,  0.1712778f,  0.0860155f,  0.0000000f,
        -0.0860155f, -0.1712778f, -0.2550543f, -0.3366528f, -0.4154409f, -0.4908623f, -0.5624517f, -0.6298467f,
        -0.6927969f, -0.7511688f, -0.8049480f, -0.8542375f, -0.8992523f, -0.9403109f, -0.9778235f, -1.0122777f,
        -1.0442214f, -1.0742445f, -1.1029587f, -1.1309776f, -1.1588958f, -1.1872691f, -1.2165963f, -1.2473018f,
        -1.2797216f, -1.3140913f, -1.3505375f, -1.3890725f, -1.4295926f, -1.4718800f, -1.5156081f, -1.5603503f,
        -1.6055917f, -1.6507441f, -1.6951625f, -1.7381641f, -1.7790479f, -1.8171158f, -1.8516927f, -1.8821464f,
        -1.9079068f, -1.9284820f, -1.9434737f, -1.9525886f, -1.9556470f, -1.9525886f, -1.9434737f, -1.9284820f,
        -1.9079068f, -1.8821464f, -1.8516927f, -1.8171158f, -1.7790479f, -1.7381641f, -1.6951625f, -1.6507441f,
        -1.6055917f, -1.5603503f, -1.5156081f, -1.4718800f, -1.4295926f, -1.3890725f, -1.3505375f, -1.3140913f,
        -1.2797216f, -1.2473018f, -1.2165963f, -1.1872691f, -1.1588958f, -1.1309776f, -1.1029587f, -1.0742445f,
        -1.0442214f, -1.0122777f, -0.9778235f, -0.9403109f, -0.8992523f, -0.8542375f, -0.8049480f, -0.7511688f,
        -0.6927969f, -0.6298467f, -0.5624517f, -0.4908623f, -0.4154409f, -0.3366528f, -0.2550543f, -0.1712778f,
        -0.0860155f,  0.0000000f,  0.0860155f,  0.1712778f,  0.2550543f,  0.3366528f,  0.4154409f,  0.4908623f,
         0.5624517f,  0.6298467f,  0.6927969f,  0.7511688f,  0.8049480f,  0.8542375f,  0.8992523f,  0.9403109f,
         0.9778235f,  1.0122777f,  1.0442214f,  1.0742445f,  1.1029587f,  1.1309776f,  1.1588958f,  1.1872691f,
         1.2165963f,  1.2473018f,  1.2797216f,  1.3140913f,  1.3505375f,  1.3890725f,  1.4295926f,  1.4718800f,
         1.5156081f,  1.5603503f,  1.6055917f,  1.6507441f,  1.6951625f,  1.7381641f,  1.7790479f,  1.8171158f,
         1.8516927f,  1.8821464f,  1.9079068f,  1.9284820f,  1.9434737f,  1.9525886f,  1.9556470f,  1.9525886f,
         1.9434737f,  1.9284820f,  1.9079068f,  1.8821464f,  1.8516927f,  1.8171158f,  1.7790479f,  1.7381641f,
         1.6951625f,  1.6507441f,  1.6055917f,  1.5603503f,  1.5156081f,  1.4718800f,  1.4295926f,  1.3890725f,
         1.3505375f,  1.3140913f,  1.2797216f,  1.2473018f,  1.2165963f,  1.1872691f,  1.1588958f,  1.1309776f,
         1.1029587f,  1.0742445f,  1.0442214f,  1.0122777f,  0.9778235f};

    for (Uint16 iProf = 0; iProf < PROF_SIZE; iProf++) {
        BackEmfProf[iProf] = IntMotorParameters.PolePairs*IntMotorParameters.MotorTorqueConstant*BackEmfProfInit[iProf]/3.f;
    }
}

BackEmfProfInit 的值会被三个位置移位,即2->5、3->6等 前两个值是垃圾。 我对如何实现这一点感到很损失。 我按如下方式配置 CLA 存储器:

    // Set memory available to CLA.
    Cla1Regs.MMEMCFG.all = 0;
    Cla1Regs.MMEMCFG.bit.PROGE = 1;
    Cla1Regs.MMEMCFG.bit.RAM0E = 1;
    Cla1Regs.MMEMCFG.bit.RAM1E = 1;
    Cla1Regs.MMEMCFG.bit.RAM2E = 1;
    Cla1Regs.MMEMCFG.bit.RAM0CPUE = 0;
    Cla1Regs.MMEMCFG.bit.RAM1CPUE = 0;
    Cla1Regs.MMEMCFG.bit.RAM2CPUE = 0;

在 CMD 链接器文件中:

   CLARAM      : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0/L1/L2 */
...
   .scratchpad      	: > CLARAM,   PAGE = 1
   .bss_cla		    	: > CLARAM,   PAGE = 1
   .const_cla	    	: > CLARAM,   PAGE = 1

我检查了,内存没有被双重预订。 有人有什么想法吗?

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

    好的、在这里有一种习惯来回答我自己的问题、但根据物理块将存储器部分分隔开来确实起了作用。 因此、如下所示:

       CLARAM2     : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 */
       CLARAM0     : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */
       CLARAM1     : origin = 0x008C00, length = 0x000400     /* on-chip RAM block L2 */
    ...
       .scratchpad      	: > CLARAM0,   PAGE = 1
       .bss_cla		    	: > CLARAM2,   PAGE = 1
       .const_cla	    	: > CLARAM1,   PAGE = 1
    

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

    感谢您的更新。