iT邦幫忙

0

AT32F403A + DM9058 實現高精度 PTP 時間同步(上篇):環境建置與平台 Bring-up

  • 分享至 

  • xImage
  •  

摘要

本文為上篇,介紹如何將 AT32F403A 微控制器搭配 DM9058 網路控制器作為 PTP End Slave 的完整環境建置流程,包括硬體連接、軟體初始化、以及平台 bring-up 的詳細步驟。

關鍵特色

  • 完整的三層 PTP 拓撲(Topology):GM → TC → ES
  • PTP One-Step 模式 + E2E Transparent Clock
  • 硬體時間戳記支援(DM9058)
  • 詳細的 AT32F403A + DM9058 Bring-up / 環境建置(⭐ 本文重點)
  • 完整程式碼範例與驗證方法

適用讀者

  • 嵌入式系統工程師
  • 工業自動化開發者
  • 時間同步系統研發人員
  • 對 IEEE 1588 PTP 感興趣的技術人員

1. 引言與背景

1.1 為什麼需要 PTP?

在現代工業自動化、測試測量、音視頻傳輸等領域,多個設備之間的高精度時間同步至關重要。傳統的 NTP(Network Time Protocol)只能提供毫秒級精度,無法滿足許多應用需求。

IEEE 1588 PTP 能夠實現:

  • Sub-microsecond 精度:同步精度可達 100 納秒以內
  • 硬體時間戳記:利用硬體捕捉精確時間
  • 確定性延遲:透過 Transparent Clock 修正網路延遲

1.2 本文實作目標

建立一個完整可驗證的 PTP 時間同步系統,並著重介紹 AT32F403A 作為 End Slave 的實作細節,包括:

  1. 硬體連接與初始化(SPI、GPIO、中斷配置)
  2. PTP Daemon 軟體整合
  3. 時間同步驗證方法
  4. 常見問題與除錯技巧

1.3 系統拓撲(Topology)概覽

本文使用以下固定拓撲(Topology)進行實作:

層次 設備 角色 協定
時間源 Raspberry Pi 3 + DM9058 Grandmaster (GM) PTPv2 One-Step, UDP/IPv4
網路中繼 Microchip KSZ9477 E2E Transparent Clock (TC) 硬體 PTP,CF 自動修正
同步目標 AT32F403A + DM9058 End Slave (ES) PTPv2 One-Step, UDP/IPv4

文章重點分配

  • 上篇(本文):AT32F403A + DM9058 Bring-up 與環境建置(如何跑起來)
  • 下篇:系統整合與測試(如何量測、如何除錯)

2. 系統架構

2.1 整體系統拓撲圖(System Topology)

以下圖展示完整的 PTP 時間同步拓撲(Topology),包含 Sync 與 Delay 訊息的雙向流向。

https://ithelp.ithome.com.tw/upload/images/20260302/20181669LkRMjeh7Ky.png

圖說:

  • 綠色:Grandmaster(時間源)
  • 金色:Transparent Clock(網路中繼,自動修正延遲)
  • 藍色:End Slave(本文實作重點)
  • 實線箭頭:Sync 訊息流向(Forward Path)
  • 虛線箭頭:Delay 訊息流向(Reverse Path)
  • CF:Correction Field(修正欄位)
  • S1 / S2(符號對照)
    • S1Sync 在透明時鐘(TC)內部的駐留時間(Sync Residence Time)
    • S2Delay_Req 在透明時鐘(TC)內部的駐留時間(Delay Residence Time)
  • S1 的計算Sync 封包進入 TC 的入埠時間戳(Ingress) 與離開 TC 的出埠時間戳(Egress) 之差,即 S1 = Egress - Ingress。TC 會把 S1 累加到該 SyncCorrectionField(Forward path 修正)。
  • S2 的計算Delay_Req 封包進入 TC 的入埠時間戳(Ingress) 與離開 TC 的出埠時間戳(Egress) 之差,即 S2 = Egress - Ingress。TC 會把 S2 累加到該封包的 CorrectionField(Reverse path 修正),讓後續計算能把「交換器內部造成的額外延遲」扣除掉,避免把它誤當成線路傳播延遲。
  • 注意:此處 TC 的 Ingress/Egress 時間戳與後面四步交換公式中的 t1, t2, t3, t4 是不同的量測點。四步交換的 t1~t4 是指 Master 與 Slave 之間的端點時間戳,而 S1/S2 是 TC 內部的駐留時間。

2.1.1 多個 End Slave 的完整拓撲(Multiple End Slaves Topology)

以下圖展示完整的 PTP 時間同步拓撲(Topology),包含一個 Grandmaster、一個 Transparent Clock,以及兩個 End Slave 的架構。

