AURIX™ TC4x CDSP信号处理器用户自定义软件开发和集成详解
引言
AURIX™ TC4x CDSP(Converter Digital Signal Processor)是AURIX™ TC4x 的信号处理器模块,位于ADC模块中,主要用于ADC信号的后处理。
CDSP 可以运行用户自定义的算法和功能,高效处理ADC 信号,并把处理结果给到TriCore™。
本文介绍CDSP 的用户自定义软件开发环境、CDSP 软件集成到TC499PP TriCore™工程。
CDSP 结构和运行机制
CDSP 包括一个 Synopsys DesignWare® ARC® EM5D(ARC) DSP 内核,3 KB 指令存储器 (ICCM)、3 KB 数据存储器 (DCCM) 。不同型号AURIX™ TC4x 芯片有不同数量的CDSP,本文用到的TC499PP 有12个CDSP。

Figure 1. CDSP architecture
CDSP 以 f_ADC频率运行(160MHz), CDSP 作为一个外设,由TriCore™控制其复位、运行等。

Figure 2. CDSP input and output interface
CDSP 可以处理来自DSADC (Δ-Σ ADC)、EXMOD (外部调制器)、TMADC (分时复用 ADC)、CARMAG (载波调制器) 或GP (通用) 寄存器的信号。
CDSP 处理完成,产生的结果存放在结果寄存器RES0,RES1和RES2或DCCM,并且RES0 有一个深度为4的FIFO 用于结果缓存。
CDSP 的基本的运行机制为:外部的触发信号(比如输入的寄存器结果值更新)触发唤醒CDSP 工作,CDSP 计算完成,产生CDSP 结果,CDSP 调用一条睡眠指令进入睡眠。由于有CDSP 结果产生,可以将其配置为TriCore™ 中断,则可以实现TriCore™拿到CDSP 结果值进行后续运算。
CDSP休眠和唤醒
一般情况下,CDSP 启动运行后 ,CDSP 内核会交替处于休眠和唤醒状态,以处理输入采样。
在配置好输入信号源后(每次只能配置一个输入信号用于唤醒),当CDSP 内核接收到新的输入采样时,就被唤醒并转换到唤醒状态,以处理新的输入采样,处理完成后,生成结果到结果寄存器,然后再进入休眠。

Figure 3. CDSP sleep and wake-up
CDSP_DSPa_DSPCFG 寄存器中的 INPSEL 位选择哪个输入采样到达会唤醒 CDSP 内核。例如,如果将 DSADC0 配置为 CDSP 内核的唤醒源,那么每个新的DSADC0 输入采样都将唤醒 CDSP 内核。一旦 CDSP 内核被唤醒,它就会开始执行加载的滤波器链 (FC),直到产生结果到结果寄存器,CDSP 内核便进入休眠状态。
新输入采样的到来会再次唤醒 CDSP 内核,并重复上述过程。如果在 CDSP 内核仍在处理当前样本时(CDSP 内核仍处于唤醒状态),有新样本到来,则会产生唤醒错误。所以,用户使用时需要注意选择的滤波器链对一个输入样本的处理时间必须小于两个连续输入样本之间的时间间隔。
CDSP 启动和运行
CDSP 的执行主要分为三个阶段:
1.启动
在启动阶段,CDSP 内核处于停止状态,CDSP SW 代码被复制到 ICCM 中,并将CDSP SW 的配置参数复制到DCCM 存储器中。
2.运行时:初始化
一旦 CDSP 内核从停止状态转换到运行状态,CDSP SW 就开始执行。CDSP SW 执行的第一阶段称为 "初始化",只执行一次。
在这一阶段,CDSP 滤波器链的所有配置参数都被初始化,CDSP SW 准备好处理输入采样。在这一阶段结束时,CDSP 内核转入休眠状态,等待输入采样到达配置的输入源。如果存在配置参数无效,CDSP 将进入错误状态(死循环)。
3.运行时:主循环
每当有新的采样到达配置的 CDSP 输入源,就会触发唤醒事件,将CDSP 内核从休眠状态唤醒。唤醒后,CDSP 内核开始执行滤波器链,从而对输入信号进行处理。
下图展示了一个通用 FC (Filter Chain)的 CDSP SW 主循环执行序列,用于处理单个输入采样。

