0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一種可以快速將CFG文件參數(shù)固化到應(yīng)用代碼中的實現(xiàn)方式

德州儀器 ? 來源:德州儀器 ? 作者:德州儀器 ? 2022-02-15 13:36 ? 次閱讀

TI mmWave sensor是高集成度的毫米波雷達(dá)傳感器SOC,在開發(fā)過程中,SDK及TI DEMO均使用靈活的UART接口發(fā)送CLI命令進(jìn)行射頻參數(shù)配置及相關(guān)算法參數(shù)的配置。對于量產(chǎn)及或者有固化參數(shù)的產(chǎn)品而言,將參數(shù)固化在代碼中會是一項明確的需求。本文介紹一種可以快速將CFG文件參數(shù)固化到應(yīng)用代碼中的實現(xiàn)方式,同時支持原有串口的CLI配置,無需修改SDK驅(qū)動層代碼,可方便快捷的完成參數(shù)的固化。

本文的測試環(huán)境如下:

  • 此方法適用器件型號:I/AWR1443, I/AWR1642, I/AWR1843, I/AWR6843
  • 本文測試軟件版本:mmWave SDK 3.5.0.4
  • 本文測試硬件平臺:IWR6843ISK EVM

1. 運(yùn)行SDK mmWave sensor demo的流程及對外接口說明

在現(xiàn)有的TI mmWave SDK及TOOLBOX相關(guān)的示例代碼中,均使用兩個串口進(jìn)行參數(shù)的配置及數(shù)據(jù)的獲取,EVM板載的TM4C MCU是一個板載XDS110仿真器,仿真器自帶兩路串口,可以直接完成SDK DEMO中的參數(shù)配置及數(shù)據(jù)輸出。在客制化產(chǎn)品中,可以使用外部的2個USB<->UART橋接線纜進(jìn)行調(diào)試,兩個串口的默認(rèn)使用情況如下:

一種可以快速將CFG文件參數(shù)固化到應(yīng)用代碼中的實現(xiàn)方式

配置命令口:Application/User Uart: Configuration port 115200bps: UART_RX/TX port <-> USB-UART cable <-> PC

數(shù)據(jù)口:Auxilliary Data Port: Data port 921600bps: MSS_LOGGER-> USB-UART cable -> PC

mmWave sensor的啟動配置流程

2. 修改CLI參數(shù)以調(diào)整mmWave sensor 的配置參數(shù)

以SDK內(nèi)的Out of Box demo為例,將BIN文件(比如:.\mmwave_sdk_\packages\ti\demo\xwr68xx\mmw\xwr68xx_mmw_demo.bin)燒寫至板卡后,啟動后,需要通過GUI下發(fā)CFG配置(比如:.\mmwave_sdk_\packages\ti\demo\xwr68xx\mmw\profiles\profile_2d.cfg),成功將配置加載后,IWR6843雷達(dá)芯片及開始射頻發(fā)波及目標(biāo)探測的工作。CFG文件各項配置具體信息在mmWave SDK user’s guide中有詳細(xì)描述(文檔路徑:.\mmwave_sdk_\docs\mmwave_sdk_user_guide.pdf),通過CLI參數(shù)的配置,可靈活修改雷達(dá)的RF參數(shù)及信號處理的參數(shù),方便調(diào)試工作的進(jìn)行。

對于Toolbox內(nèi)的demo,則需要同時參考SDK user’s Guide 及toolbox內(nèi)的demo guide,其配置文件有SDK通用的部分,也有屬于此demo獨有的配置命令,包含SDK參數(shù)、目標(biāo)檢測層的參數(shù)、追蹤器層的參數(shù),示例如下(.\mmwave_industrial_toolbox_4_9_0\labs\people_counting\68xx_3D_people_counting\chirp_configs\AOP_6m_default.cfg):

% SDK Parameters

% See the SDK user's guide for more information

% "C:\ti\mmwave_sdk_[VER]\docs\mmwave_sdk_user_guide.pdf"