https://ithelp.ithome.com.tw/upload/images/20260302/20181669bMYnYYCmnr.png

圖說:

  • 綠色區域(時間源層):Grandmaster 作為唯一的時間源,向所有 End Slave 提供標準時間
  • 金色區域(網路中繼層):Transparent Clock 作為多端口交換機,同時處理兩個 End Slave 的 PTP 訊息
  • 藍色區域(同步目標層):兩個 End Slave 設備,每個都獨立與 GM 進行時間同步
  • 實線箭頭:Sync 訊息流向(Forward Path),從 GM 透過 TC 分發到各個 ES
  • 虛線箭頭:Delay_Req 與 Delay_Resp 訊息流向(Reverse Path),每個 ES 獨立進行延遲測量
  • CF 修正說明
    • S1_1, S1_2:各 ES 的 Sync 訊息在 TC 內的駐留時間(可能不同,取決於 TC 內部路由)
    • S2_1, S2_2:各 ES 的 Delay_Req 訊息在 TC 內的駐留時間
    • RT_1, RT_2:各 ES 的 Delay_Resp 訊息在 TC 內的駐留時間(Residence Time)

多 Slave 拓撲(Topology)特點

  1. 獨立同步:每個 End Slave 獨立計算自己的 Offset 與 Mean Path Delay
  2. TC 多端口處理:KSZ9477 作為多端口交換機,可同時處理多個 ES 的 PTP 訊息
  3. CF 獨立修正:每個 ES 的訊息在 TC 內的駐留時間可能不同,TC 會為每個訊息獨立修正 CF
  4. 擴展性:理論上可支援多個 ES(實際數量受 TC 端口數與網路頻寬限制)

2.2 PTP One-Step 訊息時序

PTP One-Step 模式的關鍵是時間戳記直接嵌入 Sync 訊息,因此本專案不使用 Two-Step 訊息

四步時間交換

  1. Sync(GM → TC → ES):Master 發送 Sync,t1 時間戳記嵌入訊息中
  2. Delay_Req(ES → TC → GM):Slave 發送延遲請求,記錄發送時間 t3
  3. Delay_Resp(GM → TC → ES):Master 回應,包含接收 Delay_Req 的時間 t4

Slave 計算 Offset

Offset = (t2 - t1 - CF_sync) - Mean_Path_Delay
Mean_Path_Delay = [(t2-t1-CF_sync) + (t4-t3-CF_delay)] / 2

2.3 E2E TC Correction Field (CF) 修正機制

E2E Transparent Clock 的核心功能是**累加網路駐留時間(Residence Time)**到 Correction Field。

CF 修正流程

訊息進入 TC → 記錄 Ingress 時間 → 處理與轉發 → 記錄 Egress 時間
→ 計算 Residence Time (RT = Egress - Ingress)
→ 更新 CF (CF_new = CF_old + RT) → 轉發修正後的訊息

修正範例

訊息 進入 TC 時 CF TC Residence 離開 TC 時 CF
Sync (GM→ES) 0 ns 350 ns 350 ns
Delay_Req (ES→GM) 0 ns 380 ns 380 ns
Delay_Resp (GM→ES) 0 ns 340 ns 340 ns

重要:Slave 在計算 Offset 時必須考慮所有 CF 修正值,才能獲得準確的時間偏移量。


3. 硬體配置

3.1 Grandmaster: Raspberry Pi 3 + DM9058(簡要)

角色:提供標準時間源(Master Clock)

硬體配置

  • 主控:Raspberry Pi 3
  • 網路介面:DM9058 10/100Mbps Ethernet(透過 SPI 連接)
  • 軟體:Linux PTP daemon (ptp4l)

設定重點

# RPi3 上的 ptp4l 配置
sudo ptp4l -i eth0 -m -S -l 6 -f master_config.cfg

master_config.cfg

[global]
clockClass        0
priority1         128
slaveOnly         0
twoStepFlag       0          # One-Step 模式
network_transport UDPv4
time_stamping     hardware  # 硬體時間戳記
delay_mechanism   E2E       # End-to-End 延遲機制

3.2 Transparent Clock: Microchip KSZ9477(簡要)

角色:E2E TC,自動修正網路延遲

特性

  • 硬體 PTP 支援:無需軟體處理,硬體自動更新 CF
  • 端口配置
    • Port 1 連接 RPi3(Grandmaster)
    • Port 2 連接 AT32F403A(End Slave)

配置方式
透過交換機管理介面啟用 PTP E2E TC 模式,具體步驟依廠商文件而定。

3.3 End Slave: AT32F403A + DM9058(⭐ 本文重點)

3.3.1 AT32F403A 微控制器