Figure 4. CDSP SW execution time
如上图所示, CDSP 内核在唤醒 (t_wu)、读取输入采样 (t_Rd)、写入输出采样 (t_Wr) 和过渡到休眠状态 (t_t-slp) 的时间消耗都是固定数量的时钟周期 ,与 CDSP SW 配置无关,而滤波器块执行时间(t_FB)取决于滤波器链的配置。
例如,在中值滤波功能中,滤波执行时间(t_FB)会随着中值滤波器滤波器长度的增加而增加。用户需要确保一个输入采样的总执行时间(t_TOTAL)不超过 CDSP SW 两个连续输入采样之间的持续时间,否则会进入错误状态。
CDSP SW 对单个输入采样运算的总执行时间公式如下:
t_TOTAL = t_wu + t_Rd + t_FB + t_Wr + t_t-slp
CDSP 执行完成滤波链路并将输出结果写入输出寄存器后,DSP 内核将转入睡眠模式,直到下一个唤醒信号到来。
CDSP 用户自定义软件开发环境
CDSP 的自定义开发需要基于一个Framwork 工程,这个Framwork 工程需要找英飞凌申请提供。
这个CDSP Framework 工程基于ADS-Limited 开发,基本结构如下:
Figure 5. CDSP Framework project
这个CDSP Framework 包含了:
README.md,简单介绍了CDSP Framework 是做什么的(包含了image文件夹);
用户源文件和链接文件(包含了 include文件夹),用户算法在main_proj.c 中编写和调度;
Tools 文件夹,里面是后处理工具,把hex 文件转成ICCM.h和DCCM.h,用于后续集成;
Metaware 文件夹,编译后生成的文件,其中ICCM.h 和DCCM.h 是要拷贝出来集成到TriCore™工程的文件;
CDSP Framework 展开如下:

Figure 6. CDSP Framework project details
基于Framework工程开发用户软件
用户软件开发和一般的C语言程序开发相同,这里介绍一个求移动平均值的算法案例。
main_proj.c解析:

Figure 7. CDSP Framework main_proj.c main
main函数是CDSP 的用户程序入口,用户程序在这里执行。
dsp_init_arc_core();
初始化CDSP 内核;
pGenPurpReg0 = Cdsp_Mapping_GenPurpReg[cdspInterface.generalPurposeReg];
初始化指针pGenPurpReg0,指向CDSP GP 寄存器,作为CDSP 的输入信号;
pDsadcReg0 = Cdsp_Mapping_DsadcResReg[0];
初始化指针pDsadcReg0,指向DSADC0 通道的结果寄存器,作为CDSP 的输入信号;
pCdspRes0 = Cdsp_Mapping_CdspResReg[0];
pCdspRes1 = Cdsp_Mapping_CdspResReg[1];
pCdspRes2 = Cdsp_Mapping_CdspResReg[2];
初始化pCdspRes0,pCdspRes1,pCdspRes2 指向CDSP 的结果寄存器Res0,Res1,Res2
dsp_wait_new_sample();进入睡眠,等待下一个结果触发信号。
Sum = 0;
average[counter] = *pDsadcReg0;
counter++;
if(counter>=10)
counter = 0;
for(int i = 0; i<10;i++)
Sum = Sum + average[i];
*pCdspRes0 = Sum/10;
计算最近的10个DSADC 的采样值的平均数,输出给Res0;
*pCdspRes1 = *pDsadcReg0 +100;
计算当前DSADC 的值,加上100,赋值给Res1;
Temp = *pDsadcReg0+200;
*pCdspRes2 = (int16_T)Temp;
计算当前DSADC 的值,加上200,赋值给Res2;
以上实现了,DSADC0有新的采样值,则唤醒CDSP,在CDSP中对最近的10个DSADC 的值进行求平均,输出到CDSP 的Res0。
CDSP 的Res1 和Res2 在此处是把当前的DSADC0 的采样值+100和+200,作为对比。
算法开发完之后,需要进行编译链接,用到metaware 编译器,设置如下。
打开项目Porperties,在C/C++ Build 里面的Setting里,设置MetaWare Installation Path,输入Metaware 安装路径。

Figure 8. CDSP Framework Build Setting with Metaware
点击编译,编译过程中会生成elf 文件,并生成hex 文件,然后会调用tools 文件夹下的工具,生成DCCM.h 和ICCM.h。

编译结束,在Metaware 文件夹下生成DCCM.h 和ICCM.h.
DCCM.h 如下,有一个DCCM 数组,大小是DCCMSize=48;
需要注意DCCMAddress = 0x00008050,这个是对0x00008000 有0x50 的偏移,在后续集成的时候需要加上这个偏移地址。

ICCM.h如下,有一个ICCM 数组,大小是ICCMSize=300;
ICCMAddress = 0x00000000,无偏移。

TriCore™工程中集成用户自定义软件
用户通过ADS_limited 软件,左下角点击import AURIX™ Project

找一个CDSP 的工程,这里以iLLD_TC499N_ADS_DSADC_CDSP_FC0_Filtering_1 作为模板,把上一节用户自定义的算法功能集成进来。