sensorStop

flushCfg

dfeDataOutputMode 1

channelCfg 15 7 0

adcCfg 2 1

adcbufCfg -1 0 1 1 1

lowPower 0 0

% Detection Layer Parameters

% See the Detection Layer Tuning Guide for more information

% "C:\ti\mmwave_industrial_toolbox_[VER]\labs\people_counting\docs\3D_people_counting_detection_layer_tuning_guide.pdf"

profileCfg 0 60.75 30.00 25.00 59.10 394758 0 54.71 1 96 2950.00 2 1 36

chirpCfg 0 0 0 0 0 0 0 1

chirpCfg 1 1 0 0 0 0 0 2

chirpCfg 2 2 0 0 0 0 0 4

frameCfg 0 2 96 0 55.00 1 0

dynamicRACfarCfg -1 4 4 2 2 8 12 4 8 5.00 8.00 0.40 1 1

staticRACfarCfg -1 6 2 2 2 8 8 6 4 8.00 15.00 0.30 0 0

dynamicRangeAngleCfg -1 0.75 0.0010 1 0

dynamic2DAngleCfg -1 1.5 0.0300 1 0 1 0.30 0.85 8.00

staticRangeAngleCfg -1 0 8 8

antGeometry0 -1 -1 0 0 -3 -3 -2 -2 -1 -1 0 0

antGeometry1 -1 0 -1 0 -3 -2 -3 -2 -3 -2 -3 -2

antPhaseRot 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1

fovCfg -1 70.0 20.0

compRangeBiasAndRxChanPhase 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

% Tracker Layer Parameters

% See the Tracking Layer Tuning Guide for more information

% "C:\ti\mmwave_industrial_toolbox_[VER]\labs\people_counting\docs\3D_people_counting_tracker_layer_tuning_guide.pdf"

staticBoundaryBox -3 3 0.5 7.5 0 3

boundaryBox -4 4 0 8 0 3

sensorPosition 2 0 15

gatingParam 3 2 2 2 4

stateParam 3 3 12 500 5 6000

allocationParam 20 100 0.1 20 0.5 20

maxAcceleration 0.1 0.1 0.1

trackingCfg 1 2 800 30 46 96 55

presenceBoundaryBox -3 3 0.5 7.5 0 3

sensorStart

3. 固化CLI參數(shù)以實現(xiàn)芯片上電后自動加載配置

