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.
大家好、我有不使用 CLA 进行 FFT 计算的工作代码。 我想将 FFT 计算移动到 CLA、因为我使用以下链接器文件:
//##########################################################################出################################出
//
//文件:f2806x_cla_c_lnk.cmd
//
//标题:运行 CLA 数学库示例的链接器命令文件
//在 f2806x 平台上
//
//该文件包括当前位置的所有 RAM 和闪存块。
// f2806x 并取决于活动的编译配置
//(RAM 或闪存)相应的部分将被加载
//加载到 RAM 或闪存块中
//
//########################################################################出################################出
//
//
//$Copyright:版权所有(C) 2023 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//########################################################################出################################出
//
//在项目属性中将 CLA_C 定义为1
// Project Properties -> C2000 Linker -> Advanced Options -> Command File
//预处理->-定义
//
//--define=CLA_C=1
//
// CLA_MATH_TABLE_IN_ROM 根据在项目属性中定义
//已选择构建配置
// Project Properties -> C2000 Linker -> Advanced Options -> Command File
//预处理->-定义
//将该变量设置为1以使用 CLA 数据 ROM 中的 CLA 数学表
//如果设置为0,请确保有正确的 CLA 数学库(没有_datarom 的库)
//后缀)
//
//--define=CLA_MATH_TABES_IN_ROM=1
//
内存
{
第0页:
begin:origin = 0x3F7FF6,length = 0x000002 /* Part of FLASHA。 用于"引导至闪存"引导加载程序模式。 */
CLAPROGRAM:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L3 */
RAMM0:origin = 0x000050,length = 0x0003B0 /*片上 RAM 块 M0 */
RAML5L8:origin = 0x00C000、length = 0x008000
OTP : origin = 0x3D7800 , length = 0x000400 /*片上 OTP */
FLASHH:origin = 0x3D8000、length = 0x004000 /*片上闪存*/
FLASHG:origin = 0x3DC000,length = 0x004000 /*片上闪存*/
FLASHF:origin = 0x3E0000,length = 0x004000 /*片上闪存*/
FLASHE:origin = 0x3E4000,length = 0x004000 /*片上闪存*/
FLASHD : origin = 0x3E8000, length = 0x004000 /*片上闪存*/
FLASHC : origin = 0x3EC000 , length = 0x004000 /*片上 Flash */
FLASHA:origin = 0x3F4000,length = 0x003F80 /*片上闪存*/
ROM:origin = 0x3FF3B0,length = 0x000C10 /* Boot ROM */
复位:origin = 0x3FFFC0、length = 0x000002 /* part of boot ROM */
vectors : origin = 0x3FFFc2, length = 0x00003E /* part of boot ROM */
CSM_RSVD:origin = 0x3F7F80,length = 0x000076 /*部分 FLASHA。 当 CSM 正在使用时、全为0x0000编程。 */
// begin:origin = 0x3F7FF6,length = 0x000002 /*部分 FLASHA。 用于"引导至闪存"引导加载程序模式。 */
CSM_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /*部分 FLASHA。 FLASHA 中的 CSM 密码位置*/
第1页:
BOOT_RSVD:origin = 0x000000,length = 0x000050 /* M0的一部分,引导 ROM 将此用于堆栈*/
RAMM1:origin = 0x000400,length = 0x000400 /*片上 RAM 块 M1 */
CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080
CLARAM0:origin = 0x008800、length = 0x000400 /*片上 RAM 块 L1 */
CLARAM1 : origin = 0x008C00 , length = 0x000400 /*片上 RAM 块 L2 */
CLARAM2 : origin = 0x008000 , length = 0x000800 /*片上 RAM 块 L0 */
RAML4:origin = 0x00A000,length = 0x002000 /*片上 RAM 块 L4 */
USB_RAM:origin = 0x040000、length = 0x000800 /* USB RAM */
FLASHB:origin = 0x3F0000,length = 0x004000 /*片上闪存*/
}
部分
{
codestart :> begin, page = 0
csmpasswds:>csm_PWL_p0、page = 0
csm_rsvd :> csm_rsvd , page = 0
#if 已定义(RAM)
.cinit:> RAMM0、page = 0
.pinit:> RAMM0、page = 0
.text:> RAML5L8、page = 0
ramfuncs:> RAML5L8,page = 0
econst:> RAML5L8、页= 0
.switch:> RAMM0、PAGE = 0
Cla1Prog:{_Cla1ProgRunStart =.;}> CLAPROGRAM、
PAGE = 0
#if! (CLA_FFT_TABLE_IN_ROM)
CLA1fftTables :> CLARAM2, page = 1
#endif // CLA_FFT_TABLE_IN_ROM
#Elif 已定义(_FLASH)
.cinit:> FLASHA、page = 0
.pinit :> FLASHA,页面= 0
.text:> FLASHA、page = 0
CLA1mathTables :> CLARAM1, page = 1
ramfuncs : load=FLASHD,
RUN = RAML5L8、
Load_start (_RamfuncsLoadStart)、
RUN_START (_RamfuncsRunStart)、
Load_Size (_RamfuncsLoadSize)、
PAGE = 0
econst:> FLASHA、PAGE = 0
.switch:> FLASHA、PAGE = 0
CLA1fftTables : Load = FLASHB,
RUN = CLARAM2、
RUN_START (_CLA1fftTablesRunStart)、
Load_start (_CLA1fftTablesLoadStart)、
Load_Size (_CLA1fftTablesLoadSize)、
页= 1
Cla1Prog:load = FLASHD,
运行= CLAPROGRAM、
Load_Start (_Cla1ProgLoadStart)、
Load_Size (_Cla1ProgLoadSize)、
RUN_START (_Cla1ProgRunStart)、
PAGE = 0
//
//将表加载到闪存并复制到 RAM
//
CLA1mathTables : load=FLASHB,
运行= CLARAM1、
Load_start (_CLA1mathTablesLoadStart)、
Load_Size (_CLA1mathTablesLoadSize)、
RUN_START (_CLA1mathTablesRunStart)、
页= 1
#else
#error 向 C2000链接器中添加"RAM"或"_FLASH"->高级选项->命令文件预处理->--定义
#endif
.stack:> RAML4、page = 1
.ebss:> RAML4、page = 1
.esysmem:> RAML4、page = 1
Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW、page = 1
CpuToCla1MsgRAM:> CLA1_MSGRAMHIGH、page = 1
Cla1DataRam0:> CLARAM0、page = 1
Cla1DataRam1:> CLARAM1、page = 1
Cla1DataRam2:> CLARAM2、page = 1
IOBuffer :> RAML4, page = 1
RFFTmag :> RAML4,页面= 1
RFFTtwidthlads :> RAML4,页面= 1
#ifdef CLA_C
.cio:> RAML4、页= 1
//
// CLA C 编译器段
//
//必须分配给存储器 CLA 具有对
//
scratchpad:> CLARAM1、page = 1
.bss_cla:> CLARAM0、PAGE = 1
.const_cla:> CLARAM2、页= 1
#endif
.reset:> RESET、PAGE = 0、TYPE = DSECT
矢量:>矢量,页面= 0,类型= DSECT
}
/*
//========================================
//文件结尾。
//========================================
*/
我的主代码如下:
#include "Main.h"
#include "stdbool.h"
#include "application.h"
#include "F2806x_cla_definites.h"
#包含
//外部函数// CLA1fftTables
Uint16 RPM_2wheel = 0;
Uint16 RPM_4wheel = 0;
//#pragma DATA_SECTION (RPM_4wheel、"Cla1ToCpuMsgRAM");
//UINT16 RpmData[2];
#pragma DATA_SECTION (Num、"CpuToCla1MsgRAM");
浮点 Num=0;
#pragma DATA_SECTION (Den、"CpuToCla1MsgRAM");
浮点 Den;
#pragma DATA_SECTION (RES、"Cla1ToCpuMsgRAM");
浮点 RES;
浮点结果;
//
//定义
//
#define CLA_PROG_ENABLE 0x0001
#define CLARAM0_ENABLE 0x0010
#define CLARAM1_ENABLE 0x0020
#define CLARAM2_ENABLE 0x0040
#define CLA_RAM0CPUE 0x0100
#define CLA_RAM1CPUE 0x0200
#define CLA_RAM2CPUE 0x0400
#define RFFT_SIZE (1 << RFFT_STAGEs)
//
// CLA ISR
//
__interrupt void cla1_task1_ISR (void);
__interrupt void cla1_task2_ISR (void);
__interrupt void cla1_task3_ISR (void);
__interrupt void cla1_task4_ISR (void);
__interrupt void cla1_Task5_ISR (void);
__interrupt void cla1_task6_ISR (void);
__interrupt void cla1_task7_ISR (void);
__interrupt void cla1_task8_ISR (void);
//
//这些内容由链接器文件定义并用于复制
// CLA 代码从其加载地址到其运行地址
//在 CLA 程序存储器中
//
extern UINT16 Cla1ProgLoadSize;
extern UINT16 Cla1ProgLoadStart;
extern UINT16 Cla1ProgRunStart;
//
//这些内容由链接器文件定义并用于复制
// CLA 数学表从其加载地址到其运行地址
//集成到其中一个 CLA 数据 RAM 中
//
extern UINT16 Cla1mathTablesLoadStart;
extern UINT16 Cla1mathTablesLoadEnd;
extern UINT16 Cla1mathTablesLoadSize;
extern UINT16 Cla1mathTablesRunStart;
extern __interrupt void Cla1Task1 ();
extern __interrupt void Cla1Task2 ();
extern __interrupt void Cla1Task3 ();
extern __interrupt void Cla1Task4 ();
extern __interrupt void Cla1Task5 ();
extern __interrupt void Cla1Task6 ();
extern __interrupt void Cla1Task7 ();
extern __interrupt void Cla1Task8 ();
//全局变量
UINT16 Sensor_count= 0;
volatile bool FFT_task =false;
volatile bool RPM_CALC_TASK =false;
外部 UINT16 RPM [10];
//RAM 驱动的时间相关函数
#pragma code_section (DSP28x_usDelay、"ramfuncs");
#pragma code_section (cpu_timer0_isr、"ramfuncs");
#pragma code_section (CPU_Timer1_ISR、"ramfuncs");
#pragma code_section (ecap2_isr、"ramfuncs");
#pragma code_section (ADXL_Init、"ramfuncs");
#pragma code_section (adxL_buffer_tick、"ramfuncs");
#pragma code_section (Rpm_Display_Init、"ramfuncs");
#pragma code_section (FPU_FFT_Tick、"ramfuncs");
#pragma code_section (Rpm_Display_Tick、"ramfuncs");
#pragma code_section (scia_msg、"ramfuncs");
#pragma code_section (spi_init、"ramfuncs");
#pragma code_section (spi_fifo_init、"ramfuncs");
#pragma code_section (ADXL359_readRegister、"ramfuncs");
#pragma code_section (ADXL359_writeRegister、"ramfuncs");
#pragma code_section (four_weler、"ramfuncs");
//主菜单
//
空
TEST_RUN (void);
空 main (void)
{
//
//步骤1. 初始化系统控制:
InitSysCtrl();
InitSciGpio();
InitECap2Gpio();
InitSpiaGpio();
InitECapture();
InitI2Cgpio();
Init Gpio_Button ();
//
//禁用 CPU 中断并清除所有 CPU 中断标志
Dint;
//
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// :使用 void * memcpy ( void * destination、const void * source、size_t num )
//将"Cla1Prog"和".const_cla"段从闪存复制到 RAM
memcpy (((uint32_t *)&Cla1ProgRunStart、(uint32_t *)&Cla1ProgLoadStart、
(uint32_t)&Cla1ProgLoadSize);
// memcpy ((uint32_t *)&Cla1ConstRunStart、(uint32_t *)&Cla1ConstLoadStart、
//( uint32_t )&Cla1ConstLoadSize );
//
//将用户定义的 ISR 分配至 PIE 矢量表
//
EALLOW;
PieVectTable。 CLA1_INT1 =&cla1_task1_isr;
PieVectTable。 CLA1_INT2 =&cla1_task2_isr;
PieVectTable。 CLA1_INT3 =&cla1_task3_ISR;
PieVectTable。 CLA1_INT4 =&cla1_task4_ISR;
PieVectTable。 CLA1_INT5 =&cla1_task5_ISR;
PieVectTable。 CLA1_INT6 =&cla1_task6_isr;
PieVectTable。 CLA1_INT7 =&cla1_task7_isr;
PieVectTable。 CLA1_INT8 =&cla1_task8_isr;
EDIS;
//
//计算所有 CLA 任务向量
//
EALLOW;
Cla1Regs.MVECT1 =(UINT16)((UINT32)&Cla1Task1 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT2 =(UINT16)((UINT32)&Cla1Task2 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT3 =(UINT16)((UINT32)&Cla1Task3 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT4 =(UINT16)((UINT32)&Cla1Task4 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT5 =(UINT16)((UINT32)&Cla1Task5 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT6 =(UINT16)((UINT32)&Cla1Task6 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT7 =(UINT16)((UINT32)&Cla1Task7 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT8 =(UINT16)((UINT32)&Cla1Task8 -(UINT32)&Cla1ProgRunStart);
EDIS;
//
//第3步:映射 CLA 任务
//所有任务均已启用并且将由 ePWM 触发器启动
//将 CLA 程序存储器映射到 CLA 并启用软件断点
//
EALLOW;
Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = CLA_INT1_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT2SEL = CLA_INT2_none;
Cla1Regs.MPISRCSEL1.bit.PERINT3SEL = CLA_INT3_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT4SEL = CLA_INT4_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT5SEL = CLA_INT5_none;
Cla1Regs.MPISRCSEL1.bit.PERINT6SEL = CLA_INT6_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT7SEL = CLA_INT7_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT8SEL = CLA_INT8_NONE;
Cla1Regs.Mier.all = 0x00FF;
EDIS;
//调用闪存初始化以设置闪存等待状态
//该函数必须驻留在 RAM 中
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(UINT32)&RamfuncsLoadSize);
//外设初始化
//I2C A 初始化
I2CA_Init ();
//初始化 SPI 和 SCI FIFO
SPI_INIT();
spi_fifo_init ();
//初始化 SCI 和 SCI FIFO
scia_echoback_init ();
scia_fifo_init ();
InitFlash();
//初始化 ADXL 振动传感器
ADXL_Init ();
//初始化 LCD 显示
Rpm_Display_Init ();
// display_task = true;
//初始化环形缓冲区以存储传感器数据
ADXL_BUFFER_Init (&ADXL_RingBuffer_X、(uint8*) test_input、sizeof (test_input));
ADXL_Buffer_Init (&ADXL_RingBuffer_Y、(uint8*) test_inputY、sizeof (test_inputY));
ADXL_Buffer_Init (&ADXL_RingBuffer_Z、(uint8*) test_inputZ、sizeof (test_inputZ));
//初始化计时器
// Timer_Init ();//初始化循环中断的计时器
//初始化 GPIO 引脚以通过按钮在两轮和四轮车之间切换
init_button (pButton);
memset (RPM、0、sizeof (RPM));
//
//在组和子组级别启用 CLA 中断
//
PieCtrlRegs.PIEIER11.all = 0xFFFF;
IER =(M_INT11 );
Timer_Init ();
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//将 CLA 程序空间切换到 CLA 并启用软件强制
//也切换 CLA 数据 RAM 0、1和2
//注意:RAMxCPUE 位只能通过对
//寄存器,而不是单个位字段。 此外,该国的状况
//这些位域不会反映在监视视图或寄存器视图中-
//它们始终读取为零。 这是一个已知错误、建议用户
//在继续之前先测试 CPU 附件
EALLOW;
// Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE|CLARAM0_ENABLE|CLARAM1_ENABLE|CLA_RAM1CPUE;// CLA_RAM2_ENABLE|
Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE|CLARAM0_ENABLE|CLARAM1_ENABLE|
CLARAM2_ENABLE|CLA_RAM1CPUE;
Cla1Regs.MCTL.bit.IACKE = 1;
EDIS;
//无限循环
while (1)
{
task_scheduler();
}
}
//
// CLA ISR
//
__中断无效
cla1_task1_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_task2_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_task3_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_task4_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_Task5_ISR (空)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_task6_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_task7_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
__中断无效
cla1_task8_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;
}
//文件结束
//
空
TEST_RUN (空)
{
Cla1ForceTask1andWait();
结果= RES;
PUTs("*");
}
在我的 while 环路中、我将调用该函数来计算 FFT、如下所示
int FPU_FFT_Tick ()
{
//局部变量
UINT16 tempRPM=0;
浮点 FFT_SIZE = RFFT_SIZE;
Uint16 RPM_4WHELE_X = 0;
Uint16 RPM_4WHELE_Y = 0;
Uint16 RPM_4WHELE_Z = 0;
静态 uint16 j=0;
{
UINT16 I=0;
for (I=0;I < RFFT_SIZE;I++){
IOBuffer[i]= TEST_INPUT[i];
}
}
hnd_rfft->FFTSize = RFFT_size;
HND_rfft->FFTStages = RFFT_stages;
hd_rfft->InBuf =&IOBuffer[0];//输入缓冲器
hnd_rfft->OutBuf =&IOBuffer2[0];//输出缓冲器
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度缓冲器
hd_rfft->CosSinBuf =&RFFTF32Coef[0];//Twiddle 因子缓冲器
RFFT_F32_sincostable (HND_rfft);//计算 Twiddle Factor
{
UINT16 I=0;
对于(I=0;I < RFFT_SIZE;I++){
IOBuffer2[i]= 0;//清理输出缓冲器
}
}
{
UINT16 I=0;
for (I=0;I <= RFFT_SIZE/2;I++){
RFFTmagBuff[i]= 0;//清理幅度缓冲器
}
}
#ifdef run_cla
test_run();
#else
RFFT_F32 (HND_rfft);//计算实数 FFT
RFFT_F32_MAG (HND_rfft);//计算幅度
#endif
// HND_rfft->PhaseBuf =&RFFTmagBuff[0];//使用幅度缓冲器
{
UINT16 I=1;
对于(I =1;I <= RFFT_SIZE/2;++I)
{
IF ((RFFTmagBuff[I]> maxMagnitude))
{//&&(IOBuffer2[i]< 20)//&& maxMagnitude < 40
maxMagnitude = RFFTmagBuff[i];
peakIndex = i;
}
}
}
频率=(FS * peakIndex)/(FFT_SIZE);
if (maxMagnitude <3)
{
RPM_4WHEEL_X = 0;
}
否则
{
RPM_4WHEEL_X= RPM_VALUE (频率、4);
}
// RPM (Y 轴)
{
UINT16 I=0;
for (I=0;I < RFFT_SIZE;I++){
IOBuffer[i]= test_inputY[i];
}
}
hnd_rfft->FFTSize = RFFT_size;
HND_rfft->FFTStages = RFFT_stages;
hd_rfft->InBuf =&IOBuffer[0];//输入缓冲器
hnd_rfft->OutBuf =&IOBuffer2[0];//输出缓冲器
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度缓冲器
hd_rfft->CosSinBuf =&RFFTF32Coef[0];//Twiddle 因子缓冲器
RFFT_F32_sincostable (HND_rfft);//计算 Twiddle Factor
{
UINT16 I=0;
对于(I=0;I < RFFT_SIZE;I++){
IOBuffer2[i]= 0;//清理输出缓冲器
}
}
{
UINT16 I=0;
for (I=0;I <= RFFT_SIZE/2;I++){
RFFTmagBuff[i]= 0;//清理幅度缓冲器
}
}
#ifdef run_cla
test_run();
#else
RFFT_F32 (HND_rfft);//计算实数 FFT
RFFT_F32_MAG (HND_rfft);//计算幅度
#endif
// HND_rfft->PhaseBuf =&RFFTmagBuff[0];//使用幅度缓冲器
{
UINT16 I=1;
对于(I =1;I <= RFFT_SIZE/2;++I)
{
IF ((RFFTmagBuff[I]> maxMagnitude))
{
maxMagnitude = RFFTmagBuff[i];
peakIndex = i;
}
}
}
频率=(FS * peakIndex)/(FFT_SIZE);
if (maxMagnitude <3)
{
RPM_4WHEEL_Y = 0;
}
否则
{
RPM_4WHEEL_Y= RPM_VALUE (频率、4);
}
// Z 轴 RPM
{
UINT16 I=0;
for (I=0;I < RFFT_SIZE;I++){
IOBuffer[i]= test_inputZ[i];
}
}
hnd_rfft->FFTSize = RFFT_size;
HND_rfft->FFTStages = RFFT_stages;
hd_rfft->InBuf =&IOBuffer[0];//输入缓冲器
hnd_rfft->OutBuf =&IOBuffer2[0];//输出缓冲器
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度缓冲器
hd_rfft->CosSinBuf =&RFFTF32Coef[0];//Twiddle 因子缓冲器
RFFT_F32_sincostable (HND_rfft);//计算 Twiddle Factor
{
UINT16 I=0;
对于(I=0;I < RFFT_SIZE;I++){
IOBuffer2[i]= 0;//清理输出缓冲器
}
}
{
UINT16 I=0;
for (I=0;I <= RFFT_SIZE/2;I++){
RFFTmagBuff[i]= 0;//清理幅度缓冲器
}
}
#ifdef run_cla
test_run();
#else
RFFT_F32 (HND_rfft);//计算实数 FFT
RFFT_F32_MAG (HND_rfft);//计算幅度
#endif
// HND_rfft->PhaseBuf =&RFFTmagBuff[0];//使用幅度缓冲器
{
UINT16 I=1;
对于(I =1;I <= RFFT_SIZE/2;++I)
{
IF ((RFFTmagBuff[I]> maxMagnitude))
{//&&(IOBuffer2[i]< 20)//&& maxMagnitude < 40
maxMagnitude = RFFTmagBuff[i];
peakIndex = i;
}
}
}
频率=(FS * peakIndex)/(FFT_SIZE);
if (maxMagnitude <3)
{
RPM_4WHEEL_Z = 0;
}
否则
{
RPM_4WHEEL_Z = RPM_VALUE (频率、4);
}
if (((RPM_4WHEEL_X!= RPM_4WHEEL_Y)&(RPM_4WHEEL_Y!= RPM_4WHEEL_Z))
{
返回1;
}
else if ((RPM_4WHELE_X!= RPM_4WHEEL_Y)||(RPM_4WHEEL_Y!= RPM_4WHEEL_Z)||(RPM_4WHEEL_X!= RPM_4WHEEL_Y)
{
if ((RPM_4WHELE_X = RPM_4WHEEL_Y))
{
RPM_4WHEEL_Z = RPM_4WHEEL_Y;
}
否则、为((RPM_4WHELE_Z = RPM_4WHEEL_Y))
{
RPM_4WHEEL_X = RPM_4WHEEL_Y;
}
否则、为((RPM_4WHELE_Z = RPM_4WHELE_X))
{
RPM_4WHEEL_Y = RPM_4WHEEL_X;
}
RPM[j]=RPM_4WHELE_Z;//(RPM_4WHELE_X + RPM_4WHEEL_Y + RPM_4WHEEL_Z)/3;
}
否则
{
rpm[j]= RPM_4wel_Z;//(RPM_4wel_X + RPM_4wel_Y + RPM_4wel_Z)/3;
}
if ((j >= 2)&&(RPM [j]- RPM [j-1])> 30)&&(RPM [j]-RPM [j-2])< 20))
{
RPM[j-1]= RPM[j];
}
if ((j<2 &&(RPM[1]- RPM[0])>30)&((RPM[1]- RPM[4])< 20))
{
rpm[0]= rpm[1];
}
J++;
//
如果(j>4){j=0;}
{
UINT16 I=0;
for (I=0;I<5;I++)
{
tempRPM += RPM[i];
}
tempRPM = tempRPM/5;
}
RPM_4wheel =温度 RPM;
maxMagnitude = 0;
//测试结束
//完成();
//执行永远不会达到此点
返回1;
}
问题是、当我启用 RUN_CLA 宏时、它不是计算 FFT、而是在 IOBuffer2和 RFFTmagBuff 上获得空白数据。
我的 CLA 文件如下所示:
__中断无效
Cla1Task1 (空)
{
_mdebugstop();
CLA_CFFT_run256Pt ();
RES =数字/数字;
CLA_CFFT_unpack256Pt ();
}
请告诉我在 CLA 配置或缓冲区内存段分配中有什么操作错误,为什么它不起作用,在这个控制器中是否有任何可用于 CLA FFT 计算的参考。
尊敬的 Sanjay:
您是否使用 C2000ware 中的某个 CLA 示例作为代码的起点? 如果没有、我建议从其中一个示例开始、添加您的 FFT 计算。 对于 TMS320F28069、可在[C2000ware install]/device_support/f2806x/examples/cla 文件夹中找到这些脚本。
此致、
德拉尼
是的、我已经遵循了相同的示例、如果我漏掉了一些内容、请检查我的代码并提供帮助
尊敬的 Sanjay:
此处链接的 是展示如何将 FFT 计算代码迁移到 CLA 的研讨会视频。 您可以尝试 在 F2806x 项目中运行这里显示的代码吗? 项目文件可在页面底部下载。 本示例使用的是 F2937D、F2806x 对 CLA 模块进行了一些细微的增强、但我不认为这应该是个问题。
下面是一些其他线程、讨论 CLA 上的 FFT 计算、供您参考。
TMS320F28379D:CLA FFT 表的用途- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛
TMS320F28379D:将 FFT 从 CPU1移至 CLA (计算错误)- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛
此致、
德拉尼
我遵循这些帖子并将我的 cmd 文件细化为下面的文件、 但现在有一个新问题、我得到了一些 FFT 输出的随机值、请看一下、让我知道我是否在该 cmd 文件中丢失了一些内容:(请注意、我的代码在没有 CLA 的情况下可以正常工作、 但当我使用 CLA 时、我提供 FFT 输出的随机值)
/*
// TI 文件$Revision:/main/3 $
// Checkin $日期:2011年3月3日13:45:53 $
//########################################################################出################################出
//
//文件:f28069.cmd
//
//标题:F28069器件的连接器命令文件
//
//########################################################################出################################出
//$TI 发布:2806x C/C++头文件 v1.1美元
//$发布日期:2011年4月7日$
//$Copyright:
//版权所有(C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,无论有无
//修改,前提是满足以下条件
//已满足:
//
//重新分发源代码必须保留以上版权
//通知,此条件列表和下述免责声明。
//
//以二进制形式重新分发必须复制上述版权
//通知,此条件列表和以下免责声明(位于
///文件和/或其他材料
//分布。
//
// TI 公司名称或公司名称
//其贡献者可用于认可或推广派生的产品。
//未经事先书面许可从本软件获得。
//
//此软件由版权持有者和贡献者提供
//"按原样"和任何明示或暗示的保证、包括但不限于
//仅限于对适销性和适用性的暗示保证
//不考虑特定目的。 在任何情况下、版权均不得
//所有者或贡献者对任何直接、间接、偶然、
//特殊、示例或后果性损害(包括但不包括
//仅限于采购替代货物或服务;不能使用、
///数据或利润;或业务中断)
//责任理论,无论是在合同,严格的责任,或侵权
//(包括疏忽或其他)以任何方式产生的使用
//本软件,即使已被告知此类损坏的可能性。
//$
//########################################################################出################################出
*/
/*========================================
//对于 Code Composer Studio V2.2及更高版本
//-------------------------------------------------------
//除了该存储器连接器命令文件,
//将头连接器命令文件直接添加到项目中。
//需要使用头连接器命令文件来链接
//外设结构设置到内部的正确位置
//存储器映射。
//
//头文件位于 \标题\cmd
//
//对于 BIOS 应用程序,添加:F2806x_Headers_BIOS.cmd
//对于非 BIOS 应用程序,添加:f2806x_Headers_nonBIOS.cmd
================================ */
/*========================================
//对于 V2.2之前的 Code Composer Studio
//-------------------------------------------------------
// 1)使用以下-l 语句之一来包含
//项目中的头连接器命令文件。 头文件链接器
//文件需要将外设结构链接到正确的
//存储器映射中的位置*/
/*取消注释此行、以便仅包含非 BIOS 应用程序的文件*/
/*-l F2806x_Headers_nonBIOS.cmd */
/*取消注释此行、以便仅包含 BIOS 应用程序的文件*/
/*-l F2806x_Headers_BIOS.cmd */
/* 2)在项目中将路径添加到 \headers\cmd 添加到
项目->构建选项、链接器选项卡下的库搜索路径、
库搜索路径(-i)。
/*=================================================================================== */
/*定义 F2806x 的存储器块起始/长度
第0页将用于组织程序段
第1页将用于组织数据段
注:
F28069上的内存块是统一的(即
物理存储器)。
存储器区域的头文件不应
为 PAGE 0和 PAGE 1定义了该值。
这样做会导致程序损坏、
和/或数据。
连续 SARAM 存储器块可以组合
创建更大的存储块。
*/
_Cla1 Prog_Start =_Cla1funcsRunStart;
-heap 0x400
-stack 0x400
//定义将要使用的 CLA 暂存区的大小
//通过 CLA 编译器获取局部符号和临时变量
//也强制引用标记
//暂存区。
CLA_SCRATCHPAD_SIZE = 0x100;
-- undef_sym=_cla_scratchpad_end
-- undef_sym=_cla_scratchpad_start
内存
{
第0页:/*程序存储器*/
/*存储器(RAM/FLASH/OTP)块可以移动到页1进行数据分配*/
//RAML0:origin = 0x008000、length = 0x000800 /*片上 RAM 块 L0 */
//RAML1:origin = 0x008800、length = 0x000400 /*片上 RAM 块 L1 */
OTP : origin = 0x3D7800 , length = 0x000400 /*片上 OTP */
FLASHH:origin = 0x3D8000、length = 0x004000 /*片上闪存*/
FLASHG:origin = 0x3DC000,length = 0x004000 /*片上闪存*/
FLASHF:origin = 0x3E0000,length = 0x004000 /*片上闪存*/
FLASHE:origin = 0x3E4000,length = 0x004000 /*片上闪存*/
FLASHD : origin = 0x3E8000, length = 0x004000 /*片上闪存*/
FLASHC : origin = 0x3EC000 , length = 0x004000 /*片上 Flash */
FLASHA:origin = 0x3F4000,length = 0x003F80 /*片上闪存*/
CSM_RSVD:origin = 0x3F7F80,length = 0x000076 /*部分 FLASHA。 当 CSM 正在使用时、全为0x0000编程。 */
begin:origin = 0x3F7FF6,length = 0x000002 /* Part of FLASHA。 用于"引导至闪存"引导加载程序模式。 */
CSM_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /*部分 FLASHA。 FLASHA 中的 CSM 密码位置*/
FPUBLES:origin = 0x3FD590,length = 0x0006A0 /*引导 ROM 中的 FPU 表*/
IQTABLES : origin = 0x3FDF00 , length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
IQTABLES2:origin = 0x3FEA50,length = 0x00008C /* Boot ROM 中的 IQMath 表*/
IQTABLES3:origin = 0x3FEADC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/
ROM:origin = 0x3FF3B0,length = 0x000C10 /* Boot ROM */
复位:origin = 0x3FFFC0、length = 0x000002 /* part of boot ROM */
vectors : origin = 0x3FFFc2, length = 0x00003E /* part of boot ROM */
第1页:/*数据存储器*/
/*存储器(RAM/FLASH/OTP)块可以移动到 PAGE0进行程序分配*/
/*寄存器仍保留在页1上*/
BOOT_RSVD:origin = 0x000000,length = 0x000050 /* M0的一部分,引导 ROM 将此用于堆栈*/
RAMM0:origin = 0x000050,length = 0x000350 /*片上 RAM 块 M0 */
RAMM1:origin = 0x000400,length = 0x000400 /*片上 RAM 块 M1 */
//RAML2:origin = 0x008C00、length = 0x000400 /*片上 RAM 块 L2 */
RAML3:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L3 */
RAML4:origin = 0x00A000,length = 0x002000 /*片上 RAM 块 L4 */
RAML5:origin = 0x00C000、length = 0x001000 /*片上 RAM 块 L5 */
RAML6:origin = 0x00D000、length = 0x001000 /*片上 RAM 块 L6 */
RAML7:origin = 0x00E000、length = 0x001000 /*片上 RAM 块 L7 */
RAML8:origin = 0x00F000、length = 0x005000 /*片上 RAM 块 L8 */
USB_RAM:origin = 0x040000、length = 0x000800 /* USB RAM */
FLASHB:origin = 0x3F0000,length = 0x004000 /*片上闪存*/
CLARAM0:origin = 0x008800,length = 0x000400 /*L1 DSPSARAM*/
CLARAM1 : origin = 0x008C00 , length = 0x000400 /* L2 DSPSARAM*/
CLARAM2 : origin = 0x008000 , length = 0x000800
CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080
}
/*将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中的 codestart 用户定义段用于重定向代码
引导至闪存时执行
ramfuncs 的用户定义的部分、用于存储将从闪存复制到 RAM 中的函数
*/
部分
{
/*分配计划领域:*/
.cinit:> FLASHA、page = 0
.pinit :> FLASHA,页面= 0
.text:> FLASHA、page = 0
codestart :> begin, page = 0
// ramfuncs : load = FLASHD,
// run = RAML0、
// page = 0
ramfuncs:load=FLASHB、
RUN = RAML8、
Load_start (_RamfuncsLoadStart)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
Load_Size (_RamfuncsLoadSize)、
页= 1
csmpasswds:>csm_PWL_p0、page = 0
csm_rsvd :> csm_rsvd , page = 0
/*分配未初始化的数据段:*/
.stack:> RAMM1、page = 1
.ebss:> RAML4、page = 1
.esysmem:> RAML6、page = 1
.cio:> RAML5、page = 1
/*要进入闪存的已初始化段*/
/*要使 SDFlash 对这些单元进行编程,它们必须被分配到 PAGE 0 */
econst:> FLASHA、PAGE = 0
.switch:> FLASHA、PAGE = 0
/*分配 IQ 数学领域:*/
IQMath :> FLASHA, page = 0 /*数学代码*/
IQmathTables :> IQTABLES , PAGE = 0, TYPE = NOLOAD
/*分配 FPU 数学领域:*/
FPUmathTables :> FPUTABLES , PAGE = 0, TYPE = NoLoad
IOBuffer:>CLARAM2、page = 1//align=512、
RFFTdata2:> CLARAM2、page = 1//已添加 RAML456
RFFTdata3:> RAML7、page = 1
RFFTdata4 :> RAML8 , page = 1 // FPUfftTables
/*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
库中的 Iqmath.lib 函数构建库、从而利用
引导 ROM 中的相关 IQMath 表(这样可以节省空间和引导 ROM
1个等待状态)。 如果未取消注释该段、则 IQmathTables2
将加载到其他存储器(SARAM、闪存等)中、并将执行
为 up 空间、但等待状态为0是可行的。
*/
/*
IQmathTables2:>IQTABLES2、PAGE = 0、TYPE = NOLOAD
{
IQmath.lib (IQmathTablesRam)
}
*/
/*如果调用 IQNasin ()或 IQasin (),请取消注释下面的部分
库中的 Iqmath.lib 函数构建库、从而利用
引导 ROM 中的相关 IQMath 表(这样可以节省空间和引导 ROM
1个等待状态)。 如果未取消注释该段、则 IQmathTables2
将加载到其他存储器(SARAM、闪存等)中、并将执行
为 up 空间、但等待状态为0是可行的。
*/
/*
IQmathTables3:>IQTABLES3、PAGE = 0、TYPE = NOLOAD
{
IQmath.lib (IQmathTablesRam)
}
*/
/*.reset 是编译器使用的标准段。 它包含*/
/* C 代码的_c_int00起始地址。 /*
/*使用引导 ROM 时、此段和 CPU 矢量*/
不需要/*表。 因此、此处将默认类型设置为*/
/* DSECT */
Cla1Prog:load = FLASHB,
RUN = RAML3、
Load_Start (_Cla1funcsLoadStart)、
Load_End (_Cla1funcsLoadEnd)、
Load_Size (_Cla1funcsLoadSize)、
RUN_START (_Cla1funcsRunStart)、
页= 1
Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW、page = 1
CpuToCla1MsgRAM:> CLA1_MSGRAMHIGH、page = 1
Cla1DataRam0:> CLARAM0、page = 1
Cla1DataRam1:> CLARAM1、page = 1
Cla1DataRam2:> CLARAM2、page = 1
//CLA1mathTables :> RAML7、
// load_start (_Cla1mathTablesLoadStart)、
//load_end (_Cla1mathTablesLoadEnd)、
//load_size (_Cla1mathTablesLoadSize)、
// RUN_START (_Cla1mathTablesRunStart),
// page = 1
CLA1mathTables : load=FLASHB,
运行= CLARAM1、
RUN_START (CLA1fftTablesRunStart)、
Load_start (_Cla1mathTablesLoadStart)、
Load_End (_Cla1mathTablesLoadEnd)、
Load_Size (_Cla1mathTablesLoadSize)、
RUN_START (_Cla1mathTablesRunStart)、
页= 1
CLA1fftTables : Load = FLASHB,
RUN = RAML4、
RUN_START (CLA1mathTablesRunStart)、
Load_start (CLA1fftTablesLoadStart)、
Load_Size (CLA1fftTablesLoadSize)、
页= 1
// CLA1fftTables :> RAML4,
//load_start (_Cla1fftTablesLoadStart)、
//load_end (_Cla1fftTablesLoadEnd)、
//load_size (_Cla1fftTablesLoadSize)、
//run_start (_Cla1fftTablesRunStart)、
//页= 1
CLAscratch:
{*。obj (CLAscratch)
。 += CLA_SCRATCHPAD_SIZE;
*.obj (CLAscratch_end)}> CLARAM0,
页= 1
.bss_cla:> CLARAM0、PAGE = 1
.const_cla:> CLARAM0、PAGE = 1
scratchpad:> CLARAM0、page = 1
.reset:> RESET、PAGE = 0、TYPE = DSECT
矢量:>矢量,页面= 0,类型= DSECT
}
/*
//========================================
//文件结尾。
//========================================
*/
尊敬的 Sanjay:
您能否将代码附加为文件而不是文本? 我将仔细查看是否可以找到任何问题。
谢谢。
德拉尼
/* // TI File $Revision: /main/3 $ // Checkin $Date: March 3, 2011 13:45:53 $ //########################################################################### // // FILE: F28069.cmd // // TITLE: Linker Command File For F28069 Device // //########################################################################### // $TI Release: 2806x C/C++ Header Files V1.10 $ // $Release Date: April 7, 2011 $ // $Copyright: // Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //########################################################################### */ /* ====================================================== // For Code Composer Studio V2.2 and later // --------------------------------------- // In addition to this memory linker command file, // add the header linker command file directly to the project. // The header linker command file is required to link the // peripheral structures to the proper locations within // the memory map. // // The header linker files are found in <base>\headers\cmd // // For BIOS applications add: F2806x_Headers_BIOS.cmd // For nonBIOS applications add: F2806x_Headers_nonBIOS.cmd ========================================================= */ /* ====================================================== // For Code Composer Studio prior to V2.2 // -------------------------------------- // 1) Use one of the following -l statements to include the // header linker command file in the project. The header linker // file is required to link the peripheral structures to the proper // locations within the memory map */ /* Uncomment this line to include file only for non-BIOS applications */ /* -l F2806x_Headers_nonBIOS.cmd */ /* Uncomment this line to include file only for BIOS applications */ /* -l F2806x_Headers_BIOS.cmd */ /* 2) In your project add the path to <base>\headers\cmd to the library search path under project->build options, linker tab, library search path (-i). /*========================================================= */ /* Define the memory block start/length for the F2806x PAGE 0 will be used to organize program sections PAGE 1 will be used to organize data sections Notes: Memory blocks on F28069 are uniform (ie same physical memory) in both PAGE 0 and PAGE 1. That is the same memory region should not be defined for both PAGE 0 and PAGE 1. Doing so will result in corruption of program and/or data. Contiguous SARAM memory blocks can be combined if required to create a larger memory block. */ _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 : /* Program Memory */ /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ //RAML0 : origin = 0x008000, length = 0x000800 /* on-chip RAM block L0 */ //RAML1 : origin = 0x008800, length = 0x000400 /* on-chip RAM block L1 */ OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */ 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 */ CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */ BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */ CSM_PWL_P0 : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */ FPUTABLES : origin = 0x3FD590, length = 0x0006A0 /* FPU Tables in Boot ROM */ IQTABLES : origin = 0x3FDF00, length = 0x000B50 /* IQ Math Tables in Boot ROM */ IQTABLES2 : origin = 0x3FEA50, length = 0x00008C /* IQ Math Tables in Boot ROM */ IQTABLES3 : origin = 0x3FEADC, length = 0x0000AA /* IQ Math Tables in Boot ROM */ 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 */ PAGE 1 : /* Data Memory */ /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */ /* Registers remain on PAGE1 */ BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */ RAMM0 : origin = 0x000050, length = 0x000350 /* on-chip RAM block M0 */ RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ //RAML2 : origin = 0x008C00, length = 0x000400 /* on-chip RAM block L2 */ RAML3 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L3 */ RAML4 : origin = 0x00A000, length = 0x002000 /* on-chip RAM block L4 */ RAML5 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L5 */ RAML6 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L6 */ RAML7 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L7 */ RAML8 : origin = 0x00F000, length = 0x005000 /* on-chip RAM block L8 */ USB_RAM : origin = 0x040000, length = 0x000800 /* USB RAM */ FLASHB : origin = 0x3F0000, length = 0x004000 /* on-chip FLASH */ CLARAM0 : origin = 0x008800, length = 0x000400 /*L1 DSPSARAM*/ CLARAM1 : origin = 0x008C00, length = 0x000400 /*L2 DSPSARAM*/ CLARAM2 : origin = 0x008000, length = 0x000800 CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080 CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080 } /* Allocate sections to memory blocks. Note: codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code execution when booting to flash ramfuncs user defined section to store functions that will be copied from Flash into RAM */ SECTIONS { /* Allocate program areas: */ .cinit : > FLASHA, PAGE = 0 .pinit : > FLASHA, PAGE = 0 .text : > FLASHA, PAGE = 0 codestart : > BEGIN, PAGE = 0 // ramfuncs : LOAD = FLASHD, // RUN = RAML0, // PAGE = 0 ramfuncs : LOAD = FLASHB, RUN = RAML8, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), LOAD_SIZE(_RamfuncsLoadSize), PAGE = 1 csmpasswds : > CSM_PWL_P0, PAGE = 0 csm_rsvd : > CSM_RSVD, PAGE = 0 /* Allocate uninitialized data sections: */ .stack : > RAMM1, PAGE = 1 .ebss : > RAML4, PAGE = 1 .esysmem : > RAML6, PAGE = 1 .cio : > RAML5, 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 /* Allocate IQ math areas: */ IQmath : > FLASHA, PAGE = 0 /* Math Code */ IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD /* Allocate FPU math areas: */ FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD IOBuffer : > CLARAM2, ALIGN=4096, PAGE = 1//ALIGN=512, RFFTdata2 : > CLARAM2, PAGE = 1//ADDED RAML456 RFFTdata3 : > RAML8, PAGE = 1 RFFTdata4 : > RAML8, PAGE = 1 //FPUfftTables /* Uncomment the section below if calling the IQNexp() or IQexp() functions from the IQMath.lib library in order to utilize the relevant IQ Math table in Boot ROM (This saves space and Boot ROM is 1 wait-state). If this section is not uncommented, IQmathTables2 will be loaded into other memory (SARAM, Flash, etc.) and will take up space, but 0 wait-state is possible. */ /* IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD { IQmath.lib<IQNexpTable.obj> (IQmathTablesRam) } */ /* Uncomment the section below if calling the IQNasin() or IQasin() functions from the IQMath.lib library in order to utilize the relevant IQ Math table in Boot ROM (This saves space and Boot ROM is 1 wait-state). If this section is not uncommented, IQmathTables2 will be loaded into other memory (SARAM, Flash, etc.) and will take up space, but 0 wait-state is possible. */ /* IQmathTables3 : > IQTABLES3, PAGE = 0, TYPE = NOLOAD { IQmath.lib<IQNasinTable.obj> (IQmathTablesRam) } */ /* .reset is a standard section used by the compiler. It contains the */ /* the address of the start of _c_int00 for C Code. /* /* When using the boot ROM this section and the CPU vector */ /* table is not needed. Thus the default type is set here to */ /* DSECT */ Cla1Prog : LOAD = FLASHB, RUN = RAML3, LOAD_START(_Cla1funcsLoadStart), LOAD_END(_Cla1funcsLoadEnd), LOAD_SIZE(_Cla1funcsLoadSize), RUN_START(_Cla1funcsRunStart), PAGE = 1 Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, PAGE = 1 CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, PAGE = 1 Cla1DataRam0 : > CLARAM0, PAGE = 1 Cla1DataRam1 : > CLARAM1, PAGE = 1 Cla1DataRam2 : > CLARAM2, PAGE = 1 //CLA1mathTables : > RAML7, // LOAD_START(_Cla1mathTablesLoadStart), //LOAD_END(_Cla1mathTablesLoadEnd), //LOAD_SIZE(_Cla1mathTablesLoadSize), // RUN_START(_Cla1mathTablesRunStart), // PAGE = 1 CLA1mathTables : LOAD = FLASHB, RUN = CLARAM1, RUN_START(CLA1fftTablesRunStart), LOAD_START(_Cla1mathTablesLoadStart), LOAD_END(_Cla1mathTablesLoadEnd), LOAD_SIZE(_Cla1mathTablesLoadSize), RUN_START(_Cla1mathTablesRunStart), PAGE = 1 CLA1fftTables : LOAD = FLASHB, RUN = RAML4, RUN_START(CLA1mathTablesRunStart), LOAD_START(CLA1fftTablesLoadStart), LOAD_SIZE(CLA1fftTablesLoadSize), PAGE = 1 // CLA1fftTables : > RAML4, //LOAD_START(_Cla1fftTablesLoadStart), //LOAD_END(_Cla1fftTablesLoadEnd), //LOAD_SIZE(_Cla1fftTablesLoadSize), //RUN_START(_Cla1fftTablesRunStart), //PAGE = 1 CLAscratch : { *.obj(CLAscratch) . += CLA_SCRATCHPAD_SIZE; *.obj(CLAscratch_end) } > CLARAM0, PAGE = 1 .bss_cla : > CLARAM0, PAGE = 1 .const_cla : > CLARAM0, PAGE = 1 .scratchpad : > CLARAM0, PAGE = 1 .reset : > RESET, PAGE = 0, TYPE = DSECT vectors : > VECTORS, PAGE = 0, TYPE = DSECT } /* //=========================================================================== // End of file. //=========================================================================== */
#include "Main.h" #include "stdbool.h" #include "application.h" #include "DSP28x_Project.h" // DSP28x Headerfile #include "F2806x_Cla_defines.h" #include "divide_shared.h" //Externs Functions // // Defines // #define CLA_PROG_ENABLE 0x0001 #define CLARAM0_ENABLE 0x0010 #define CLARAM1_ENABLE 0x0020 #define CLARAM2_ENABLE 0x0040 #define CLA_RAM0CPUE 0x0100 #define CLA_RAM1CPUE 0x0200 #define CLA_RAM2CPUE 0x0400 // // CLA ISRs // __interrupt void cla1_task1_isr(void); // // These are defined by the linker file and used to copy // the CLA code from its load address to its run address // in CLA program memory // extern Uint16 Cla1funcsLoadStart; extern Uint16 Cla1funcsLoadEnd; extern Uint16 Cla1funcsLoadSize; extern Uint16 Cla1funcsRunStart; extern Uint16 Cla1Prog_Start; // // These are defined by the linker file and used to copy // the CLA math tables from its load address to its run address // into one of the CLA data RAMs // extern Uint16 Cla1mathTablesLoadStart; extern Uint16 Cla1mathTablesLoadEnd; extern Uint16 Cla1mathTablesLoadSize; extern Uint16 Cla1mathTablesRunStart; //Globals Uint16 Sensor_count= 0 ; extern Uint16 RPM[10]; //Ram driven Time Dependent Functions #pragma CODE_SECTION(DSP28x_usDelay, "ramfuncs"); #pragma CODE_SECTION(cpu_timer0_isr, "ramfuncs"); #pragma CODE_SECTION(cpu_timer1_isr, "ramfuncs"); #pragma CODE_SECTION(ecap2_isr, "ramfuncs"); #pragma CODE_SECTION(ADXL_Init, "ramfuncs"); #pragma CODE_SECTION(ADXL_buffer_tick, "ramfuncs"); #pragma CODE_SECTION(Rpm_Display_Init, "ramfuncs"); #pragma CODE_SECTION(FPU_FFT_Tick, "ramfuncs"); #pragma CODE_SECTION(Rpm_Display_Tick, "ramfuncs"); #pragma CODE_SECTION(scia_msg, "ramfuncs"); #pragma CODE_SECTION(spi_init, "ramfuncs"); #pragma CODE_SECTION(spi_fifo_init, "ramfuncs"); #pragma CODE_SECTION(ADXL359_readRegister, "ramfuncs"); #pragma CODE_SECTION(ADXL359_writeRegister, "ramfuncs"); #pragma CODE_SECTION(four_wheeler, "ramfuncs"); // Main // void main(void) { // Step 1. Initialize System Control: InitSysCtrl(); InitSciGpio(); InitECap2Gpio(); InitSpiaGpio(); InitECapture(); InitI2CGpio(); InitGpio_Button(); // // Disable CPU interrupts and clear all CPU interrupt flags DINT; // InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); // // Assign user defined ISR to the PIE vector table // EALLOW; PieVectTable.CLA1_INT1 = &cla1_task1_isr; EDIS; // // Copy over the CLA code(if running in standalone mode from FLASH) // memcpy(&Cla1funcsRunStart, &Cla1funcsLoadStart, (Uint32)&Cla1funcsLoadSize); // // Copy over the CLA math tables(if running in standalone mode from FLASH // and using the CLAMath Library) // memcpy(&Cla1mathTablesRunStart, &Cla1mathTablesLoadStart, (Uint32)&Cla1mathTablesLoadSize); // // Compute all CLA task vectors // EALLOW; Cla1Regs.MVECT1 = (Uint16)((Uint32)&Cla1Task1 -(Uint32)&Cla1Prog_Start); EDIS; // // Step 3 : Mapping CLA tasks // All tasks are enabled and will be started by an ePWM trigger // Map CLA program memory to the CLA and enable software breakpoints // EALLOW; Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = CLA_INT1_NONE; Cla1Regs.MPISRCSEL1.bit.PERINT8SEL = CLA_INT8_NONE; Cla1Regs.MIER.all = 0x00FF; EDIS; // Call Flash Initialization to setup flash waitstates // This function must reside in RAM memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize); //Peripherals Initialization //I2C A initialization I2CA_Init(); // // // Initialize the SPI and SCI FIFO spi_init(); spi_fifo_init(); // Initialize SCI and SCI FIFO scia_echoback_init(); scia_fifo_init(); InitFlash(); //Initialize ADXL Vibration Sensor ADXL_Init(); // // //Initialize LCD Display Rpm_Display_Init(); //Initialize Ring Buffer to store sensor data ADXL_buffer_Init(&ADXL_ringBuffer_X, (Uint8*)test_input, sizeof(test_input)); ADXL_buffer_Init(&ADXL_ringBuffer_Y, (Uint8*)test_inputY, sizeof(test_inputY)); ADXL_buffer_Init(&ADXL_ringBuffer_Z, (Uint8*)test_inputZ, sizeof(test_inputZ)); // Initialize Timers Timer_Init(); // Initialize Timer for Cyclic Interrupt // Initialize GPIO pin for push button to switch between 2 wheeler and 4 Wheeler init_button(pButton); memset(RPM, 0 ,sizeof(RPM)); // // Enable CLA interrupts at the group and subgroup levels // PieCtrlRegs.PIEIER11.all = 0xFFFF; IER |= (M_INT11 ); EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // // Switch the CLA program space to the CLA and enable software forcing // Also switch over CLA data ram 0,1 and 2 // CAUTION: The RAMxCPUE bits can only be enabled by writing to the // register and not the individual bit field. Furthermore, the status of // these bitfields is not reflected in either the watch or register views - // they always read as zeros. This is a known bug and the user is advised // to test CPU accessibilty first before proceeding // EALLOW; Cla1Regs.MMEMCFG.all = 0xffff; //CLA_PROG_ENABLE|CLARAM0_ENABLE|CLARAM1_ENABLE| //CLARAM2_ENABLE|CLA_RAM1CPUE; Cla1Regs.MCTL.bit.IACKE = 1; EDIS; // // Invoke Task(s) // //test_run(); // // Report Results // //test_report(); //Infinite Loop while(1) { FPU_FFT_Tick(); } } // // CLA ISRs // __interrupt void cla1_task1_isr(void) { PieCtrlRegs.PIEACK.bit.ACK11 = 1; } // End of File //
int FPU_FFT_Tick()//this function is called in main to calculate fft { // Locals Uint16 tempRPM=0; float fft_size = RFFT_SIZE; Uint16 RPM_4wheel_X = 0; Uint16 RPM_4wheel_Y = 0; Uint16 RPM_4wheel_Z = 0; static Uint16 j=0; { Uint16 i=0; for(i=0; i < RFFT_SIZE; i++){ IOBuffer[i] = test_input[i]; } } hnd_rfft->FFTSize = RFFT_SIZE; hnd_rfft->FFTStages = RFFT_STAGES; hnd_rfft->InBuf = &IOBuffer[0]; //Input buffer hnd_rfft->OutBuf = &IOBuffer2[0]; //Output buffer hnd_rfft->MagBuf = &RFFTmagBuff[0]; //Magnitude buffer hnd_rfft->CosSinBuf = &RFFTF32Coef[0]; //Twiddle factor buffer RFFT_f32_sincostable(hnd_rfft); //Calculate twiddle factor { Uint16 i=0; for (i=0; i < RFFT_SIZE; i++){ IOBuffer2[i] = 0; //Clean up output buffer } } { Uint16 i=0; for (i=0; i <= RFFT_SIZE/2; i++){ RFFTmagBuff[i] = 0; //Clean up magnitude buffer } } #ifndef USE_CLA RFFT_f32(hnd_rfft); //Calculate real FFT RFFT_f32_mag(hnd_rfft); //Calculate magnitude #else test_run(); #endif // hnd_rfft->PhaseBuf = &RFFTmagBuff[0]; //Use magnitude buffer { Uint16 i=1; for (i =1; i <= RFFT_SIZE/2; ++i) { if ((RFFTmagBuff[i] > maxMagnitude) ) { //&& (IOBuffer2[i] < 20)// && maxMagnitude < 40 maxMagnitude = RFFTmagBuff[i]; peakIndex = i; } } } frequency = (Fs * peakIndex) / (fft_size); if(maxMagnitude<3) { RPM_4wheel_X = 0; } else { RPM_4wheel_X= RPM_Value(frequency,4); } //// RPM in Y AXIS { Uint16 i=0; for(i=0; i < RFFT_SIZE; i++){ IOBuffer[i] = test_inputY[i]; } } hnd_rfft->FFTSize = RFFT_SIZE; hnd_rfft->FFTStages = RFFT_STAGES; hnd_rfft->InBuf = &IOBuffer[0]; //Input buffer hnd_rfft->OutBuf = &IOBuffer2[0]; //Output buffer hnd_rfft->MagBuf = &RFFTmagBuff[0]; //Magnitude buffer hnd_rfft->CosSinBuf = &RFFTF32Coef[0]; //Twiddle factor buffer RFFT_f32_sincostable(hnd_rfft); //Calculate twiddle factor { Uint16 i=0; for (i=0; i < RFFT_SIZE; i++){ IOBuffer2[i] = 0; //Clean up output buffer } } { Uint16 i=0; for (i=0; i <= RFFT_SIZE/2; i++){ RFFTmagBuff[i] = 0; //Clean up magnitude buffer } } #ifndef USE_CLA RFFT_f32(hnd_rfft); //Calculate real FFT RFFT_f32_mag(hnd_rfft); //Calculate magnitude #else test_run(); #endif // hnd_rfft->PhaseBuf = &RFFTmagBuff[0]; //Use magnitude buffer { Uint16 i=1; for (i =1; i <= RFFT_SIZE/2; ++i) { if ((RFFTmagBuff[i] > maxMagnitude) ) { maxMagnitude = RFFTmagBuff[i]; peakIndex = i; } } } frequency = (Fs * peakIndex) / (fft_size); if(maxMagnitude<3) { RPM_4wheel_Y = 0; } else { RPM_4wheel_Y= RPM_Value(frequency,4); } // RPM in Z AXIS { Uint16 i=0; for(i=0; i < RFFT_SIZE; i++){ IOBuffer[i] = test_inputZ[i]; } } hnd_rfft->FFTSize = RFFT_SIZE; hnd_rfft->FFTStages = RFFT_STAGES; hnd_rfft->InBuf = &IOBuffer[0]; //Input buffer hnd_rfft->OutBuf = &IOBuffer2[0]; //Output buffer hnd_rfft->MagBuf = &RFFTmagBuff[0]; //Magnitude buffer hnd_rfft->CosSinBuf = &RFFTF32Coef[0]; //Twiddle factor buffer RFFT_f32_sincostable(hnd_rfft); //Calculate twiddle factor { Uint16 i=0; for (i=0; i < RFFT_SIZE; i++){ IOBuffer2[i] = 0; //Clean up output buffer } } { Uint16 i=0; for (i=0; i <= RFFT_SIZE/2; i++){ RFFTmagBuff[i] = 0; //Clean up magnitude buffer } } #ifndef USE_CLA RFFT_f32(hnd_rfft); //Calculate real FFT RFFT_f32_mag(hnd_rfft); //Calculate magnitude #else test_run(); #endif // hnd_rfft->PhaseBuf = &RFFTmagBuff[0]; //Use magnitude buffer { Uint16 i=1; for (i =1; i <= RFFT_SIZE/2; ++i) { if ((RFFTmagBuff[i] > maxMagnitude) ) { //&& (IOBuffer2[i] < 20)// && maxMagnitude < 40 maxMagnitude = RFFTmagBuff[i]; peakIndex = i; } } } frequency = (Fs * peakIndex) / (fft_size); if(maxMagnitude<3) { RPM_4wheel_Z = 0; } else { RPM_4wheel_Z = RPM_Value(frequency,4); } if(((RPM_4wheel_X != RPM_4wheel_Y) && (RPM_4wheel_Y != RPM_4wheel_Z))) { return 1; } else if((RPM_4wheel_X != RPM_4wheel_Y) || (RPM_4wheel_Y != RPM_4wheel_Z) || (RPM_4wheel_X != RPM_4wheel_Y)) { if((RPM_4wheel_X == RPM_4wheel_Y)) { RPM_4wheel_Z = RPM_4wheel_Y; } else if((RPM_4wheel_Z == RPM_4wheel_Y)) { RPM_4wheel_X = RPM_4wheel_Y; } else if((RPM_4wheel_Z == RPM_4wheel_X)) { RPM_4wheel_Y = RPM_4wheel_X; } RPM[j] =RPM_4wheel_Z;// (RPM_4wheel_X + RPM_4wheel_Y + RPM_4wheel_Z)/3; } else { RPM[j] = RPM_4wheel_Z;//(RPM_4wheel_X + RPM_4wheel_Y + RPM_4wheel_Z)/3; } if((j >= 2) && ((RPM[j] - RPM[j-1]) > 30) && ((RPM[j]-RPM[j-2]) < 20)) { RPM[j-1] = RPM[j]; } if((j<2 && (RPM[1] - RPM[0])> 30) && ((RPM[1] - RPM[4])< 20)) { RPM[0] = RPM[1]; } j++; // if(j>4) {j=0;} { Uint16 i=0; for(i=0;i<5;i++) { tempRPM += RPM[i]; } tempRPM = tempRPM/5; } RPM_4wheel =tempRPM; maxMagnitude = 0; TTL_PULSE_FLAG = true; // End of test // done(); // Execution never reaches this point return 1; }
//########################################################################### // // TITLE: divide.cla // // Description: Divide using Newton Raphson Approximation // //########################################################################### // $TI Release: $ // $Release Date: $ // $Copyright: // Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //########################################################################### // // Included Files // #include "DSP28x_Project.h" // // Include the test header file whose name is based on the test name // which is defined by the macro TEST on the command line // #include "divide_shared.h" #include "cla_cfft.h" // // Cla1Task1 - Divide using a newton raphson approximation // __interrupt void Cla1Task1 (void) { Res = Num/Den; __mdebugstop(); CLA_CFFT_run256Pt(); // "Unpack" the 512 point complex spectrum to get half the // spectrum of the original (real only) data. The user may // use the conjugate symmetry property of the FFT of real // signals to determine the latter half of the spectrum __mdebugstop(); CLA_CFFT_unpack256Pt(); } // // CLA ISRs // __interrupt void Cla1Task2 (void) { } __interrupt void Cla1Task3 (void) { } __interrupt void Cla1Task4 (void) { } __interrupt void Cla1Task5 (void) { } __interrupt void Cla1Task6 (void) { } __interrupt void Cla1Task7 (void) { } __interrupt void Cla1Task8 (void) { } // // End of File //
尊敬的 Sanjay:
我看不到您的代码有任何直接问题、但如果我发现有任何问题、我会在下周通知您。 不过、在咨询另一位 CLA 专家之后、我建议切换到使用较新的器件、如 F2837xD。 在 CLA 数学库中有硬编码 FFT 示例、并且该器件中有用于 CLA 的 ROM 专用部分。 库示例可在[C2000ware install]\libraries\math\CLAmath\c28\examples 中找到。 请告诉我、这对您而言是否是更好的选择。
此致、
德拉尼
大家好、Delaney、我已经按照您介绍的示例进行操作。 我有时会获得 FFT 固定值、有时会获得随机值。 我很困惑、在哪里可以放置以下部分:
FPUmathTables :> FPUTABLES , PAGE = 0, TYPE = NoLoad
FPUfftTables :> RAML456, page = 1//added
IOBuffer:>CLARAM2、align=2048、PAGE = 1
IOBuffer2:> CLARAM2、align=512、page = 1
MagnitudeBuffer :> RAML456, page = 1
TwiddleBuffer :> RAML456, page = 1
至于现在、我已经将 IOBuffer 段放在 CLARAM2中、因为这些缓冲器应在 C28和 CLA 之间共享。 我说对了、如果其他缓冲区也存在于 IOBuffers 等共享 RAM 中、我应该将诸如幅度和 Twiddle 因素等缓冲区放在何处、并告知我在 cmd 文件或我在较早文章中上传的代码中是否遗漏了内容。 我不知道该怎么做。 此外、我看到一些网站建议对齐这些缓冲区、没错、目前我的 IOBuffer 的大小为256个浮点值、因为我计算的 FFT 为256个点(256个浮点值)。 "那怎么行?
尊敬的 Sanjay:
这位专家目前正在休假。 请允许在她明天返回之前延迟一些答复。
谢谢。此致、
艾里森
尊敬的 Sanjay:
很抱歉耽误你的时间。 RAML456使用什么存储器地址? 我在您发送的上一个链接器命令文件中看不到它。 请记住、在 F2806x 上、CLA 无法访问 LSRAM4 (也没有 LSRAM5或 LSRAM6)。 如果你正在将任何内容映射到这些存储器区域、CLA 无法访问它们、这可能是你遇到的问题的原因。
通常、应匹配 C2000ware 中针对 align 和 page 属性提供的链接器命令文件中包含的内容。 例如、如果这些存储器段在此处对齐、则它们应在文件中对齐。
同样、我建议切换到较新的器件、其中这些表已硬编码到 ROM 中、并且有一些示例来执行您要寻找的操作、这由您决定。
此致、
德拉尼