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.

[参考译文] TMS320F28069M:在 F2806x 系列的这个 MCU 上执行 CLA FFT 时出现问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1347206/tms320f28069m-problem-implementing-cla-fft-on-this-mcu-of-series-f2806x

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

您好!
我正在尝试在 MCU F28069M 上实现 CLA_FFT、但无法执行。
首先、该 MCU 可以运行1024点 FFT。
尝试执行以下函数:

__interrupt void
Cla1Task1 (void)
{
    __mdebugstop();
 CLA_CFFT_run1024Pt();
 __mdebugstop();
 CLA_CFFT_unpack512Pt();
}


这里还有链接器命令文件、我已经设计用于通过 CLA 执行 FFT 和 FIR
_Cla1Prog_Start = _Cla1funcsRunStart;
-heap 0x400
-stack 0x400

// Define a size for the CLA scratchpad area that will be used
// by the CLA compiler for local symbols and temps
// Also force references to the special symbols that mark the
// scratchpad are. 
// CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start

MEMORY
{
PAGE 0 :
   /* BEGIN is used for the "boot to SARAM" bootloader mode   */
   BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
   BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
   RAMM0M1     : origin = 0x000050, length = 0x000750
   RAML5       : origin = 0x00E000, length = 0x002000
   FLASHH      : origin = 0x3D8000, length = 0x004000     /* on-chip FLASH */
   FLASHG      : origin = 0x3DC000, length = 0x004000     /* on-chip FLASH */
   FLASHF      : origin = 0x3E0000, length = 0x004000     /* on-chip FLASH */
   FLASHE      : origin = 0x3E4000, length = 0x004000     /* on-chip FLASH */
   FLASHD      : origin = 0x3E8000, length = 0x004000     /* on-chip FLASH */
   FLASHC      : origin = 0x3EC000, length = 0x004000     /* on-chip FLASH */
   FLASHA      : origin = 0x3F4000, length = 0x003F80     /* on-chip FLASH */
   ROM         : origin = 0x3FF3B0, length = 0x000C10     /* Boot ROM */
   RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
   VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */

  /* RAML0_L2       : origin = 0x008000, length = 0x001000 */	 
   RAML3		    : origin = 0x009000, length = 0x001000
   /* FPU Tables in Boot ROM */
   FPUTABLES        : origin = 0x3FD590, length = 0x0006A0	

    /* IQ Math Tables in Boot ROM */
   IQTABLES   		: origin = 0x3FDF00, length = 0x000B50 
   IQTABLES2  		: origin = 0x3FEA50, length = 0x00008C 
   IQTABLES3  		: origin = 0x3FEADC, length = 0x0000AA	

PAGE 1 :

   CLARAM0              : origin = 0x008800, length = 0x000400
   CLARAM1              : origin = 0x008C00, length = 0x000400
   CLARAM2				: origin = 0x008000, length = 0x000800
   /* on-chip RAM block L4-L8 */
   RAML4            	: origin = 0x00A000, length = 0x04000
   RAML5_2				: origin = 0x010000, length = 0x001000
   RAML6       			: origin = 0x011000, length = 0x001000
   RAML7       			: origin = 0x012000, length = 0x001000
   RAML8       			: origin = 0x013000, length = 0x001000
   USB_RAM     			: origin = 0x040000, length = 0x000800     /* USB RAM		  */
   FLASHB      			: origin = 0x3F0000, length = 0x004000     /* on-chip FLASH */
   CLA1_MSGRAMLOW       : origin = 0x001480, length = 0x000080
   CLA1_MSGRAMHIGH      : origin = 0x001500, length = 0x000080
}


