狠狠做深爱婷婷久久一区,欧美日韩国内,久久麻豆精品传媒,久久久一区一区二区,色鬼伦理片,99视频精品久久,久久精品国产久久久久久,久久久伦理电影一区二,磁力天堂河北彩花

新聞中心

EEPW首頁 > 模擬技術(shù) > 設(shè)計應(yīng)用 > AURIX? TC4x CDSP信號處理器用戶自定義軟件開發(fā)和集成詳解

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

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

引言

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

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

本文介紹CDSP 的用戶自定義軟件開發(fā)環(huán)境、CDSP 軟件集成到TC499PP TriCore?工程。

CDSP 結(jié)構(gòu)和運行機制

CDSP 包括一個 Synopsys DesignWare? ARC? EM5D(ARC) DSP 內(nèi)核,3 KB 指令存儲器 (ICCM)、3 KB 數(shù)據(jù)存儲器 (DCCM) 。不同型號? TC4x 芯片有不同數(shù)量的CDSP,本文用到的TC499PP 有12個CDSP。

圖片

Figure 1. CDSP architecture

CDSP 以 f_ADC頻率運行(160MHz), CDSP 作為一個外設(shè),由TriCore?控制其復(fù)位、運行等。

圖片

Figure 2. CDSP input and output interface

CDSP 可以處理來自DSADC (Δ-Σ ADC)、EXMOD (外部調(diào)制器)、TMADC (分時復(fù)用 ADC)、CARMAG (載波調(diào)制器) 或GP (通用) 寄存器的信號。

CDSP 處理完成,產(chǎn)生的結(jié)果存放在結(jié)果寄存器RES0,RES1和RES2或DCCM,并且RES0 有一個深度為4的FIFO 用于結(jié)果緩存。

CDSP 的基本的運行機制為:外部的觸發(fā)信號(比如輸入的寄存器結(jié)果值更新)觸發(fā)喚醒CDSP 工作,CDSP 計算完成,產(chǎn)生CDSP 結(jié)果,CDSP 調(diào)用一條睡眠指令進入睡眠。由于有CDSP 結(jié)果產(chǎn)生,可以將其配置為TriCore? 中斷,則可以實現(xiàn)TriCore?拿到CDSP 結(jié)果值進行后續(xù)運算。

CDSP休眠和喚醒

一般情況下,CDSP 啟動運行后 ,CDSP 內(nèi)核會交替處于休眠和喚醒狀態(tài),以處理輸入采樣。


在配置好輸入信號源后(每次只能配置一個輸入信號用于喚醒),當(dāng)CDSP 內(nèi)核接收到新的輸入采樣時,就被喚醒并轉(zhuǎn)換到喚醒狀態(tài),以處理新的輸入采樣,處理完成后,生成結(jié)果到結(jié)果寄存器,然后再進入休眠。

圖片


Figure 3. CDSP sleep and wake-up

CDSP_DSPa_DSPCFG 寄存器中的 INPSEL 位選擇哪個輸入采樣到達會喚醒 CDSP 內(nèi)核。例如,如果將 DSADC0 配置為 CDSP 內(nèi)核的喚醒源,那么每個新的DSADC0 輸入采樣都將喚醒 CDSP 內(nèi)核。一旦 CDSP 內(nèi)核被喚醒,它就會開始執(zhí)行加載的濾波器鏈 (FC),直到產(chǎn)生結(jié)果到結(jié)果寄存器,CDSP 內(nèi)核便進入休眠狀態(tài)。

新輸入采樣的到來會再次喚醒 CDSP 內(nèi)核,并重復(fù)上述過程。如果在 CDSP 內(nèi)核仍在處理當(dāng)前樣本時(CDSP 內(nèi)核仍處于喚醒狀態(tài)),有新樣本到來,則會產(chǎn)生喚醒錯誤。所以,用戶使用時需要注意選擇的濾波器鏈對一個輸入樣本的處理時間必須小于兩個連續(xù)輸入樣本之間的時間間隔。

CDSP 啟動和運行

CDSP 的執(zhí)行主要分為三個階段:

1.啟動

在啟動階段,CDSP 內(nèi)核處于停止?fàn)顟B(tài),CDSP SW 代碼被復(fù)制到 ICCM 中,并將CDSP SW 的配置參數(shù)復(fù)制到DCCM 存儲器中。

2.運行時:初始化

一旦 CDSP 內(nèi)核從停止?fàn)顟B(tài)轉(zhuǎn)換到運行狀態(tài),CDSP SW 就開始執(zhí)行。CDSP SW 執(zhí)行的第一階段稱為 "初始化",只執(zhí)行一次。