核心規格

  • 處理器:ARM Cortex-M4F @ 200MHz
  • Flash:1MB
  • RAM:224KB (96KB SRAM + 128KB extension)
  • 關鍵特性
    • 高精度定時器(用於 PTP 時鐘)
    • 多通道 SPI(與 DM9058 通訊)
    • 豐富的 GPIO(控制與中斷)

3.3.2 DM9058 網路控制器

核心規格

  • 網路介面:10/100Mbps Ethernet
  • 連接方式:SPI 模式(與 AT32F403A 通訊)
  • PTP 支援:硬體時間戳記能力(關鍵功能)

為什麼選擇 DM9058?

  1. 硬體時間戳記:能精確捕捉封包收發時間
  2. SPI 介面:適合嵌入式系統整合
  3. 成本效益:相較於內建 Ethernet 的高階 MCU

3.3.3 AT32F403A ↔ DM9058 硬體連接

接腳連接表(⭐ 實際專案配置):

AT32F403A Pin 功能 DM9058 Pin 說明
PA5 SPI1_SCK SCK SPI 時鐘(25 MHz,可配置)
PA6 SPI1_MISO MISO 主機輸入(Master In Slave Out)
PA7 SPI1_MOSI MOSI 主機輸出(Master Out Slave In)
PA15 SPI1_CS CS 片選(GPIO 控制,低電位有效)
PC7 GPIO EXINT7 INT 外部中斷 7(下降沿觸發)
GND Ground GND 共地
3.3V Power VCC 電源供應

硬體架構示意圖

https://ithelp.ithome.com.tw/upload/images/20260302/20181669iv0YRlQ0wR.png

圖說明

  • 藍色區域:AT32F403A 微控制器內部模組
    • CPU Core:32-bit RISC 處理器
    • Memory:1MB Flash + 224KB RAM
    • SPI1 Master(黃色):25 MHz SPI 介面,連接 DM9058
    • GPIO Control Pins:中斷控制(PC7)
    • UART:除錯輸出
  • 米色區域:DM9051 網路晶片功能模組
    • SPI Slave:接收 AT32F403A 指令
    • Interrupt Ctrl:封包事件通知
    • Timestamp Engine(紅色):硬體 PTP 時間戳記
    • MAC/PHY Layer:網路協定處理
    • RJ45:實體網路介面
  • 綠色區域:網路連接
    • Ethernet Cable 連接到 KSZ9477 Transparent Clock
  • 連接關係
    • SPI 雙向通訊(MOSI/MISO/SCK/CS)
    • INT 中斷信號(PC7,下降沿觸發)

4. 軟體架構

4.1 AT32F403A PTP Daemon 軟體分層

本專案採用分層架構設計,從應用層到硬體層清晰分離,各層透過定義良好的介面進行通訊。

https://ithelp.ithome.com.tw/upload/images/20260302/20181669HU78u8uLa9.png

圖說:

  • 綠色(應用層):系統初始化與主控邏輯
  • 藍色(PTP 協定層):IEEE 1588 協定實作核心
  • 橙色(網路層):lwIP TCP/IP 協議棧整合
  • 粉色(驅動層):DM9058 硬體驅動與 PTP 功能
  • 紫色(HAL 層):AT32F403A 硬體抽象
  • 灰色(硬體層):實體硬體元件

4.2 關鍵模組概略說明

本章節僅提供概略導讀:先告訴你「每一層主要看哪些檔案」,以及遇到問題時該從哪裡往下追。

