Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

前言

本手冊(mmWave Handbook)旨在整合並系統化記錄本團隊在毫米波雷達上的開發與實務經驗,以「系統化學習」的方式,幫助讀者在短時間內掌握毫米波雷達的核心概念、訊號處理、演算法與設計實作。此外,本手冊亦作為共享知識庫、加速毫米波雷達應用開發效率的開放資源,避免重複踩雷,並促進知識長期共享。

本手冊不涵蓋的範圍

  • 不提供或重新散佈 TI 閉源 SDK、安裝程式或技術文件
  • 不涉及專利、商業機密或受限制的技術細節
  • 不大量複製或翻譯官方技術文件,僅以摘要與心得形式整理
  • 不深入探討 RF 晶片級 IC 設計等硬體細節
  • 不涵蓋各地法律與合規議題(如發射功率、頻譜規範,請依當地主管機關規定查閱)
  • 不包含任何「逆向工程、反編譯或反組譯」的內容

適合這本手冊的對象

類型需求本手冊價值
初學工程師 / 學生快速入門毫米波雷達結構化學習路徑
TI 平台使用者SDK 範例、工具鏈導覽專章:TI mmWave

背景知識

主題需要知道什麼為什麼重要
訊號處理基礎複數表示、FFT、窗函數幫助理解訊號於時間與頻率的關係
線性代數向量、矩陣、特徵值雷達方向估計 (AoA, MUSIC) 的數學基礎
機率與統計雜訊模型判斷訊號與雜訊,決定是否檢測到目標
程式基礎C/C++ AND Python模擬、數據分析與實驗驗證

手冊結構

區塊內容焦點對應章節
基礎毫米波介紹毫米波基礎
硬體天線陣列、前端、chirp硬體架構
訊號處理ADC → Range FFT → Doppler FFT → Angle → CFAR訊號處理
分類與應用場景各場景下設計需求與挑戰分類與應用場景
技術優勢與限制適用場景技術優勢與限制
TI 生態SDK、Toolchain、範例與調試TI mmWave
演算法CFAR / AoA / Clustering / Tracking / Feature常用演算法
附錄公式、符號、測量實務、FAQ附錄

TI mmWave 相關章節

ti_mmwave/ 目錄內包含:

  • 官方文件建議閱讀順序 & 新手導向
  • Toolchain(CCS, Uniflash, mmWave Studio, Radar Toolbox)
  • 範例程式解構與常見修改點
  • SDK 內建演算法 / Radar Toolbox 使用脈絡
  • 延伸(Clustering, Tracking, Feature 擴充)

所有 TI 內容僅為教學整理,請依原廠授權使用;必要時標註來源。

法規與安全

  • 發射功率 / 頻譜:請查閱所在地區主管機關(FCC, ETSI, NCC 等)
  • 使用 EVM / 開發板:避免金屬遮擋與高溫區域
  • 人體生命跡象實驗:遵守倫理與隱私政策;不進行未告知的醫療診斷

參與 & 回饋

  • 建議 / 問題:於 GitHub 開 Issue,提供上下文、章節、預期/實際結果
  • 新增章節:同步更新 SUMMARY.md (已啟用 mdbook-toc 可略過此項)
  • 大規模結構調整:請先提出 Proposal(Issue 或 Discussion)

關於更多參與及貢獻資訊,請參考 CONTRIBUTING.md

免責聲明

本手冊內容僅用於教育及研究參考,不保證適用於特定商業或安全關鍵場景。涉及第三方商標(如「Texas Instruments」)僅為描述用途,不代表任何官方。請遵守各 SDK / 文件授權、license,不複製大量原文。

下一步

閱讀下一章:


祝學習順利,歡迎回饋與貢獻!

毫米波基礎

本章統整毫米波雷達的核心原理、常用公式與設計邏輯,為後續訊號處理、演算法、應用等章節奠定共同的理解基礎。

什麼是毫米波?

毫米波(mmWave)是一種波長約 1–10 毫米、頻率 30–300 GHz 的高頻電磁波,位於電磁波譜中微波與紅外線之間。由於其波長短、頻率高,因此一方面既能提供極大的頻寬,支援高速資料傳輸;另一方面也因波長短,亦能實現高解析度的感測能力。