在這一階段,CDSP 濾波器鏈的所有配置參數(shù)都被初始化,CDSP SW 準(zhǔn)備好處理輸入采樣。在這一階段結(jié)束時,CDSP 內(nèi)核轉(zhuǎn)入休眠狀態(tài),等待輸入采樣到達配置的輸入源。如果存在配置參數(shù)無效,CDSP 將進入錯誤狀態(tài)(死循環(huán))。

3.運行時:主循環(huán)

每當(dāng)有新的采樣到達配置的 CDSP 輸入源,就會觸發(fā)喚醒事件,將CDSP 內(nèi)核從休眠狀態(tài)喚醒。喚醒后,CDSP 內(nèi)核開始執(zhí)行濾波器鏈,從而對輸入信號進行處理。

下圖展示了一個通用 FC (Filter Chain)的 CDSP SW 主循環(huán)執(zhí)行序列,用于處理單個輸入采樣。


圖片

Figure 4. CDSP SW execution time

如上圖所示, CDSP 內(nèi)核在喚醒 (t_wu)、讀取輸入采樣 (t_Rd)、寫入輸出采樣 (t_Wr) 和過渡到休眠狀態(tài) (t_t-slp) 的時間消耗都是固定數(shù)量的時鐘周期 ,與 CDSP SW 配置無關(guān),而濾波器塊執(zhí)行時間(t_FB)取決于濾波器鏈的配置。

例如,在中值濾波功能中,濾波執(zhí)行時間(t_FB)會隨著中值濾波器濾波器長度的增加而增加。用戶需要確保一個輸入采樣的總執(zhí)行時間(t_TOTAL)不超過 CDSP SW 兩個連續(xù)輸入采樣之間的持續(xù)時間,否則會進入錯誤狀態(tài)。

CDSP SW 對單個輸入采樣運算的總執(zhí)行時間公式如下:

t_TOTAL = t_wu + t_Rd + t_FB + t_Wr + t_t-slp

CDSP 執(zhí)行完成濾波鏈路并將輸出結(jié)果寫入輸出寄存器后,DSP 內(nèi)核將轉(zhuǎn)入睡眠模式,直到下一個喚醒信號到來。

CDSP 用戶自定義軟件開發(fā)環(huán)境

CDSP 的自定義開發(fā)需要基于一個Framwork 工程,這個Framwork 工程需要找申請?zhí)峁?/p>

這個CDSP Framework 工程基于ADS-Limited 開發(fā),基本結(jié)構(gòu)如下:圖片

Figure 5. CDSP Framework project