層次 代表模組/檔案 主要責任
應用層 utilities/sc0101_ptp_daemon/src/main.c 系統初始化、主迴圈排程、PTP daemon 啟停(等待網路就緒後初始化)
PTP 協定層(ptpd) middlewares/3rd_party/ptpd-2.0.0/src/ptpd.cprotocol.cdep/servo.cbmc.c 協定狀態機、PTP 訊息處理、Clock Servo 校時(PI)、BMC 選主
網路層(lwIP 整合) middlewares/3rd_party/ptpd-2.0.0/src/dep/net.cutilities/dm9058_u2510_if/ethif.c UDP 319/320 收發、把硬體時間戳透過 pbuf 傳遞到協定層
驅動層(DM9058) utilities/dm9058_edriver_v1.6.1a/core/dm9058_beta.c.../dm9058_ptp.cutilities/dm9058_u2510_if/.../devif_ptp.c DM9058 初始化、PTP 時鐘(get/set/adjfreq)、TX/RX 硬體時間戳擷取與封包關聯
HAL/硬體層 utilities/dm9058_edriver_v1.6.1a/hal/*libraries/drivers/* SPI/DMA、EXINT 中斷、時鐘/定時器等底層硬體抽象

主迴圈的概念

  • 先把網路封包(尤其 PTP Event 封包)盡快收進來,再跑 PTP daemon 的狀態機與週期處理。
  • 因此你會看到 lwip_rx_loop_handler()ptp_daemon_state_machine()lwip_periodic_handle() 這類呼叫在主迴圈中反覆出現。

除錯建議(從上往下追)

  • 抓不到 PTP 封包:先看 ethif.c / devif_ptp.c(是否收得到、是否判定為 PTP)
  • 收得到但協定沒反應:看 dep/net.c(UDP 319/320 是否 bind、是否把 pbuf 丟給 ptpd)
  • 有進 ptpd 但時間不準:看 dep/servo.cdm9058_ptp.c(時間戳是否正確、校時介面是否生效)

4.3 關鍵介面與資料流

4.3.1 系統時間介面(PTP Servo ↔ DM9058 PTP)

servo.c                          dm9058_ptp.c
────────                         ────────────
getTime()      ──────────────>   dm9058_ptptime_gettime()
setTime()      ──────────────>   dm9058_ptptime_settime()
updateTime()   ──────────────>   dm9058_ptptime_updateoffset()
adjFreq()      ──────────────>   v51_ptp_time_adj_freq()

4.3.2 封包與時間戳的最小理解

  • RX(接收):DM9058 收到封包並產生硬體時間戳 → 驅動把時間戳寫入 pbuf->time_sec/nsecdep/net.c 把它交給 ptpd 協定處理(handle*())。
  • TX(發送):ptpd 組好 PTP Event 封包(Sync/Delay_Req)→ 驅動送出並讀回 TX 時間戳 → 必要時把時間戳回填/關聯到該封包。

想追完整 RX/TX 呼叫鏈時,再回頭看 devif_ptp.c(封包識別/時間戳關聯)與 dm9058_ptp.c(PTP clock + timestamp)。

4.4 專案目錄結構

at32f403a_dm9051a_ptp_daemon_trace/
├── project/                       # 範例工程(BSP/board 支援檔)
├── utilities/                     # 應用程式 + DM9058 驅動(主要工作區)
│   ├── sc0101_ptp_daemon/          # PTP 主程式(main / 網路啟動流程)
│   │   └── mdk_v5/                 # Keil MDK 專案檔(建置入口:*.uvprojx)
│   ├── dm9058_edriver_v1.6.1a/     # DM9058 驅動(含 PTP clock + timestamp)
│   └── dm9058_u2510_if/            # lwIP netif 與 PTP 封包關聯
├── middlewares/                   # lwIP + ptpd(協定核心)
│   ├── lwip_2.1.2/
│   └── 3rd_party/ptpd-2.0.0/
├── libraries/                     # AT32 官方 HAL/SDK
└── docs/                          # 文件與圖表

快速定位(建議只記這幾個)

  • PTP 主程式入口utilities/sc0101_ptp_daemon/src/main.c
  • PTP 協定核心(ptpd)middlewares/3rd_party/ptpd-2.0.0/src/
  • DM9058 PTP(時鐘+時間戳)utilities/dm9058_edriver_v1.6.1a/dm9058_edriver_extend/dm9058_ptp.c
  • lwIP netif 與 PTP 封包關聯utilities/dm9058_u2510_if/ethif.cutilities/dm9058_u2510_if/dm9058_edriver_extend/devif_ptp.c

5. AT32F403A 環境建置

本章節為文章重點,提供完整的環境建置流程與程式碼範例。

5.1 開發環境準備

5.1.1 必要工具

1. IDE 與編譯器

  • Keil MDK-ARM v5.x(推薦)或

2. 調試與燒錄工具

  • AT-Link-EZ CMSIS-DAP(推薦)或 J-Link

3. 軟體套件

  • AT32F403A Firmware Library(從官方下載)

5.1.2 硬體準備

清單:

  • [ ] AT32F403A 開發板
  • [ ] DM9058 SPI 模組
  • [ ] 杜邦線(連接 SPI 與中斷腳位)
  • [ ] Ethernet 網路線(連接到 KSZ9477 TC)
  • [ ] UART 轉 USB 模組(用於除錯輸出)
  • [ ] AT-Link-EZ 除錯器(CMSIS-DAP)

5.2 硬體連接步驟

步驟 1:SPI 接線

從 AT32F403A 到 DM9058 注意事項
PA5 SCK 時鐘線,需短且直
PA6 MISO 主機輸入
PA7 MOSI 主機輸出
PA15 CS 片選,低電位有效

步驟 2:中斷接線

從 AT32F403A 到 DM9058 說明
PC7 INT 下降沿觸發,需上拉

步驟 3:電源與地線

從 AT32F403A 到 DM9058
3.3V VCC
GND GND

⚠️ 重要:確保所有連接牢固,特別是 SPI 時鐘線和地線。不良連接會導致 SPI 通訊錯誤!

5.3 韌體編譯與燒錄

5.3.1 使用 Keil MDK 編譯

步驟 1:開啟專案

開啟檔案:utilities/sc0101_ptp_daemon/mdk_v5/ptp_daemon_f403a.uvprojx

步驟 2:配置 Target

  • 確認 Device: AT32F403ACGT7
  • Debug: 選擇 CMSIS-DAP Debugger
  • JTAG/SW Adapter: AT-Link-EZ CMSIS-DAP
  • Port: SW,Max Clock: 1MHz

步驟 3:編譯

選單 → Project → Build Target (F7)

步驟 4:燒錄

選單 → Flash → Download (F8)

5.4 AT32F403A 初始化配置

本專案的初始化分為四個主要部分:系統時鐘、SPI 通訊、外部中斷、DM9058 驅動。以下以文字說明配置要點,完整程式碼請參考 GitHub 專案。

5.4.1 系統時鐘配置(200MHz)

配置檔案utilities/sc0101_ptp_daemon/src/at32f403a_407_clock.c

時鐘來源與 PLL 配置

  • 外部振盪器(HSE):8 MHz
  • PLL 倍頻:× 50
  • PLL 分頻:÷ 2
  • 系統時鐘(SYSCLK):200 MHz

匯流排時鐘分配

匯流排 分頻器 頻率 用途
AHB ÷1 200 MHz CPU 核心
APB1 ÷2 100 MHz 低速周邊
APB2 ÷2 100 MHz 高速周邊(SPI1)

時鐘樹

HSE (8MHz) → PLL (*50÷2) → SYSCLK (200MHz)
                                ↓
            ┌───────────────────┼───────────────────┐
            ↓                   ↓                   ↓
    AHB (÷1, 200MHz)    APB1 (÷2, 100MHz)    APB2 (÷2, 100MHz)
            ↓                   ↓                   ↓
         Core               低速周邊             SPI1 (25MHz)

關鍵配置函式

  • crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_50, CRM_PLL_OUTPUT_RANGE_GT72MHZ) - 配置 PLL 倍頻 ×50
  • crm_ahb_div_set(CRM_AHB_DIV_1) - 設定 AHB 分頻器 ÷1
  • crm_apb1_div_set(CRM_APB1_DIV_2) - 設定 APB1 分頻器 ÷2
  • crm_apb2_div_set(CRM_APB2_DIV_2) - 設定 APB2 分頻器 ÷2(影響 SPI 時鐘)

5.4.2 SPI1 配置(25 MHz)

配置檔案utilities/dm9058_edriver_v1.6.1a/hal/SPI1/at32f403a_spi1_dma.c

SPI 參數配置

參數 設定值 說明
模式 Master AT32F403A 為主機
時鐘速度 25 MHz APB2 (100MHz) ÷ 4
數據寬度 8-bit 單字節傳輸
時鐘極性(CPOL) Low (0) 空閒時時鐘為低電平
時鐘相位(CPHA) 1 Edge (0) 第一個邊沿採樣
CS 控制 軟體模式 GPIO PA15 控制
傳輸方向 全雙工 同時收發

GPIO 配置

  • PA5:SPI1_SCK(複用功能)
  • PA6:SPI1_MISO(復用功能)
  • PA7:SPI1_MOSI(複用功能)
  • PA15:CS 片選(GPIO 輸出,需釋放 JTAG 功能)

特殊配置

// AT32F403A 需釋放 PA15 的 JTAG 功能
gpio_pin_remap_config(SWJTAG_GMUX_010, TRUE);

SPI 通訊流程

  1. CS 拉低(選中 DM9058)
  2. 發送命令字節(讀/寫 + 暫存器位址)
  3. 發送/接收數據字節
  4. CS 拉高(結束通訊)

5.4.3 外部中斷配置(EXINT7, PC7)

配置檔案at32f403a_int7.c

中斷參數配置

參數 設定值 說明
GPIO 腳位 PC7 連接 DM9058 INT 信號
中斷線 EXINT_LINE_7 外部中斷線 7
觸發方式 下降沿 DM9058 INT 為低電位有效
GPIO 模式 輸入 + 上拉 空閒時保持高電平
中斷向量 EXINT9_5_IRQn EXINT5-9 共用
優先級組 NVIC_PRIORITY_GROUP_4 4 位 preemption priority

中斷處理流程

  1. 檢查 EXINT7 旗標
  2. 設定 dm9058_interrupt_event = 1(通知主迴圈)
  3. 清除中斷旗標
  4. 返回

中斷事件

  • 封包接收完成
  • 封包發送完成
  • PHY 連結狀態變化

5.4.4 DM9058 初始化流程

配置檔案dm9058_beta.c

初始化步驟

  1. 晶片 ID 驗證

    • 讀取暫存器 DM9058_PIDL
    • 預期值:0x58(DM9058)
    • 完整 ID:0x9058
  2. MAC 位址配置

    • 寫入 6 bytes 到 PAR 暫存器(0x10-0x15)
    • 範例 MAC:00:60:6E:E2:7C:BB
  3. PTP 功能啟用(依晶片版本而定)

    • 硬體時間戳記功能
    • 參考 DM9058 Datasheet

初始化成功標誌

[DRIVER INT mode] DM9058 found: 9058
PTP Transport: UDP over IPv4
LWIP: Network interface added successfully
LWIP: Getting MAC address from DM9058...
reg mac 00 60 6e e2 87 6b
LWIP: Network interface MAC address updated
LWIP: Setting default network interface...

💡 技巧:完整的初始化程式碼(含錯誤處理、DMA 配置等)約 500 行,建議直接參考專案原始碼。本節僅列出關鍵配置參數,幫助理解整體架構。

5.5 PTP Daemon 配置與啟動

5.5.1 PTP 配置參數

PTP 協定參數來自 PTPd 的常數與 ptpClock->defaultDS,於 PTPd 初始化時由 initData() 寫入。

實際配置來源

參數概念 實際位置 說明
One-Step / Two-Step constants.hDEFAULT_TWO_STEP_FLAG FALSE = One-Step(時間戳直接嵌入 Sync)
僅 Slave 模式 constants.hSLAVE_ONLY TRUE = 僅從時鐘,不參與 BMC 競選 Master
延遲機制 constants.hDEFAULT_DELAY_MECHANISM E2E
Sync 間隔 constants.hDEFAULT_SYNC_INTERVAL 0 → 2^0 = 1 秒
twoStepFlag 寫入 bmc.cinitData() ptpClock->defaultDS.twoStepFlag = DEFAULT_TWO_STEP_FLAG;
DefaultDS 結構 datatypes.hDefaultDS twoStepFlagslaveOnlydomainNumber

constants.h 摘錄middlewares/3rd_party/ptpd-2.0.0/src/constants.h):

#define DEFAULT_TWO_STEP_FLAG    FALSE  /* One-Step:僅 SYNC,時間戳在 Sync 內 */
#define SLAVE_ONLY               TRUE   /* 僅 Slave 模式 */
#define DEFAULT_DELAY_MECHANISM  E2E
#define DEFAULT_SYNC_INTERVAL    0      /* 2^0 = 1 秒 */