應用場景與案例

毫米波雷達廣泛應用於汽車領域,例如盲點偵測、緊急自動煞車、智慧跟車系統(ACC)、行人偵測等,能在雨天、濃霧或夜間等低能見度環境下依然精準測距並判斷角度,大幅提升自動駕駛與行車安全。


近年來,其應用更拓展至智慧感測與人機互動,例如以毫米波雷達進行手勢識別、跌倒偵測、室內定位,不需攝影機即可實現非接觸式操作。在醫療與生命體徵監測方面,毫米波能夠精準量測心跳、呼吸頻率與微小動作,可用於智慧醫院、居家照護與長者安全監測。未來,隨著硬體與演算法的進步,毫米波技術有望在穿戴式裝置、智慧家庭、無人駕駛車輛等領域發揮更關鍵的角色。

FMCW

Frequency Modulated Continuous Wave,調頻連續波,通過發射頻率隨時間線性變化的連續波,並分析接收到的回波信號(透過比較發射與接收訊號)來測量距離和速度。計算頻率差可得到距離;而計算頻率變化率可得速度。


FMCW


上圖顯示的是 FMCW 雷達訊號的隨時間變化的波形圖,縱軸是振幅,橫軸是時間。從圖可以看到一開始波形較稀疏(頻率低)。隨著時間推進,波形越來越密集(頻率升高),這正是 FMCW 透過線性調頻 (chirp1),讓發射信號的頻率隨時間變化。


因為FMCW 發射的是是連續波,接收端可以即時比較「發射信號」與「回波信號」之間的差異。當信號遇到目標反射回來時,會有一個時間延遲。因為頻率是隨時間改變的,這個延遲就會轉換成頻率差 (beat frequency)。FMCW 雷達利用這個頻率差來計算目標的距離。FMCW 雷達透過比較「發射」與「接收」訊號的頻率差,計算出距離,若進一步量測頻率差隨時間的變化,還可以估算速度(都卜勒效應)。


如果想了解更多,請參考 TI Radar Academy - How Does Radar Work?

MIMO 雷達

Multiple-Input Multiple-Output,多輸入多輸出,是一種在雷達系統中被廣泛使用的技術,它利用多個發射天線(Tx)和多個接收天線(Rx)來提高雷達的整體性能。MIMO 雷達的核心概念是利用空間維度的優勢,透過發射不同的正交訊號並在接收端分離它們,來模擬出一個更大的虛擬天線陣列,而非僅僅依賴於時間或頻率維度。相較之下,傳統的雷達系統通常是單輸入單輸出 (Single-input single-output, SISO),即只有一個發射天線和一個接收天線。

虛擬陣列 MIMO 雷達

Virtual Antenna Array MIMO Radar,則是目前雷達領域更常討論和應用的一種 MIMO 雷達。由於多個發射天線發射的訊號彼此正交(Orthogonal),所以每個發射天線發射的訊號在接收端接收訊號時可以被區分開來。透過虛擬陣列,MIMO 雷達可以形成一個更大的天線陣列。想像一下,假設原本只有 NTx 個發射天線和 NRx 個接收天線,那麼接收端可以同時接收到 NTx × NRx ​個獨立的「發射-接收路徑」訊號。這相當於擁有了 NTx × NRx 個虛擬感測器,使得雷達系統能夠:

  • 提高角度解析度:一個更大的虛擬孔徑可以分辨出更近的目標。例如一個 2 Tx × 4 Rx 的虛擬陣列 MIMO 雷達可以達到與 8 個物理單一天線一樣的角度解析度。

  • 提高目標分離能力:MIMO 增加了虛擬天線數目,可以區分角度非常接近的目標與雜波來源。

  • 抑制干擾和雜波:藉由波束形成(beamforming),雷達可以加強特定方向的訊號,同時降低其他方向的干擾或雜波。

  • 實現更精確的測量:對目標的距離、速度和角度估計可以更準確。


如果想了解更多,請參考 TI Radar Academy - Antenna Design


為什麼需要正交訊號?