這個CDSP Framework 包含了:

  • README.md,簡單介紹了CDSP Framework 是做什么的(包含了image文件夾);

  • 用戶源文件和鏈接文件(包含了 include文件夾),用戶算法在main_proj.c 中編寫和調(diào)度;

  • Tools 文件夾,里面是后處理工具,把hex 文件轉(zhuǎn)成ICCM.h和DCCM.h,用于后續(xù)集成;

  • Metaware 文件夾,編譯后生成的文件,其中ICCM.h 和DCCM.h 是要拷貝出來集成到TriCore?工程的文件;

    CDSP Framework 展開如下:

    圖片

    Figure 6. CDSP Framework project details

    基于Framework工程開發(fā)用戶軟件

    用戶軟件開發(fā)和一般的C語言程序開發(fā)相同,這里介紹一個求移動平均值的算法案例。

    main_proj.c解析:

    圖片

    Figure 7. CDSP Framework main_proj.c main

    main函數(shù)是CDSP 的用戶程序入口,用戶程序在這里執(zhí)行。

    dsp_init_arc_core();

    初始化CDSP 內(nèi)核;

    pGenPurpReg0 = Cdsp_Mapping_GenPurpReg[cdspInterface.generalPurposeReg];

    初始化指針pGenPurpReg0,指向CDSP GP 寄存器,作為CDSP 的輸入信號;

    pDsadcReg0 = Cdsp_Mapping_DsadcResReg[0];   

    初始化指針pDsadcReg0,指向DSADC0 通道的結(jié)果寄存器,作為CDSP 的輸入信號;

    pCdspRes0 = Cdsp_Mapping_CdspResReg[0];

    pCdspRes1 = Cdsp_Mapping_CdspResReg[1];

    pCdspRes2 = Cdsp_Mapping_CdspResReg[2];

    初始化pCdspRes0,pCdspRes1,pCdspRes2 指向CDSP 的結(jié)果寄存器Res0,Res1,Res2

    dsp_wait_new_sample();進入睡眠,等待下一個結(jié)果觸發(fā)信號。

    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 的采樣值的平均數(shù),輸出給Res0;

    *pCdspRes1 = *pDsadcReg0 +100;

    計算當(dāng)前DSADC 的值,加上100,賦值給Res1;

    Temp = *pDsadcReg0+200;

    *pCdspRes2 = (int16_T)Temp;

    計算當(dāng)前DSADC 的值,加上200,賦值給Res2;

    以上實現(xiàn)了,DSADC0有新的采樣值,則喚醒CDSP,在CDSP中對最近的10個DSADC 的值進行求平均,輸出到CDSP 的Res0。

    CDSP 的Res1 和Res2 在此處是把當(dāng)前的DSADC0 的采樣值+100和+200,作為對比。

    算法開發(fā)完之后,需要進行編譯鏈接,用到metaware 編譯器,設(shè)置如下。

    打開項目Porperties,在C/C++ Build 里面的Setting里,設(shè)置MetaWare Installation Path,輸入Metaware 安裝路徑。

    圖片

    Figure 8. CDSP Framework Build Setting with Metaware

    點擊編譯,編譯過程中會生成elf 文件,并生成hex 文件,然后會調(diào)用tools 文件夾下的工具,生成DCCM.h 和ICCM.h。

    圖片

    編譯結(jié)束,在Metaware 文件夾下生成DCCM.h 和ICCM.h.

    DCCM.h 如下,有一個DCCM 數(shù)組,大小是DCCMSize=48;

    需要注意DCCMAddress = 0x00008050,這個是對0x00008000 有0x50 的偏移,在后續(xù)集成的時候需要加上這個偏移地址。

    圖片

    ICCM.h如下,有一個ICCM 數(shù)組,大小是ICCMSize=300;

    ICCMAddress = 0x00000000,無偏移。

    圖片

    TriCore?工程中集成用戶自定義軟件

    用戶通過ADS_limited 軟件,左下角點擊import AURIX? Project

    圖片

    找一個CDSP 的工程,這里以iLLD_TC499N_ADS_DSADC_CDSP_FC0_Filtering_1 作為模板,把上一節(jié)用戶自定義的算法功能集成進來。

    圖片


    Figure 9. import AURIX Development Studio Example

    1. 把上一節(jié)生成的DCCM.h 和ICCM.h 拷貝到這個工程里

    2.在CDSP_Filtering.c 中,包含ICCM.h和DCCM.h

    #include"ICCM.h"

    #include"DCCM.h"

    定義一個數(shù)組,用于訪問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 的數(shù)組放到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

     };

    這個例子中,不需要額外配置參數(shù),注釋掉

    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個數(shù)據(jù)的移動平均值,把

    float32 g_ResultSignalA;

    改為

    float32 g_ResultSignalA[10];
    float32 ave_g_ResultSignalA;
    uint32 cntDsadc = 0;

    在void DSADC_serviceIntChannelA(void)中,定義一個CPU 處理DSADC 的數(shù)據(jù),實現(xiàn)求移動平均數(shù)功能,把

    /* 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 工程。

    下載運行,查看運行結(jié)果。

    圖片


    Figure 10. Result of Customized CDSP software

    從結(jié)果看,在CDSP0_RES0 上的移動平均數(shù)和在TriCore? 中通過DSADC 原始數(shù)據(jù)求得的移動平均數(shù)一致,說明CDSP 正確實現(xiàn)了求移動平均數(shù)。(小數(shù)點是因為定義的數(shù)組類型不同)。

    CDSP0_RES1 和CDSP0_RES2 的結(jié)果也正常。

    綜上,實現(xiàn)了用戶自定義CDSP 軟件集成到TC499PP 工程,并且CDSP 運行結(jié)果正確無誤。

    總結(jié)

    本文介紹了如何使用CDSP Framework 進行用戶自定義算法開發(fā),并將開發(fā)好的CDSP 算法集成到TriCore? 工程中,實現(xiàn)CDSP 的靈活使用。

    CDSP 的有效使用可以很好的處理ADC 數(shù)據(jù),能較大程度降低TriCore? 的負(fù)荷,對于提升系統(tǒng)的實時性有較大幫助。

    歡迎廣大用戶去探索CDSP 用法,實現(xiàn)更高的系統(tǒng)實時性,更豐富的功能。

    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


    關(guān)鍵詞: 英飛凌 AURIX CDSP信號處理器

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    陕西省| 滦南县| 昭通市| 化州市| 杨浦区| 东兴市| 左贡县| 南宁市| 十堰市| 信阳市| 松江区| 汤阴县| 镇巴县| 遂昌县| 全椒县| 南汇区| 板桥市| 鄂州市| 洪洞县| 新和县| 修文县| 汾阳市| 类乌齐县| 江达县| 永泰县| 新宁县| 清原| 石景山区| 黎川县| 唐河县| 凤冈县| 尼玛县| 钟祥市| 论坛| 大渡口区| 辽宁省| 古蔺县| 黄大仙区| 保定市| 拜城县| 荣成市|