TI 毫米波雷达自动 CLI 配置与工程实现
本文介绍如何通过改写 CLI 部分函数,实现初始化后自动进行命令参数配置和控制的功能。该方法适用于所有 TI 官方工程,以 IWR6843AOP 为例。
TI 毫米波雷达自动 CLI 配置通过修改 cli.c 和 hcc_cli.c 实现。核心是在 CLI_task 中增加宏定义 USE_HARD_CODED_CONFIG,将配置命令存入数组硬编码。初始化时自动执行命令直到结束标记,随后开放 UART 读取。支持工业雷达包及官方工程移植,可替代外部配置文件直接固化参数。涉及传感器启动、停止、通道配置、ADC 设置等命令序列。

本文介绍如何通过改写 CLI 部分函数,实现初始化后自动进行命令参数配置和控制的功能。该方法适用于所有 TI 官方工程,以 IWR6843AOP 为例。
在工业雷达包 Fundamentals 目录下有 Hard_Coded_Config 工程,采用自动 CLI 命令配置参数、控制雷达。
导入工程后,主要涉及两个文件:
hcc_cli.c:对应 SDK 中的 cli.ccli_mmwave.c:对应 SDK 中的同名文件cli_mmwave.c 无改动。在 hcc_cli.c 中添加宏定义:
#define USE_HARD_CODED_CONFIG
另外,当有这个宏定义时,还定义了两个全局变量:
int32_t hardCodedConfigIndex;
char * hardCodedConfigCommands[] =
{
"sensorStop",
"flushCfg",
"dfeDataOutputMode 1",
"channelCfg 15 7 0",
"adcCfg 2 1",
"adcbufCfg -1 0 1 1 1",
"lowPower 0 0",
"profileCfg 0 60 7 3 24 0 0 166 1 256 12500 0 0 158",
"chirpCfg 0 0 0 0 0 0 0 1",
"chirpCfg 1 1 0 0 0 0 0 4",
"chirpCfg 2 2 0 0 0 0 0 2",
"frameCfg 0 2 32 0 100 1 0",
"guiMonitor -1 1 1 1 0 0 1",
"cfarCfg -1 0 2 8 4 3 0 15.0 0",
"cfarCfg -1 1 0 4 2 3 1 15.0 0",
"multiObjBeamForming -1 1 0.5",
"calibDcRangeSig -1 0 -5 8 256",
"clutterRemoval -1 0",
"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",
"measureRangeBiasAndRxChanPhase 0 1. 0.2",
"aoaFovCfg -1 -90 90 -90 90",
"cfarFovCfg -1 0 0.25 9.0",
"cfarFovCfg -1 1 -20.16 20.16",
"extendedMaxVelocity -1 0",
"CQRxSatMonitor 0 3 4 63 0",
"CQSigImgMonitor 0 127 4",
"analogMonitor 0 0",
"lvdsStreamCfg -1 0 0 0",
"bpmCfg -1 0 0 0",
"calibData 0 0 0",
"sensorStart",
"!!!END_OF_HARD_CODED_COMMANDS"
};
hardCodedConfigCommands 变量用于存放参数配置,hardCodedConfigIndex 变量作为数组的指针。
重点在 CLI_task 函数中。该函数中涉及到 USE_HARD_CODED_CONFIG 宏定义的部分位于获取命令之前:
#ifdef USE_HARD_CODED_CONFIG
/* Run hard-coded commands, one at a time until '!!!END_OF_HARD_CODED_COMMANDS' is reached: */
if (hardCodedConfigCommands[hardCodedConfigIndex][0] != '!')
{
//CLI_write (hardCodedConfigCommands[hardCodedConfigIndex]);
CLI_write ("Command\n");
memcpy((void *)&cmdString[0], (void *)hardCodedConfigCommands[hardCodedConfigIndex],
strlen(hardCodedConfigCommands[hardCodedConfigIndex]));
hardCodedConfigIndex++;
}
/* Accept commands from UART after all hard-coded commands done: */
else
{
/* Read the command message from the UART: */
UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) - 1));
}
#else
/* Read the command message from the UART: */
UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) - 1));
#endif
该部分通过 hardCodedConfigIndex 序号加一,每次从数组中拿一个参数配置字符串出来,然后跳过 UART_read 函数的读取部分,直到检测到字符串开头为 !。所以配置参数的字符串最后一排以 ! 开头表示配置结束,而后重新开启 UART_read 函数的读取部分。这样一来,就能在 CLI 初始化以后自动进行配置,配置完成后跳转到原有的 CLI 模式。
发送配置命令的正常方法是使用单独的文本文件,将通过 CLI(命令行界面)发送。为了将命令存储在现有文件中,需修改 cli.c 文件。
常规初始化任务调用 CLIInit 函数。在此函数结束时,将打开 CLI 以接收命令。然而此时还需要在之前进行其他初始化,设备已准备好启动。cfg 参数不能在之后直接设置,应该添加到 cli.c 中的 CLI_task() 中。
以下示例使用 profile_3d.cfg 中的默认配置命令文件,但您可以添加所需的任何配置命令。
<mmWave SDK Install Path>\packages\ti\utils\cli\src 路径下的 cli.c 文件。#define USE_HARD_CODED_CONFIG 添加到文件顶部。(可以使用任何您喜欢的宏名称)#ifdef USE_HARD_CODED_CONFIG 启用关闭,如果需要,将来可以使用 HCC 功能。包括整数变量用于循环遍历 CFG 参数。! 或其他字符的数组,CFG 参数中未使用。例如 "!!END_OF_HARD_CODED_COMMANDS"。CLI_task() 和 while(1) 循环之前,需要添加一个部分暂停任务以进行进一步的系统初始化。包括一些 UART 打印以保持清晰。while(1) 循环中,添加要读取的循环到 char 数组中,添加到文件顶部的 cfg 参数。这将取代从 UART 获取 cfg 参数的 UART_read 行连接。使用 #ifdef/#else 绕过此操作以恢复到 UART 如果 HCC 已关闭,则进行通信。将上述提到的两个 .c 文件 cli_mmwave.c 和 hcc_cli.c 添加到任意包含 CLI 配置的官方工程下。由于工程比较复杂,用重写 CLI 初始化函数来达到配置雷达的目的可能会报错,所以还是用官方的这一套 CLI 配置,但改为自动配置。在这里 CLI 还是会被初始化,官方工程的其他代码无改动。
添加以后,在 MSS 工程的属性中,选择 Arm Linker 的 File Search Path 并更改,剔除其中的 cli 相关库。然后将 hcc_cli.c 中的参数配置改成符合工程的配置即可。记得最后一项的开头要为 !,这样就可以使雷达自动完成 CLI 配置。
CLI 配置结束后,可以增加一个 CLI_close() 函数的调用,以此来关闭 CLI,但不会关闭已经初始化后的串口。然后可以在 main.c 中加上一些特定的函数,从而将串口用于最终数据输出。
雷达工作原理是上电 - 发送 chirps - 帧结束 - 处理 - 上电循环。一个 Frame,首先是信号发送,比如 96 个 chirp 就顺次发出去,然后接收回来,混频滤波,ADC 采样,这些都是射频模块的东西。射频完成之后,FFT,CFAR,DOA 这些就是信号处理的东西。然后输出给那个结构体,就是当前帧获得的点云了。
在射频发送阶段,一个 frame 发送若干个 chirp。第一个绿色点为 frame start,第二个绿色点为 frame end。其中发送若干 chirps(小三角形),chirps 的个数称为 numLoops(代码中 rlFrameCfg_t 结构体)。frame end 到周期结束的时间为计算时间,称为 inter frame period。frame start 到循环结束的时间称为 framePeriodicity(代码中 rlFrameCfg_t 结构体)。
如果是处理点云数据,则只需要每一帧计算一次点云即可。计算出当前帧的 xyz 坐标和速度,以及保存时间戳。
IWR6843AOP 可以分成三个主要部分及多个外设:BSS(雷达前端部分)、MSS(Cortex-R4F 内核,主要用于控制)、DSS(DSP C674 内核,主要用于信号处理)、外设(UART GPIO DPM HWA 等)。大部分外设可以被 MSS 或 DSS 调用。另外,雷达前端 BSS 部分在 SDK 里由 MMWave API 调用。
代码框架上,可以分成两个代码 MSS 和 DSS,两个代码同时运行,通过某些外设进行同步,协同运作。但也可以只跑一个内核,在仅 MSS 模式下,依旧可以调用某些用于信号处理的外设。
检测到的对象信息通过 UART 发送,每个 packet 包含 Header MmwDemo_output_message_header_t 和 TLV 项。TLV 类型包括:
因为天线布局的不完美,RF 延迟等因素,需要对传感器进行校准以补偿距离估计偏差和接收通道增益相位不完美。校准过程包括设置强目标、配置配置文件、启动传感器、测量结果输出等步骤。
LVDS 流支持 HW 数据和 SW 数据传输。HW 数据格式包括 ADC、CP_ADC_CQ 等。SW 数据包含用户数据头、点云信息等。需注意带宽限制和数据格式配置,确保传输时间满足要求。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online