在 MIMO 雷達中,當來自不同發射天線的訊號同時到達,接收器需要明確地辨識出每一個回波訊號是來自哪一個特定的發射天線,這時候,我們就需要讓每個發射天線所發射的訊號都具備正交性(或可區分性,distinguishable)。讓發射訊號具備正交性是實現虛擬陣列的基礎。如果接收器無法區分回波訊號,那麼所有回波訊號將會混疊在一起,也無法提取出每個獨立的「發射-接收路徑」資訊了。


那麼該如何實現訊號的正交性?

要讓發射訊號具備正交性主要有三種方法:

  • 分時多工 (Time Division Multiplexing, TDM):不同的發射天線在不同的時間片 (time slots) 發射訊號,也就是說,同一時間點,只有一個發射天線在發送訊號。由於發射天線間需要輪流發射,完成一個完整的掃描週期需要更長的時間,因此缺點是更新率會下降。

  • 分頻多工 (Frequency Division Multiplexing, FDM):不同的發射天線在不同的頻率範圍或起始頻率發射訊號,或讓它們的 chirp 訊號根據不同的頻率去做偏移。這個方法避免了上述分時多工一次只能一個發射的缺點,但是需要分離不同頻率的訊號。

  • 分碼多工 (Code Division Multiplexing, CDM):讓每個發射天線發射一個具有獨特編碼序列的訊號,且這些編碼序列彼此之間的相關性低。這個方法一樣可以避免上述分時多工一次只能一個發射的缺點,但是接收端需要進行解碼和相關運算來分離不同發射源的訊號。


這邊做個舉例,幫助大家理解:

想像一下,你有很多支不同顏色的筆 (NTx 個發射天線,發射正交訊號),它們在各自的位置發射訊號。同時,你有很多張不同顏色的紙張 (NRx 個接收天線),它們在各自的位置接收訊號。當你拿起一支藍色的筆 (Tx1) 開始寫字,同時這些字被所有不同顏色的紙張 (Rx1, Rx2, ..., Rx_NRx) 接收並記錄下來。然後你拿起一支紅色的筆 (Tx2) 繼續寫字,這些字也被所有不同顏色的紙張 (Rx1, Rx2, ..., Rx_NRx) 接收並記錄下來。

由於每支筆的「顏色」(訊號)都是獨特的(正交的),所以即使所有紙張都接收到了混合的字跡,它們都能透過辨識顏色的特徵(解碼/處理),來分辨出是由哪支筆寫的內容。這樣,對於每一張紙來說,它都能「看到」由每支筆 (Tx) 寫下的內容。 因此,每一支筆 (Tx) 在其位置發射的訊號,被每一張紙 (Rx) 在其位置接收,就構成了一個獨立的「發射點-接收點」路徑,這個路徑所提供的資訊,就相當於一個虛擬感測器。


在這個例子中:

  1. 不同顏色的筆 = 不同發射天線(Tx)

    • 每支筆寫的顏色都獨特 → 對應到「每個發射天線發送正交的訊號」。
    • 正交的特性保證了後續可以分開辨識。
  2. 不同顏色的紙 = 不同接收天線(Rx)

    • 每張紙都能接收到所有筆的字跡 → 就像每個接收天線都會接收到來自所有發射天線的訊號。
    • 筆寫字 + 紙接收
    • 當某一支筆在它的位置寫字時,所有紙都會記錄下來,代表「所有 Rx 都接收來自同一 Tx 的訊號」。
    • 之後換另一支筆寫,所有紙再一次接收,代表「所有 Rx 又接收另一個 Tx 的訊號」。
  3. 顏色解碼

    • 雖然紙上有多種顏色的字跡,但因為顏色不一樣(訊號正交),接收端可以分辨並還原是哪支筆寫的 → 對應到「解調/相關運算」。
    • 一支筆(Tx_i) × 一張紙(Rx_j) = 一條獨立的路徑。
    • 每一組 Tx–Rx 對應到一個「虛擬感測器」。
    • 所以 NTx × NRx → 形成 NTx × NRx 個虛擬天線。

在實際雷達裡,這些「顏色」不一定是可見的不同顏色,而是:

  • 時域正交(TDM-MIMO):不同時間發射 → 好像每次只拿一支筆來寫,輪流進行。
  • 頻域正交(FDM-MIMO):不同頻率 → 每支筆用不同墨水頻譜。
  • 編碼正交(CDM-MIMO):不同編碼 → 每支筆寫的字有獨特花紋。