bmc.c 摘錄initData() 內):

ptpClock->defaultDS.twoStepFlag = DEFAULT_TWO_STEP_FLAG;

5.5.2 主程式流程

main.c 主要流程(參考 utilities/sc0101_ptp_daemon/src/main.c):

int main(void)
{
    /* 1. 系統初始化 */
    system_clock_config();           // 200MHz 時鐘
    at32_board_init();
    uart_print_init(115200);
    print_version_info();
    nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

    /* 2. 網路驅動初始化 */
    emac_tmr_init();                 // TMR6 用於 local_time 更新
    tcpip_stack_init();              // lwIP 協定棧

    printf("[MAIN] Waiting for network connection...\r\n");

    /* 3. 主迴圈 */
    for (;;)
    {
        lwip_rx_loop_handler();      // 網路封包接收
        ptp_daemon_state_machine();  // PTP 狀態機(DHCP 後啟動)
        lwip_periodic_handle(local_time);  /* lwIP timeout handle - 包含 PTP 協定計時器 */
    }
}

PTP Daemon 狀態機(簡化版):

/* 狀態:WAITING_NETWORK → INITIALIZING → RUNNING */
static void ptp_daemon_state_machine(void)
{
    switch (ptp_daemon_state)
    {
    case PTP_STATE_WAITING_NETWORK:
        if (network_dhcp_is_bound()) {
            ptp_daemon_state = PTP_STATE_INITIALIZING;
        }
        break;

    case PTP_STATE_INITIALIZING:
        if (PTPd_Init() == 0) {
            ptp_daemon_state = PTP_STATE_RUNNING;
            ptp_rtc_sync_enable(true);
        }
        break;

    case PTP_STATE_RUNNING:
        ptpd_Periodic_Handle(local_time);
        break;
    }
}

