久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 模擬技術 > 設計應用 > AURIX? TC4x CDSP信號處理器用戶自定義軟件開發和集成詳解

AURIX? TC4x CDSP信號處理器用戶自定義軟件開發和集成詳解

作者: 時間:2026-04-22 來源:英飛凌 收藏

引言

? TC4x CDSP(Converter Digital Signal Processor)是? TC4x 的信號處理器模塊,位于ADC模塊中,主要用于ADC信號的后處理。

CDSP 可以運行用戶自定義的算法和功能,高效處理ADC 信號,并把處理結果給到TriCore?。

本文介紹CDSP 的用戶自定義軟件開發環境、CDSP 軟件集成到TC499PP TriCore?工程。

CDSP 結構和運行機制

CDSP 包括一個 Synopsys DesignWare? ARC? EM5D(ARC) DSP 內核,3 KB 指令存儲器 (ICCM)、3 KB 數據存儲器 (DCCM) 。不同型號? 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


    評論


    相關推薦

    技術專區

    關閉