如果想更了解 MIMO 雷達的正交性,請參考 MIMO-OFDM






  1. Chirp 這個名稱由來其實還滿有趣。當訊號的頻率隨時間線性增加或減少,會聽到一種「嘰——啾——」的掃頻聲,跟小鳥叫聲非常接近(我個人也覺得確實滿像的啦)。 ↩

硬體架構

本章聚焦毫米波雷達硬體組成、訊號流動路徑以及主要元件功能。

毫米波雷達的核心目標,是將高頻射頻訊號 (RF) 轉換為容易處理的低頻訊號 (IF),再透過數位訊號處理 (DSP) 萃取出目標的距離、速度與角度資訊。

FMCW Architecture 上圖為一張調頻連續波 (FMCW) 雷達系統的架構方塊圖,展示雷達系統從發射到混頻,接著再到低通濾波,最後得到中頻訊號 (IF) 的過程。

原理

首先,頻率合成器(Frequency Synthesizer)會產生頻率隨時間線性變化的訊號(也就是先前提到的 chirp 訊號),同時提供給發射天線(Tx antenna)與混頻器(Mixer)。發射天線接著將來自頻率合成器的訊號發射出去。


之後目標將發射出去的無線電波反射回來,被接收天線(Rx antenna)接收。Mixer 便將接收到的回波信號與剛才的發射信號(來自 synthesizer)相乘。混頻器的本質其實是將本地訊號(LO)與接收訊號(RF)相乘。在相乘後,會同時產生「和頻(fRF + fLO)」與「差頻(fRF – fLO)」兩個成分。其中差頻就是我們要的拍頻(beat frequency),而和頻(通常是高頻分量)則會透過後續的濾波器去除。


由於我們最感興趣的是這兩個訊號的頻率差 Δf(也稱為 中頻訊號 Intermediate Frequency(IF)Signal)。因此,我們接著利用低通濾波器(Low Pass Filter, LPF),將 Mixer 輸出中的高頻(和頻)濾除,消除雜訊並分離出有用的距離/速度資訊。


最終,經過 LPF 濾波後,得到的就是純粹的 IF 訊號,這個訊號的頻率直接與目標的距離和相對速度相關。在後續中,這個 IF Signal 會被送入類比數位轉換器 (Analog-to-Digital Converter, ADC) 進行數位化,然後由藉由數位訊號處理器(Digital Signal Processor, DSP)進行快速傅立葉變換(FFT)處理,最終提取出目標的精確距離、速度和角度資訊。

毫米波分類與應用場景

本章介紹毫米波雷達的主要應用領域、各場景下設計需求與挑戰,並比較常見實務案例。

應用領域總覽


應用類型典型場景挑戰
汽車雷達前向、後向、側向防撞、盲點偵測、自動停車多目標追蹤、強雜訊環境
工業自動化人員/物件偵測、機械臂防撞金屬反射、複雜背景
安防監控入侵偵測、門禁感知、空間佔用干擾源多
生命跡象監測心跳、呼吸、睡眠分析微弱信號、人體姿態
手勢識別智慧控制、人機介面多手勢區分、資料量大
人員追蹤室內定位、群體行為分析多人重疊、複雜動線

毫米波雷達因具備高解析度、穿透力及隱私性,被廣泛應用於汽車、工業、安防、生命跡象監測、手勢識別、人員追蹤及通訊輔助等領域。


各應用雖然都用毫米波雷達,但「根本需求」卻差異很大:

  • 自駕車雷達最重視遠距離、多目標、速度精準與強抗干擾,確保高速行駛下的安全;

  • 工業與安防則偏向中短距離、低延遲、高可靠性,能在複雜反射環境下即時反應;

  • 生命跡象監測與手勢識別追求的是對微弱、細微動作的高靈敏度與低功耗,通常是單人或少量目標;

  • 而人員追蹤與通訊輔助則著重多目標動態定位與空間資訊融合。


換句話說,不同應用的核心差別在於「量測尺度(遠距離 vs. 微動作)」與「系統特性(高速安全 vs. 即時可靠 vs. 高靈敏度)」。