固化配置參數(shù)有幾種操作方式,如SDK文檔描述(file:///C:/ti/mmwave_sdk_03_05_00_04/packages/ti/demo/xwr68xx/mmw/docs/doxygen/html/index.html#bypassCLI),用戶可以將CFG文件中每一條都使用對應(yīng)的函數(shù)調(diào)用替換。這種方式比較底層,代碼的改動量較大,但是可以節(jié)省一部分代碼空間。實現(xiàn)方法可參考Toolbox中提供的一個hard-coded chirp configurations的參考示例代碼,位于:.\mmwave_industrial_toolbox_4_9_0\labs\out_of_box_demo\68xx_mmwave_sdk_hcc

本文所介紹的CLI參數(shù)固化方式將保留原有的CLI串口調(diào)試的接口,同時將現(xiàn)有的CFG參數(shù)以CLI的格式配置進(jìn)去,可視化程度高,實現(xiàn)更為簡單,實現(xiàn)方式如下。

  • 在c 增加頭文件

#include

  • 在c中增加外部結(jié)構(gòu)體的定義。

extern CLI_MCB gCLI;

  • 在c中,增加如下外部函數(shù)定義。

extern void MmwDemo_Bypass_CLI (void);

  • 在c的"void MmwDemo_initTask(UArg arg0, UArg arg1)"函數(shù)中,在CLI_OPEN之后,調(diào)用” MmwDemo_Bypass_CLI”函數(shù)。

MmwDemo_Bypass_CLI();

  • 在C中增加如下配置命令及代碼。

#define CLI_BYPASS 1

#define MAX_RADAR_CMD 30

uint8_t* radarCmdString[MAX_RADAR_CMD] =

{

{"sensorStop\r\n"},

{"flushCfg\r\n"},

{"dfeDataOutputMode 1\r\n"},

{"channelCfg 15 5 0\r\n"},

{"adcCfg 2 1\r\n"},

{"adcbufCfg -1 0 1 1 1\r\n"},

{"lowPower 0 0\r\n"},

{"profileCfg 0 60 7 3 24 0 0 166 1 256 12500 0 0 158\r\n"},

{"chirpCfg 0 0 0 0 0 0 0 1\r\n"},

{"chirpCfg 1 1 0 0 0 0 0 4\r\n"},

{"frameCfg 0 1 32 0 100 1 0\r\n"},

{"guiMonitor -1 1 1 1 0 0 1\r\n"},

{"cfarCfg -1 0 2 8 4 3 0 15.0 0\r\n"},

{"cfarCfg -1 1 0 4 2 3 1 15.0 0\r\n"},

{"multiObjBeamForming -1 1 0.5\r\n"},

{"calibDcRangeSig -1 0 -5 8 256\r\n"},

{"clutterRemoval -1 0\r\n"},

{"compRangeBiasAndRxChanPhase 0.0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\r\n"},

{"measureRangeBiasAndRxChanPhase 0 1. 0.2\r\n"},

{"aoaFovCfg -1 -90 90 -90 90\r\n"},

{"cfarFovCfg -1 0 0.25 9.0\r\n"},

{"cfarFovCfg -1 1 -20.16 20.16\r\n"},

{"extendedMaxVelocity -1 0\r\n"},

{"CQRxSatMonitor 0 3 4 63 0\r\n"},

{"CQSigImgMonitor 0 127 4\r\n"},

{"analogMonitor 0 0\r\n"},

{"lvdsStreamCfg -1 0 0 0\r\n"},

{"bpmCfg -1 0 0 0\r\n"},

{"calibData 0 0 0\r\n"},

{"sensorStart\r\n"}

};

static int32_t CLI_ByPassApi(CLI_Cfg* ptrCLICfg)

{

//uint8_t cmdString[128];

char* tokenizedArgs[CLI_MAX_ARGS];

char* ptrCLICommand;

char delimitter[] = " \r\n";

uint32_t argIndex;

CLI_CmdTableEntry* ptrCLICommandEntry;

int32_t cliStatus;

uint32_t index, idx;

uint16_t numCLICommands = 0U;

/* Sanity Check: Validate the arguments */

if (ptrCLICfg == NULL)

return -1;

/* Cycle through and determine the number of supported CLI commands: */

for (index = 0; index < CLI_MAX_CMD; index++)

{

/* Do we have a valid entry? */

if (ptrCLICfg->tableEntry[index].cmd == NULL)

{

/* NO: This is the last entry */

break;

}

else

{

/* YES: Increment the number of CLI commands */

numCLICommands = numCLICommands + 1;

}

}

/* Execute All Radar Commands */

for (idx = 0; idx < MAX_RADAR_CMD; idx++)

{

/* Reset all the tokenized arguments: */

memset ((void *)&tokenizedArgs, 0, sizeof(tokenizedArgs));

argIndex = 0;

ptrCLICommand = (char*)radarCmdString[idx];

/* Set the CLI status: */

cliStatus = -1;

/* The command has been entered we now tokenize the command message */

while (1)

{

/* Tokenize the arguments: */

tokenizedArgs[argIndex] = strtok(ptrCLICommand, delimitter);

if (tokenizedArgs[argIndex] == NULL)

break;

/* Increment the argument index: */

argIndex++;

if (argIndex >= CLI_MAX_ARGS)

break;

/* Reset the command string */

ptrCLICommand = NULL;

}

/* Were we able to tokenize the CLI command? */

if (argIndex == 0)

continue;

/* Cycle through all the registered CLI commands: */

for (index = 0; index < numCLICommands; index++)

{

ptrCLICommandEntry = &ptrCLICfg->tableEntry[index];

/* Do we have a match? */

if (strcmp(ptrCLICommandEntry->cmd, tokenizedArgs[0]) == 0)

{

/* YES: Pass this to the CLI registered function */

cliStatus = ptrCLICommandEntry->cmdHandlerFxn (argIndex, tokenizedArgs);

if (cliStatus == 0)

{

CLI_write ("Done\n");

}

else

{

CLI_write ("Error %d\n", cliStatus);

}

break;

}

}

/* Did we get a matching CLI command? */

if (index == numCLICommands)

{

/* NO matching command found. Is the mmWave extension enabled? */

if (ptrCLICfg->enableMMWaveExtension == 1U)

{

/* Yes: Pass this to the mmWave extension handler */

cliStatus = CLI_MMWaveExtensionHandler (argIndex, tokenizedArgs);

}

/* Was the CLI command found? */

if (cliStatus == -1)

{

/* No: The command was still not found */

CLI_write ("'%s' is not recognized as a CLI command\n", tokenizedArgs[0]);

}

}

}

return 0;

}

void MmwDemo_Bypass_CLI (void)

{

if (CLI_ByPassApi(&gCLI.cfg) != 0)

{

System_printf ("Error: Unable to CLI_ByPassApi\n");

return;

}

return;

}

4. 運(yùn)行測試?yán)?/h3>