SECTIONS
{

/* Setup for "boot to SARAM" mode:
      The codestart section (found in DSP28_CodeStartBranch.asm)
      re-directs execution to the start of user code.  */

	 ramfuncs            : LOAD = FLASHD,
                       RUN = RAML5,
                     LOAD_START(_RamfuncsLoadStart),
                   LOAD_END(_RamfuncsLoadEnd),
                 RUN_START(_RamfuncsRunStart),
			 LOAD_SIZE(_RamfuncsLoadSize),
           PAGE = 0

   .cinit              : > FLASHA,     PAGE = 0
   .pinit              : > FLASHA,     PAGE = 0
   .text               : > FLASHA,     PAGE = 0
   codestart           : > BEGIN,      PAGE = 0
    /* Allocate uninitialized data sections: */
   .stack              : > RAMM0M1,      PAGE = 0
   .ebss               : > RAML4,      PAGE = 1
   .esysmem            : > RAML4,     PAGE = 1
   .cio                : > RAML4,      PAGE = 1

   /* Initialized sections to go in Flash */
   /* For SDFlash to program these, they must be allocated to page 0 */
   .econst             : > FLASHA,     PAGE = 0
   .switch             : > FLASHA,     PAGE = 0

   .scratchpad      : > CLARAM0,   PAGE = 1
   .bss_cla		    : > CLARAM0,   PAGE = 1
   .const_cla	    : > CLARAM0,   PAGE = 1 
   
   IQmath           : > FLASHB,	   PAGE = 1
   IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD
   //   CLA1fftTables    : > RAML3,                 PAGE = 1
   
   /* Allocate FPU math areas: */
   FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD
   RFFTdata1	           : > RAML6,      PAGE = 1
   RFFTdata2	           : > RAML7,      PAGE = 1
   RFFTdata3	           : > RAML8,      PAGE = 1
   RFFTdata4	           : > RAML5_2,      PAGE = 1



   Cla1Prog        : > RAML3,
                     LOAD_START(_Cla1funcsLoadStart),
                     LOAD_END(_Cla1funcsLoadEnd),
                     LOAD_SIZE(_Cla1funcsLoadSize),
                     RUN_START(_Cla1funcsRunStart),
                     PAGE = 0
   
   Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW,   PAGE = 1
   CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH,  PAGE = 1
   Cla1DataRam0		: > CLARAM0,		  PAGE = 1
   Cla1DataRam1		: > CLARAM1,		  PAGE = 1
   Cla1DataRam2		: > CLARAM2,		  PAGE = 1

   CLA1mathTables	: > CLARAM1,
                      LOAD_START(_Cla1mathTablesLoadStart),
                      LOAD_END(_Cla1mathTablesLoadEnd), 
                      LOAD_SIZE(_Cla1mathTablesLoadSize),
                      RUN_START(_Cla1mathTablesRunStart),
                      PAGE = 1

   CLAscratch       : 
                     { *.obj(CLAscratch)
                     . += CLA_SCRATCHPAD_SIZE;
                     *.obj(CLAscratch_end) } > CLARAM0,
					 PAGE = 1
   .reset              : > RESET,      PAGE = 0, TYPE = DSECT
   vectors             : > VECTORS,    PAGE = 0, TYPE = DSECT


我找不到任何在该 MCU 上实施 FFT 的示例代码。
请引导我是否可以实现。
另外、请帮助确定上述故障以及如何处理。

我使用 ADXL359加速度传感器测量发动机的振动。
由于我每1毫秒对数据进行一次采样、因此我使用 FFT 1024点来实现更高的精度。
但它需要花费更多的计算时间

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

    尊敬的 Akshay:

    由于这是一个较旧的器件、因此它没有像一些较新的器件(例如 F2837xD 等)那样将 CLA FFT 查找表编程到 ROM 中。  您必须将 FFT 表加载到闪存中、然后将它们复制到 RAM 中。 另请注意、当将其复制到 RAM 的一部分时、它需要是可由 F2806x 上的 CLA 访问的 RAM 的一部分。 这将包括 LSRAM1-LSRAM3中的地址。

    我将介绍在将库示例移植到 F2806x 并在接下来的1-2天内回来与您联系需要做什么。 现在、您可以尝试浏览下面的主题、看看此说明是否有帮助? 该主题是指使用 CLA 数学表中的 ASIN 和 acos 数学表、但 FFT 函数应该是类似的方法。

    (+) CCS/TMS320F28069:在 CLA 和 FPU 中使用数学表- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    另一种更简单/更快的选择也是切换到更新的器件、该器件将 CLA 数学表编程到 ROM 中。 从 F2837xD 进行移植要简单得多、只需更改 projectspec 文件中的几行内容。 请告诉我、这对您来说是否可行。

    此致、

    德拉尼

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

    尊敬的 Delaney:
    感谢您的支持。
    我将尝试实施早期的解决方案。 我尝试实现1024点 FFT、但它没有执行、并导致 MCU 重新启动。
    这可能是共享内存区域不足的原因。

    由于该产品已在开发中且处于最后阶段、因此也不再能够移植到另一个 MCU 选项。 优化产品。
    希望获得该库示例移植解决方案。

    该 MCU 还能支持多少点 CLA FFT?

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

    尊敬的 Akshay:

    虽然我无法提供特定于此器件的 FFT 示例代码(因为这超出了我们在 E2E 上支持的范围)、但我建议执行以下操作:

    1. 首先要导入 F2806x CLA 示例、以便为正确的器件设置所有 CCS 设置和路径、并使用其中一个 CLA 链接器 cmd 文件。
    2. 更改/导入应用所需的源代码文件。
    3. 将 cla_FFT_tables.asm 文件导入 CCS 工程。 此文件显示 数据的表示形式、通常硬编码到较新器件(F2837xD 及更高版本)的 ROM FFT 表中。
      1. 此文件可在以下路径中找到:[C2000ware install]\libraries\math\CLAmath\c28\source。
      2. 在本例中、我认为您还需要从此文件夹导入 CLA_CFFT_1024.asm 文件、因为该文件定义了CLA_CFFT_run1024Pt();函数和 CLA_CFFT_UNPACK_512-asm、因为它定义了 CLA_CFFT_unpack512Pt();您要在.cla 代码中使用的函数。
    4. 将以下行添加到链接器 cmd 文件中、该文件将指示链接器在何处放置 CLA1fftTables。 下图是在未使用硬编码 ROM 表时(如果预处理器指令禁用了此功能)、用于 F2837xD 库示例的表格所在位置。 确保将"运行"存储器更改为使用 CLA 在 F2806x 上可以访问的 LSRAM 存储器。

    需要确认的另一点是 CLA 程序代码和 FFT 表实际上将适合 LSRAM1-3。 如果 FFT 表与您的 CLA 应用代码相结合太大、无法放入 CPU 为 CLA 分配的内存中、那么它不会正确复制所有内容、这会导致出现问题。

    这些应该是 所需的主要配置;但是、我还建议 更深入地查看 CLA_CFFT_1024库示例、以查看是否需要进行任何其他修改。  这些文件具有详细注释、解释了所使用的算法。

    此致、

    德拉尼