完整代碼:請參考 utilities/sc0101_ptp_daemon/src/main.c,包含錯誤處理與重試機制。

5.6 編譯與燒錄驗證

5.6.1 編譯輸出

正常編譯後,輸出應類似:

Build target 'AT32F403A_PTP'
compiling main.c...
compiling dm9058_beta.c...
linking...
Program Size: Code=124568 RO-data=8756 RW-data=2048 ZI-data=51200
".\Objects\ptp_daemon.axf" - 0 Error(s), 0 Warning(s).

5.6.2 首次燒錄驗證

步驟 1:連接 UART(115200 baud, 8N1)

步驟 2:燒錄韌體

步驟 3:觀察序列埠輸出

========================================
  AT32F403A DM9058 PTP Daemon
========================================
Version:     2.0.0
Build Date:  Jan 23 2026
Build Time:  13:48:28
Git Commit:  0dda3de35c76
Git Date:    Fri Jan 23 2026 13:40:33 GMT+08:00 (CST)
========================================

[INIT] Configuring TMR6 for local_time updates
LWIP: Initializing lwIP stack...
LWIP: DHCP mode - setting IP addresses to 0.0.0.0

[AT32F403a]
tcpip_stack_init
[SPI Instance]
 at32f403a_spi1_dma.c
 AT32F403A ETHERNET SPI1 DMA