將上述代碼集成進(jìn)測試程序后,mmWave sensor成功配置。將此BIN文件燒寫到EVM板卡中,可以實現(xiàn)上電自動配置參數(shù)及運(yùn)行的功能,代碼上電自動運(yùn)行功能添加成功。

CCS debug運(yùn)行模式下,CCS控制臺打印信息如下:

[Cortex_R4_0] **********************************************

Debug: Launching the MMW Demo on MSS

**********************************************

Debug: Launched the Initialization Task

Debug: mmWave Control Initialization was successful

Debug: mmWave Control Synchronization was successful

[C674X_0] Debug: DPM Module Sync is done

[Cortex_R4_0] Debug: CLI is operational

Debug: Sending rlRfSetLdoBypassConfig with 0 0 0

============ Heap Memory Stats ============

Size Used Free DPCUsed

System Heap(TCMB) 32768 28016 4752 2048

L3 786432 262144 524288

localRam(TCMB) 4096 512 3584

============ Heap Memory Stats ============

Size Used Free DPCUsed

System Heap(L2) 32768 16112 16656 0

L3 786432 16384 770048

localRam(L2) 50176 15272 34904

localRam(L1) 16384 5728 10656

Starting Sensor (issuing MMWave_start)

直接燒寫B(tài)IN文件到EVM板卡,串口打印信息如下:

******************************************

xWR68xx MMW Demo 03.05.00.04

******************************************

mmwDemo:/>Ignored: Sensor is already stopped

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Done

Debug: Init Calibration Status = 0x1ffe

Done

mmwDemo:/>

5. 附加說明

在部分的demo(比如3D people counting demo)中,會出現(xiàn)堆棧溢出導(dǎo)致上電后,initTask中,bypasscli配置失敗的情況,此時只需要需要適當(dāng)增加此task的stacksize為4*1024,即可完成參數(shù)的配置。

/* Initialize the Task Parameters. */

Task_Params_init(&taskParams);

taskParams.stackSize = 4*1024;

gMmwMssMCB.taskHandles.initTask = Task_create(MmwDemo_initTask, &taskParams, NULL);