毫米波技術優勢與限制

本章探討毫米波雷達與其他感測技術(如光學攝影機、紅外線、超音波等)的技術優勢與限制,協助快速理解適用場景。

為什麼要用毫米波?

毫米波兼具三大核心優勢:

  • 高頻寬:可提供細緻距離解析度 (range resolution)

  • 穿透性:對霧、煙、輕微粉塵影響較低,可在光學失效場景 (濃霧、大雨等場景) 維持偵測,並能隔著非導電材質進行人體/物體偵測

  • 隱私性:不直接生成可辨識影像(較光學感測隱私友善),更容易應用於居家照護、辦公場域等隱私敏感場景

技術比較總覽

感測技術優勢限制/挑戰典型應用
毫米波雷達 mmWave穿透霧/煙/黑暗、距離解析高、隱私友善、不受光照影響、多目標追蹤分辨率受限於天線陣列、對金屬反射敏感、硬體成本高汽車雷達、安全監控、工業偵測、生命跡象、手勢識別
光學攝影機 Camera影像細緻、物件分類精度高、資訊量大、色彩/形狀辨識易受光照/天氣影響、隱私疑慮、夜間/霧天效果差、需大量運算安防監控、車載 ADAS、行為分析、人臉辨識
紅外線感測器 IR黑暗/夜間可用、人體感知佳、能量消耗低受環境溫度干擾、解析度低、僅偵測熱源、無法分辨細部動作入侵警報、人體感測、簡易佔用偵測
超音波感測器 Ultrasonic近距離測距精度高、成本低、安全量測距離有限、易受噪音/風影響、無法偵測速度、角度解析差停車輔助、液位量測、簡易防撞
雷射 LiDAR3D 點雲、高解析度、距離精準易受天氣/光環境影響、成本高、體積大、維護需求高自駕車環境感知、地圖建模、工業3D掃描
微波雷達(24GHz)穿透力強、成本較低角度解析差、頻寬有限、無法精細分群車用短距雷達、門禁感測、基本安全監控

關鍵性能比較

指標mmWave攝影機IR超音波LiDAR
距離解析高中低高高
速度測量✔✘✘✘✘
角度解析中-高高低低高
穿透力佳差黑暗佳一般差
隱私性高低高高高
成本中-高低-高低低高

優勢與限制總結

技術優勢摘要限制摘要
mmWave雷達穿透力強、隱私性佳、多目標需專業設計校準、硬體成本高、物件分類有限
光學攝影機影像豐富、分類強易受環境干擾、隱私疑慮、夜間能力弱
紅外線感測器黑暗可用、低功耗只偵測熱源、解析度低、分群能力差
超音波低成本、近距精度高距離有限、易受噪音干擾、無速度角度資訊
LiDAR3D點雲高解析高成本、體積大、維護難

總結

不過也需注意,毫米波的挑戰在於:訓練資料相對難以收集、樣本數量遠少於光學影像;此外,雷達影像難以直接呈現物體外觀。與光學成像不同,光學是藉由自然光反射清楚顯示外觀,而毫米波雷達則依靠主動發射電磁波並根據散射點構建資料,因此資料不具傳統視覺特徵。

TI mmWave

快速入門

本章針對 TI mmWave 雷達平台(IWR/IWRL 系列)提供開箱、基本設定、資料擷取與簡易開發流程,適合初學者快速上手。

準備需求

硬體開箱

  • TI mmWave EVM (例如 IWRL6432BOOST 或 IWR6843AOP)
  • 搭配開發介面板 (如果您是用 IWR6843AOP 這塊 EVM,將會需要 MMWAVEICBOOST)
  • USB 線材
  • (選配) DCA1000 資料擷取卡,用於收集原始 ADC 資料