[SPI Pins]
 sck/mosi/miso/ pa5/pa7/pa6, cs/ pa15
[DRIVER init] AT32F403A INT Running...
[DRIVER init] AT32F403A INTERRUPT GPIO
[DRIVER init] int/ pc7
[hal] at32f403a_spi1 'spi' Running 25Mhz...
[core] dm9058_constants 'INT' Running...
 (apb2_freq) 100Mhz, set SPI CLK 25Mhz
[DRIVER INT mode] CLK:200000000(sclk_freq) 200000000 100000000(apb2_freq) 100000000(apb1_freq)
[DRIVER INT mode] SPI CLK use apb2_freq 100Mhz, set to 25Mhz
[DRIVER INT mode] DM9058 found: 9058
PTP Transport: UDP over IPv4
****** dm9058 Rate: +0x00000000 (+0) - Clock adjusted to be faster
LWIP: Network interface added successfully
LWIP: Getting MAC address from DM9058...
reg mac 00 60 6e e2 87 6b
LWIP: Network interface MAC address updated
LWIP: Setting default network interface...
LWIP: Bringing up network interface...
LWIP: Setting link callback...
LWIP: Checking initial link status...
LWIP: Link is UP - network ready
LWIP: Network stack initialization completed
[INIT] System initialization completed
[INIT] Waiting for network connection...
DHCP: No DHCP client data available
Link: State changed from UNKNOWN to UP

如果看到以上輸出,恭喜!AT32F403A + DM9058 硬體平台已準備就緒。


6. 本篇成果(平台 bring-up 成功)

6.1 硬體實體設置圖

以下為本專案實際使用的硬體平台實體設置圖,展示了完整的 PTP 時間同步測試環境:

https://ithelp.ithome.com.tw/upload/images/20260302/20181669zRlSR3K2uC.png

硬體配置說明

本實驗平台主要由三個核心元件組成,透過乙太網路線和信號跳線連接,構成一個完整的 PTP 時間同步驗證系統:

  1. Raspberry Pi 3 + DM9058(左上角)

    • 作為 PTP Grandmaster (GM),提供標準時間源
    • Raspberry Pi 3 開發板裝在透明塑膠外殼中
    • 多條彩色跳線從 SPI 連接到 DM9058,用於控制信號、中斷
    • 整合 DM9058 乙太網路控制器模組
    • 透過藍色乙太網路線連接到 KSZ9477 交換器
    • USB 線用於供電
  2. Microchip KSZ9477 乙太網路交換器(右側中央)

    • 作為 E2E Transparent Clock (TC),自動修正網路延遲
    • 大型綠色 PCB 評估板,標示為 "Microchip KSZ9477"
    • 擁有多個乙太網路埠,連接不同的 PTP 節點
    • 從 Raspberry Pi 過來的藍色乙太網路線連接到其中一個埠
    • 另一條灰色乙太網路線連接到 AT32F403A 裝置
    • 硬體 PTP 支援,無需軟體處理即可自動更新 Correction Field (CF)
  3. AT32F403A + DM9058(左下角)

    • 作為 PTP End Slave (ES),本文實作重點
    • 白色開發板,標示為 "AT32F403A"
    • 綠色 PCB 小板(帶狀態 LED)插在 AT32F403A 板上為 DM9058
    • 從小板引出的灰色乙太網路線連接到 Microchip KSZ9477 交換器
    • 多條彩色跳線 SPI 連接到中繼小板DM9058,用於控制信號、中斷
    • USB 線用於供電、程式燒錄或序列埠通信

系統拓撲(Topology)說明

  • Microchip KSZ9477 充當網路骨幹,連接 Raspberry Pi 和 AT32F403A 這兩個 PTP 節點
  • Raspberry Pi 3 + DM9058 扮演 PTP 主時鐘 (Master),提供標準時間
  • AT32F403A + DM9058 扮演從時鐘 (Slave),同步到 Master 的時間
  • 彩色跳線連接可能用於提供額外的同步信號(如 PPS, Pulse Per Second),或用於監控關鍵狀態,以精確測量 PTP 的同步性能和延遲