6. 參考資料

  • IWR6843、IWR6443 單芯片 60GHz 至 64GHz 毫米波傳感器 數(shù)據(jù)表 (Rev. D)
  • mmWave SDK: mmWave Software Development Kit http://www.ti.com/tool/mmwave-sdk
  • mmWave SDK User’s Guide: C:\ti\mmwave_sdk_03_05_00_04\docs\mmwave_sdk_user_guide.pdf
  • mmWave SDK Out of Box Demo - XWR68XX: C:/ti/mmwave_sdk_03_05_00_04/packages/ti/demo/xwr68xx/mmw/docs/doxygen/html/index.html
  • mmWave SDK Out of Box Demo - 68xx Hard-Coded Config Version User's Guide: C:/ti/mmwave_industrial_toolbox_4_9_0/labs/out_of_box_demo/68xx_mmwave_sdk_hcc/docs/mmWave_sdk_68xx_hcc_user_guide.html
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 汽車
    +關(guān)注

    關(guān)注

    13

    文章

    3515

    瀏覽量

    37318
  • AWR1443
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    2250
收藏 人收藏

    評論

    相關(guān)推薦

    文搞懂軟核的固化、啟動和MultiBoot實現(xiàn)

    這也是《FPGA實現(xiàn)串口升級及MultiBoot》系列篇文章,作為個專題單獨出來說明。 本篇文章分為三個主題:固化、啟動和Multi
    的頭像 發(fā)表于 12-07 11:23 ?359次閱讀
    <b class='flag-5'>一</b>文搞懂軟核的<b class='flag-5'>固化</b>、啟動和MultiBoot<b class='flag-5'>實現(xiàn)</b>

    ?影響UVLED固化速率的多種因素

    UVLED固化技術(shù)作為一種快速固化的手段,在眾多行業(yè)中發(fā)揮著重要作用,如印刷、涂料、電子等。然而,UVLED固化速率并非
    的頭像 發(fā)表于 11-08 10:54 ?241次閱讀
    ?影響UVLED<b class='flag-5'>固化</b>速率的多種因素

    hex可以轉(zhuǎn)成源代碼

    ,可以通過以下幾種方法嘗試獲取源代碼的近似形式: 反匯編 : 使用反匯編工具可以將Hex文件的機(jī)器碼轉(zhuǎn)換回匯編語言。匯編語言是
    的頭像 發(fā)表于 09-02 10:41 ?1028次閱讀

    hex文件如何查看原c語言代碼

    是處理器可以直接執(zhí)行的指令,而 C 語言代碼則是人類可讀的高級編程語言代碼。 然而,如果你想要從 .hex 文件獲取
    的頭像 發(fā)表于 09-02 10:37 ?2307次閱讀

    PDF文件批量打印源代碼

    壓縮包包含可批量打印PDF文件的Python代碼可以借助PYcharm工具執(zhí)行,實現(xiàn)多PDF文件
    發(fā)表于 08-08 14:26 ?0次下載

    一種在HLS插入HDL代碼方式

    很多人都比較反感用C/C++開發(fā)(HLS)FPGA,大家第拒絕的理由就是耗費資源太多。但是HLS也有自己的優(yōu)點,除了快速構(gòu)建算法外,還有個就是接口的生成,尤其對于AXI類接口,按照標(biāo)準(zhǔn)語法就
    的頭像 發(fā)表于 07-16 18:01 ?741次閱讀
    <b class='flag-5'>一種</b>在HLS<b class='flag-5'>中</b>插入HDL<b class='flag-5'>代碼</b>的<b class='flag-5'>方式</b>

    高效能UVLED固化箱:如何實現(xiàn)快速固化并提升生產(chǎn)效率?

    在現(xiàn)代工業(yè)生產(chǎn)中,快速固化技術(shù)對于提高生產(chǎn)效率、降低成本以及保證產(chǎn)品質(zhì)量至關(guān)重要。UVLED固化箱作為一種高效能固化設(shè)備,憑借其獨特的優(yōu)勢,
    的頭像 發(fā)表于 05-27 14:54 ?384次閱讀

    LED UV固化箱的工作原理揭秘:為何它能實現(xiàn)快速固化?

    在現(xiàn)代化的工業(yè)制造和印刷領(lǐng)域,快速、高效的固化技術(shù)直是業(yè)界追求的目標(biāo)。LED UV固化箱作為一種新型的
    的頭像 發(fā)表于 05-17 15:58 ?721次閱讀
    LED UV<b class='flag-5'>固化</b>箱的工作原理揭秘:為何它能<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>快速</b><b class='flag-5'>固化</b>?

    LED UV固化箱真的比傳統(tǒng)固化方式更高效嗎?

    在現(xiàn)代工業(yè)生產(chǎn)的眾多領(lǐng)域中,涂層、膠水、油墨等材料的固化是不可或缺的環(huán)。固化效果的好壞直接影響產(chǎn)品的質(zhì)量和生產(chǎn)效率。近年來,LED UV固化
    的頭像 發(fā)表于 05-17 15:55 ?296次閱讀
    LED UV<b class='flag-5'>固化</b>箱真的比傳統(tǒng)<b class='flag-5'>固化</b><b class='flag-5'>方式</b>更高效嗎?

    UVLED固化烘箱:如何實現(xiàn)高效能、低能耗的固化過程?

    下。 首先,UVLED固化烘箱的核心技術(shù)——LED發(fā)光技術(shù),是實現(xiàn)高效能固化的關(guān)鍵。LED光源具有發(fā)光效率高、能耗低的特點,其能量轉(zhuǎn)換效率遠(yuǎn)高于傳統(tǒng)光源。這意味著UVLED固化烘箱在
    的頭像 發(fā)表于 05-09 14:44 ?538次閱讀
    UVLED<b class='flag-5'>固化</b>烘箱:如何<b class='flag-5'>實現(xiàn)</b>高效能、低能耗的<b class='flag-5'>固化</b>過程?

    UVLED固化箱與傳統(tǒng)固化設(shè)備對比:優(yōu)勢目了然

    在現(xiàn)代工業(yè)生產(chǎn)中,固化技術(shù)作為關(guān)鍵工藝之,對產(chǎn)品質(zhì)量和生產(chǎn)效率具有重要影響。隨著科技的不斷進(jìn)步,UVLED固化箱作為一種新型的固化設(shè)備,逐
    的頭像 發(fā)表于 05-09 10:47 ?652次閱讀
    UVLED<b class='flag-5'>固化</b>箱與傳統(tǒng)<b class='flag-5'>固化</b>設(shè)備對比:優(yōu)勢<b class='flag-5'>一</b>目了然

    C/C++實現(xiàn)方式

    #ifndef的方式受C/C++語言標(biāo)準(zhǔn)支持。它不僅可以保證同文件不會被包含多次,也能保證內(nèi)容完全相同的兩個文件(或者
    的頭像 發(fā)表于 04-19 11:50 ?628次閱讀

    請問STM32IDE如何設(shè)定代碼ITCM運(yùn)行?

    近期使用STM32MUX生成STM32IDE的代碼(MCU是STM32H743),目前希望可以將部分代碼定位ITCM運(yùn)行,加快處理速度,
    發(fā)表于 03-26 06:08

    CYUSB3014用SPI的方式固化個固件flash,想修改固件直提示錯誤的原因?

    CYUSB3014我之前用SPI的方式固化個固件flash現(xiàn)在我想修改固件,直提示錯誤
    發(fā)表于 02-28 06:50

    代碼檢查的方式有三

    等方面的問題。那么在代碼檢查服務(wù),提到的編程規(guī)范,規(guī)則集,規(guī)則,規(guī)則用例(場景、誤報、檢出)分別代表什么意思呢? 編程規(guī)范 在 SAST 靜態(tài)代碼檢查領(lǐng)域, 編程規(guī)范是套在組織層面
    的頭像 發(fā)表于 02-25 10:08 ?858次閱讀
    <b class='flag-5'>代碼</b>檢查的<b class='flag-5'>方式</b>有三<b class='flag-5'>種</b>