必備安裝項目

  1. Code Composer Studio (CCS)

    TI 官方整合開發環境(IDE),支援編輯、編譯、除錯和韌體燒錄等眾多功能。


  1. mmWave SDK

    TI 官方雷達軟體開發套件(SDK),整合驅動程式和範例專案(如 Out-of-Box Demo 等)。

    依照 mmWave EVM 種類分成不同版本,像 IWR6843AOP 這塊用的是 MMWAVE-SDK;IWRL6432BOOST 這塊則是使用 MMWAVE-L-SDK (L 代表 low-power)。

    請依照 TI mmWave EVM 來選擇開發套件。


  1. UNIFLASH

    TI 官方韌體燒錄工具,支援 mmWave EVM(AWR/IWR 系列)及其他 TI 嵌入式平台。 可透過 USB 將 bin 檔、hex 檔等韌體檔案燒錄至 EVM 主板。


  1. TI ARM-CGT-CLANG 編譯器

    TI 官方 ARM Cortex-R/Cortex-M 系列專用 C/C++ 編譯器,支援 mmWave EVM 韌體開發。



系統架構總覽

安裝與建置

常用演算法

疑難排解

本章節整理在使用 MMWAVE-L-SDK 開發過程中,常見的錯誤情境與解決方式。由於開發環境涉及到不同版本的 SDK、CCS (Code Composer Studio)、以及 Makefile 工具鏈,實際操作時常會遇到版本相容性或路徑設定問題。


此章節將各種問題以案例方式紀錄,提供快速檢索與參考,幫助使用者能夠更快定位問題來源並找到解決方法。(實際版本號請依照使用者自身環境的 MMWAVE_L_SDK 版本為準。)



編號主題說明對應章節
1gmake 找不到檔案錯誤gmake 過程因 CCS 版本路徑不同,導致找不到檔案gmake 找不到檔案錯誤
2gmake 編譯失敗gmake all 過程中發生錯誤,與 tiarmclang 編譯器版本有關gmake 編譯失敗

gmake 找不到檔案錯誤

實際 MMWAVE_L_SDK 版本請依照自身版本做修改。

問題描述

在一開始跑 MMWAVE_L_SDK_05_05_03_00(從 MMWAVE_L_SDK_05_05_03_00/ 資料夾下打開 MMWAVE_L_SDK_05_05_03_00/README_FIRST_xWRL6432.html)內 Developer Guides 中的 Using SDK with Makefiles 範例教學時,因為 ccs 版本不同,所以在 gmake 的時候,會出現以下錯誤:

PS C:\ti\MMWAVE_L_SDK_05_05_03_00> gmake -s -C examples/hello_world/xwrL64xx-evm/m4fss0-0_freertos/ti-arm-clang clean
 Cleaning: xwrL64xx:m4fss0-0:freertos:ti-arm-clang hello_world.release.out ...
process_begin: CreateProcess(NULL, C:/ti/ccs1271/ccs/utils/cygwin/rm -rf obj/release/, ...) failed.
make (e=2): The system cannot find the file specified.
makefile:166: recipe for target 'clean' failed
gmake: *** [clean] Error 2

這邊可以注意一下第三行的錯誤訊息 process_begin: CreateProcess(NULL, C:/ti/ccs1271/ccs/utils/cygwin/rm -rf obj/release/, ...) failed.,我的 ccs 版本明明是 20.1.0 啊。由於版本不同,路徑理所當然也不同囉!但翻遍了所有路徑下的 makefile 檔案,都沒有找到被寫死的路徑。最後是在 MMWAVE_L_SDK_05_05_03_00/ 下的 imports.mak 找到。


imports.mak 這個檔案是 TI mmWave SDK 專案建置流程中的環境設定檔,用來集中管理編譯所需的工具鏈與外部套件路徑。內容通常包含了編譯器(ti-arm-clang)、mmWave SDK 等安裝位置。當 Makefile 執行時,會先讀取 imports.mak 中的這些變數設定,確保編譯器與相關函式庫能正確找到來源與標頭檔。

解決方法

打開 imports.mak,用 Ctrl + F 找到所有 CCS_PATH?=$(TOOLS_PATH)/ccs1271/ccs(有兩個),改成你的 ccs 版本。


舉例,我的 ccs 版本為 20.1.0 → 改成:

CCS_PATH?=$(TOOLS_PATH)/ccs2010/ccs

改完後儲存,gmake 就可以正常運作了。

gmake 編譯失敗

實際 MMWAVE_L_SDK 版本請依照自身版本做修改。

問題描述