此設置旨在驗證 AT32F403A 和 Raspberry Pi 搭配 DM9058 乙太網路模組,在通過 Microchip KSZ9477 交換機連接的網路環境下,實現 PTP 精確時間同步的功能及效能。


結語

這一篇的目標,是把「AT32F403A + DM9058 + lwIP + PTP daemon」這條鏈路先跑起來、再跑穩

  • 硬體連接、SPI/中斷、驅動初始化
  • 網路層先就緒(link/DHCP 或靜態 IP),再啟動 PTP
  • 你能在 UART 上清楚看到:初始化成功、狀態機前進,以及週期性輸出 offset / mean path delay

到這一步,已經完成工程現場最困難的部份:把平台 bring-up 變成可運作的流程。


中篇與下篇預告

中篇預告

中篇中,我們將深入探討:

  1. PTP 系統運行成果展示

    • 網路層初始化成功驗證
    • PTP daemon 狀態機轉換過程
    • 周期性 Offset 與 Mean Path Delay 輸出分析
  2. 時間同步精度驗證

    • 如何量測 PTP 同步精度
    • Offset 收斂過程分析
    • Clock Servo 控制迴路調校
  3. 常見問題與除錯技巧

    • 網路連線問題排查
    • PTP 封包收發除錯
    • 時間戳記準確性驗證
  4. 系統整合測試

    • 多個 End Slave 同時運行的驗證
    • Transparent Clock CF 修正機制驗證
    • 長時間穩定性測試

中篇將幫助您

  • 理解 PTP 系統的運行機制
  • 掌握時間同步精度的量測方法
  • 學會系統除錯與優化技巧

下篇預告

下篇中,我們將深入探討:

  1. 系統整合與測試

    • 完整的測試前置 Checklist
    • 系統啟動順序與驗證流程
    • Wireshark 抓包技巧與必要欄位
  2. 兩點抓包驗證 TC CorrectionField(⭐ 下篇核心):

    • 端點兩點抓包方案(GM 端 + ES 端)
    • 封包配對與 ΔCF 計算
    • CorrectionField 單位轉換與統計分析
  3. 工程實作導向的驗證方法

    • 可重現、可量化、可除錯的測試流程
    • 完整的測試結果報告模板
    • 常見問題排查 SOP

下篇將幫助您

  • 使用兩點抓包證明 TC 的 CorrectionField 累加機制
  • 形成工程現場可直接照做的測試 SOP
  • 掌握故障排除手冊與驗證方法

下篇定位:工程實作導向(可重現、可量化、可除錯),使用「兩點抓包」證明 correctionField 在路徑中被累加。


專有名詞對照表(Terminology)

中文 英文 縮寫 說明
拓撲 Topology - 網路設備的連接結構
精確時間協定 Precision Time Protocol PTP IEEE 1588 標準
透明時鐘 Transparent Clock TC 修正網路延遲的中間設備
修正欄位 Correction Field CF PTP 訊息中累加延遲的欄位
駐留時間 Residence Time - 訊息在 TC 內部的停留時間
主時鐘 Grandmaster GM 提供時間源的 PTP Master
從時鐘 Slave Clock - 同步到 Master 的設備
時間戳記 Timestamp - 精確的時間記錄
偏移量 Offset - Slave 與 Master 的時間差
單步模式 One-Step - 時間戳記直接嵌入 Sync 訊息
端對端 End-to-End E2E 延遲測量機制

參考資料

  1. Artery Technology 原始碼套件(移植來源)SC0101_AT32F407_437_PTP_Daemon_V2.0.0.zip(本專案以其 PTP daemon 整合架構為基礎,移植到 AT32F403A 平台)
  2. IEEE 1588-2008: IEEE Standard for a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems
  3. AT32F403A Datasheet: Artery Technology AT32F403A/407 Series MCU Datasheet
  4. DM9058 Datasheet: Davicom DM9058 10/100Mbps Ethernet Controller
  5. KSZ9477 User Guide: Microchip KSZ9477 7-Port Gigabit Ethernet Switch with PTP
  6. LinuxPTP Documentation: http://linuxptp.sourceforge.net/
  7. lwIP Documentation: https://www.nongnu.org/lwip/

附錄:原始碼連結

  • 程式碼來源:Artery Technology SC0101_AT32F407_437_PTP_Daemon_V2.0.0.zip(移植基礎)
  • DM9058 驅動: dm9058_edriver_v1.6.1a

下一篇:AT32F403A + DM9058 實現高精度 PTP 時間同步(中篇):成果展示與驗證


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言