Figure 9. import AURIX Development Studio Example
1. 把上一节生成的DCCM.h 和ICCM.h 拷贝到这个工程里
2.在CDSP_Filtering.c 中,包含ICCM.h和DCCM.h
#include"ICCM.h"
#include"DCCM.h"
定义一个数组,用于访问CDSP0 的Res0,Res1和Res2。
volatileuint32 gCDSP_res[3] = {0};
在voidCDSP_ResultHandling(void)中读取CDSP0的Res0,Res1和Res2.
gCDSP_res[0] = ADC_CDSP_DSP0_RES0.U;
gCDSP_res[1] = ADC_CDSP_DSP0_RES1.U;
gCDSP_res[2] = ADC_CDSP_DSP0_RES2.U;
把生成的ICCM.h 和DCCM.h 的数组放到memoryCfg 中,用于拷贝到CDSP 的ICCM和DCCM 中,把
IfxAdc_Cdsp_MemoryConfig memoryCfg =
{
(void*)&cdspFc0IccmImage,
(void*)&g_Fc0_Cutoff_0k4_Stop_1k5,
(uint16)cdspFc0IccmImageSize,
(uint16)sizeof(UserConfig_EntireType)
};
改为
IfxAdc_Cdsp_MemoryConfig memoryCfg =
{
(void*)&ICCM,
(void*)&DCCM,
(uint16)ICCMSize,
(uint16)DCCMSize
};
这个例子中,不需要额外配置参数,注释掉
filterCfgPtr= (UserConfig_EntireType*)IFXADC_CDSP_GETDCCM_ADDRESS(coreConfig.coreId);
filterCfgPtr->Common.InputAddress= (0x9010U + 4U * coreConfig.inputSel);
为
//filterCfgPtr= (UserConfig_EntireType*)IFXADC_CDSP_GETDCCM_ADDRESS(coreConfig.coreId);
//filterCfgPtr->Common.InputAddress= (0x9010U + 4U * coreConfig.inputSel);
3. 在DSADC_Setup.c 中,做一个求10个数据的移动平均值,把
float32 g_ResultSignalA;
改为
float32 g_ResultSignalA[10];
float32 ave_g_ResultSignalA;
uint32 cntDsadc = 0;
在void DSADC_serviceIntChannelA(void)中,定义一个CPU 处理DSADC 的数据,实现求移动平均数功能,把
/* This interrupt handler routine is invoked by CDSP Result event */
void DSADC_serviceIntChannelA(void)
{
sint16 res;
res=MODULE_ADC.DSADC.IN[DSADC_CHANNEL_A].RESM.B.RESULTLO+OFFSETDRAWING_DSADC;
g_ResultSignalA= 5.0f * res / 25000.0f;
}
改为
/* This interrupt handler routine is invoked by CDSP Result event */
void DSADC_serviceIntChannelA(void)
{
sint16 res;
res=MODULE_ADC.DSADC.IN[DSADC_CHANNEL_A].RESM.B.RESULTLO + OFFSETDRAWING_DSADC;
// g_ResultSignalA= 5.0f * res / 25000.0f;
g_ResultSignalA[cntDsadc] = res;
cntDsadc++;
if(cntDsadc==10)
cntDsadc =0;
ave_g_ResultSignalA = 0;
for(uint32 icnt = 0;icnt < 10; icnt++)
{
ave_g_ResultSignalA = ave_g_ResultSignalA + g_ResultSignalA[icnt];
}
ave_g_ResultSignalA = ave_g_ResultSignalA/10;
}
4. 在DSADC_Setup.h 中把
IFX_EXTERN float32 g_ResultSignalA;;
改为
IFX_EXTERN float32 g_ResultSignalA[10];
5. 在IfxAdc_Cdsp.c 中把
/* Load configuration in DCCM memory */
if (memPtr->dataMemSrcAddrPtr != NULL_PTR)
{
IfxAdc_loadCdspMemory(memPtr->dataMemSrcAddrPtr, (void*)IFXADC_CDSP_GETDCCM_ADDRESS(coreId), memPtr->dataSize);
}
改为
/* Load configuration in DCCM memory */
if (memPtr->dataMemSrcAddrPtr != NULL_PTR)
{
IfxAdc_loadCdspMemory(memPtr->dataMemSrcAddrPtr, (void*)(IFXADC_CDSP_GETDCCM_ADDRESS(coreId)+0x50), memPtr->dataSize);
}
这样就把DCCM.h 的偏移地址加上了。
然后编译iLLD_TC499N_ADS_DSADC_CDSP_FC0_Filtering_1 工程。
下载运行,查看运行结果。

Figure 10. Result of Customized CDSP software
从结果看,在CDSP0_RES0 上的移动平均数和在TriCore™ 中通过DSADC 原始数据求得的移动平均数一致,说明CDSP 正确实现了求移动平均数。(小数点是因为定义的数组类型不同)。
CDSP0_RES1 和CDSP0_RES2 的结果也正常。
综上,实现了用户自定义CDSP 软件集成到TC499PP 工程,并且CDSP 运行结果正确无误。
总结
本文介绍了如何使用CDSP Framework 进行用户自定义算法开发,并将开发好的CDSP 算法集成到TriCore™ 工程中,实现CDSP 的灵活使用。
CDSP 的有效使用可以很好的处理ADC 数据,能较大程度降低TriCore™ 的负荷,对于提升系统的实时性有较大帮助。
欢迎广大用户去探索CDSP 用法,实现更高的系统实时性,更丰富的功能。
REFERENCES
[1] Infineon-AURIX-TC49x-N-UM-v01_01-EN_US.pdf
[2] AURIX_TC4x_CDSP_PROD_V0.5.1-MR1_UserManual.pdf
[3] https://mp.weixin.qq.com/s/c1bjycblTr1oEyvPQWjQcgaccessed on 20.11.2024 14:20 CST
[4] https://mp.weixin.qq.com/s/sOHPrcFL98Gq2T_utshMnAaccessed on 18.11.2025 14:50 CST
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码