繼上次 MMWAVE_L_SDK_05_05_03_00(從 MMWAVE_L_SDK_05_05_03_00/ 資料夾下打開 MMWAVE_L_SDK_05_05_03_00/README_FIRST_xWRL6432.html)內 Developer Guides 中的 Using SDK with Makefiles 範例教學,雖然已經可以成功 gmake clean,但 gmake all 時卻發生以下錯誤:

PS C:\ti\MMWAVE_L_SDK_05_05_03_00>gmake -s -C examples/hello_world/xwrL64xx-evm/m4fss0-0_freertos/ti-arm-clang all
Generating SysConfig files ...
Running script...
Validating...
Generating Code (example.syscfg)...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_dpl_config.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_dpl_config.h...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_drivers_config.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_drivers_config.h...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_drivers_open_close.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_drivers_open_close.h...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_pinmux_config.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_power_clock_config.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_board_config.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_board_config.h...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_board_open_close.c...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_board_open_close.h...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_cli_mpd_demo_config.h...
Writing C:\ti\MMWAVE_L_SDK_05_05_03_00\examples\hello_world\xwrL64xx-evm\m4fss0-0_freertos\ti-arm-clang\generated\ti_cli_mmwave_demo_config.h...
 Compiling: xwrL64xx:m4fss0-0:freertos:ti-arm-clang hello_world.release.out: ../../../hello_world.c
process_begin: CreateProcess(NULL, C:/ti/ccs2010/ccs/tools/compiler/ti-cgt-armllvm_3.2.2.LTS/bin/tiarmclang -c -mcpu=cortex-m4 -mfloat-abi=hard -mno-unaligned-access -mthumb -Wall -Werror -g -Wno-gnu-variable-sized-type-not-at-end -Wno-unused-function -Os -IC:/ti/ccs2010/ccs/tools/compiler/ti-cgt-armllvm_3.2.2.LTS/include/c -IC:/ti/MMWAVE_L_SDK_05_05_03_00/source -IC:/ti/MMWAVE_L_SDK_05_05_03_00/source/kernel/freertos/FreeRTOS-Kernel/include -IC:/ti/MMWAVE_L_SDK_05_05_03_00/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CM4F -IC:/ti/MMWAVE_L_SDK_05_05_03_00/source/kernel/freertos/config/xwrL64xx/m4f -Igenerated -DSOC_XWRL64XX -MMD -o obj/release//hello_world.obj ../../../hello_world.c, ...) failed.
make (e=2): The system cannot find the file specified.
makefile:138: recipe for target 'hello_world.obj' failed
gmake: *** [hello_world.obj] Error 2

這邊可以注意一下倒數第三行的錯誤訊息 make (e=2): The system cannot find the file specified.,也就是說,gmake 在編譯 hello_world.c 的時候,想去執行 tiarmclang 編譯器,但指定的路徑不存在或找不到檔案,因此報錯。而這大概有以下幾種原因,要嘛編譯器路徑錯誤,要不然就是版本不同。於是我去 ti/ccs2010/ccs/tools/compiler 路徑下找到 ti-cgt-armllvm_4.0.2.LTS,發現是版本不一致的問題,那這個就好解決了。一樣是修改 imports.mak 裡面對 CGT_TI_ARM_CLANG_PATH 的設定,讓它指向正確的編譯器路徑。

解決方法

跟上一篇雷同,打開 imports.mak,用 Ctrl + F 找到 CGT_TI_ARM_CLANG_PATH=$(CCS_PATH)/tools/compiler/ti-cgt-armllvm_3.2.2.LTS 和 CGT_TI_ARM_CLANG_PATH=$(TOOLS_PATH)/ti-cgt-armllvm_3.2.2.LTS,改成你想要用的版本。


舉例,我欲使用的版本為 ti-cgt-armllvm_4.0.2.LTS → 分別改成:

CGT_TI_ARM_CLANG_PATH=$(CCS_PATH)/tools/compiler/ti-cgt-armllvm_4.0.2.LTS

與

CGT_TI_ARM_CLANG_PATH=$(TOOLS_PATH)/ti-cgt-armllvm_4.0.2.LTS

改完後儲存,重新跑 gmake clean,再 gmake all 就可以正常運作了。



順帶一提,如果想使用特定版本,可以到 TI - ARM-CGT-CLANG 下載。

附錄彙整