初學stm32 --- CAN

目錄

CAN介紹

CAN總線拓撲圖

CAN總線特點

CAN應用場景

CAN物理層

CAN收發器芯片介紹

?CAN協議層

數據幀介紹

CAN位時序介紹?

數據同步過程

硬件同步

?再同步

CAN總線仲裁

STM32 CAN控制器介紹

CAN控制器模式

?CAN控制器模式

?CAN控制器框圖

發送處理

接收處理

?接收過濾器

CAN控制器位時序

CAN相關寄存器介紹(F1 / F4 / F7)

CAN主控制寄存器(CAN_MCR)

CAN位時序寄存器(CAN_BTR)

CAN 標識符寄存器(CAN_(T/R)IxR)

數據長度和時間戳寄存器(CAN_(T/R)DTxR)

?CAN低位數據寄存器(CAN_(T/R)DLxR)

?CAN高位數據寄存器(CAN_(T/R)DHxR)

?CAN過濾器位寬寄存器(CAN_FS1R)

CAN 過濾器FIFO關聯寄存器(CAN_FFA1R)

CAN 過濾器組x寄存器(CAN_FxR(1/2))

CAN相關HAL庫驅動介紹

CAN外設相關重要結構體:

結構體成員與寄存器情況

CAN基本驅動步驟

過濾器組設置實例:


CAN介紹

????????CAN(Controller Area Network),是ISO國際標準化的串行通信協議

????????為了滿足汽車產業的“減少線束的數量”、“通過多個LAN,進行大量數據的高速通信”的需求。

????????低速CAN(ISO11519)通信速率10~125Kbps,總線長度可達1000

????????高速CAN(ISO11898)通信速率125Kbps~1Mbps,總線長度≤40米(經典CAN)

????????CAN FD 通信速率可達5Mbps,并且兼容經典CAN,遵循ISO 11898-1 做數據收發

????????更多CAN的歷史知識,可以上CAN in Automation(CiA) 官網了解。

CAN總線拓撲圖

?????????終端電阻,用于阻抗匹配,以減少回波反射

????????CAN總線由兩根線( CANL CANH )組成,允許掛載多個設備節點(低速CAN:20 高速CAN:30)。

CAN總線特點

? 1)多主控制? ????????? ? ? ? 每個設備都可以主動發送數據

? 2)系統的柔軟性? ? ? ? ? ?沒有類似地址的信息,添加設備不改變原來總線的狀態

? 3)通信速度? ????????????????速度快,距離遠

? 4)錯誤檢測&錯誤通知&錯誤恢復功能

? 5)故障封閉? ????????????????判斷故障類型,并且進行隔離

? 6)連接節點多? ????????????速度與數量找個平衡

CAN應用場景

????????CAN總線協議已廣泛應用在汽車電子、工業自動化、船舶、醫療設備、工業設備等方面。

CAN物理層

????????CAN使用差分信號進行數據傳輸,根據CAN_HCAN_L上的電位差來判斷總線電平。

????????總線電平分為顯性電平(邏輯0)和隱性電平(邏輯1),二者必居其一。

????????顯性電平具有優先權發送方通過使總線電平發生變化,將消息發送給接收方

電平

高速CAN

低速CAN

顯性電平(0

UCAN_H – UCAN_L=? 2V

UCAN_H – UCAN_L = 3V

隱性電平(1

UCAN_H – UCAN_L = 0V

UCAN_H – UCAN_L = - 1.5V

CAN收發器芯片介紹

?CAN協議層

????????? CAN總線以“幀”形式進行通信。CAN協議定義了5種類型的幀:數據幀、遙控幀、錯誤幀、過載幀、間隔幀,其中數據幀最為常用。

數據幀介紹

????????數據幀由7段組成。數據幀又分為標準幀(CAN2.0A)和擴展幀(CAN2.0B),主要體現在仲裁段和控制段。

CAN位時序介紹?

????????CAN總線以“位同步”機制,實現對電平的正確采樣。位數據都由四段組成:同步段(SS)、傳播時間段(PTS)、相位緩沖段1(PBS1)和相位緩沖段2(PBS2),每段又由多個位時序Tq組成。

????????注意 : 節點監測到總線上信號的跳變在SS段范圍內,表示節點與總線的時序是同步,此時采樣點的電平即該位的電平。

????????采樣點是指讀取總線電平,并將讀到的電平作為位值的點。

????????根據位時序,就可以計算CAN通信的波特率。

數據同步過程

? ? ? ? 由于時鐘頻率誤差、傳輸上的相位延遲引起偏差,所以需要數據同步

????????CAN為了實現對總線電平信號的正確采樣,數據同步分為硬件同步和再同步。

硬件同步

? ? ? ? 節點通過CAN總線發送數據,一開始發送幀起始信號。總線上其他節點會檢測幀起始信號在不在位數據的SS段內,判斷內部時序與總線是否同步。

????????假如不在SS段內,這種情況下,采樣點獲得的電平狀態是不正確的。所以,節點會使用硬件同步方式調整, 把自己的SS段平移到檢測到邊沿的地方,獲得同步,同步情況下,采樣點獲得的電平狀態才是正確的。

?再同步

????????再同步利用普通數據位的邊沿信號(幀起始信號是特殊的邊沿信號)進行同步。

????????再同步的方式分為兩種情況:超前和滯后,即邊沿信號與SS段的相對位置。

????????再同步時,PSB1和PSB2中增加或者減少的時間被稱為“再同步補償寬度(SJW)”,其范圍:1~4 Tq

????????? 限定了SJW值后,再同步時,不能增加限定長度的SJW值。SJW值較大時,吸收誤差能力更強,但是通訊速度會下降。

????????

CAN總線仲裁

決定優先級

????????CAN總線處于空閑狀態,最先開始發送消息的單元獲得發送權。

????????多個單元同時開始發送時,從仲裁段(報文ID)的第一位開始進行仲裁。連續輸出顯性電平最多的單元可繼續發送,即首先出現隱性電平的單元失去對總線的占有權變為接收。

????????

?????????競爭失敗單元,會自動檢測總線空閑,在第一時間再次嘗試發送。

STM32 CAN控制器介紹

????????STM32 CAN控制器(bxCAN),支持CAN 2.0ACAN 2.0B Active版本協議。

????????CAN 2.0A 只能處理標準數據幀且擴展幀的內容會識別錯誤,而CAN 2.0B Active 可以處理標準數據幀和擴展數據幀。CAN 2.0B Passive只能處理標準數據幀且擴展幀的內容會忽略。

bxCAN主要特點:

???波特率最高可達1M bps

???支持時間觸發通信(CAN的硬件內部定時器可以在TX/RX的幀起始位的采樣點位置生成時間戳)

???具有3級發送郵箱

???具有3級深度的2個接收FIFO

???可變的過濾器組(最多28個)(F1只有14個)

CAN控制器模式

????????CAN控制器的工作模式有三種:初始化模式、正常模式和睡眠模式。

?CAN控制器模式

CAN控制器的測試模式有三種:靜默模式、環回模式和環回靜默模式。(初始化模式下進行配置

?CAN控制器框圖

?1CAN內核

????????包含各種控制/狀態/配置寄存器,可以配置模式、波特率等

2)發送郵箱

????????用來緩存待發送的報文,最多可以緩存3個報文

3)接收FIFO

????????緩存接收到的有效報文

4)接收過濾器

????????篩選有效報文

發送處理

接收處理

?接收過濾器

????????當總線上報文數據量很大時,總線上的設備會頻繁獲取報文,占用CPU。過濾器的存在,選擇性接收有效報文,減輕系統負擔。

????????每個過濾器組都有兩個32位寄存器CAN_FxR1CAN_FxR2。根據過濾器組的工作模式(位寬和選擇模式)不同,寄存器的作用不盡相同。

????????選擇模式可設置屏蔽位模式標識符列表模式,寄存器內容的功能就有所區別。

????????屏蔽位模式,可以選擇出一組符合條件的報文。寄存器內容功能相當于是否符合條件。

????????標識符列表模式,可以選擇出幾個特定ID的報文。寄存器內容功能就是標識符本身。

????????REG中bit值代表的是匹配與否:1必須匹配 0不用關心

????????屏蔽位寄存器中位值為1,表示與ID要必須匹配;位值為0,表示可不與ID匹配。

????????在使能過濾器情況下,總線上廣播的報文ID與過濾器的配置都不匹配,CAN控制器會丟棄該報文,不會進入到接收FIFO中。

????????注意:標識符選擇位IDE和幀類型RTR需要一致。不同過濾器組的工作模式可以設置為不同。

CAN控制器位時序

STM32CAN外設位時序分為三段:

????????同步段 SYNC_SEG、????????時間段1 BS1(PTS + PBS1、????????時間段2 BS2

STM32F103,設TS1=8TS2=7BRP=3,波特率 = 36000 / [( 9 + 8 + 1 ) * 4] = 500Kbps

STM32F407,設TS1=6TS2=5BRP=5,波特率 = 42000 / [( 7 + 6 + 1 ) * 6] = 500Kbps

? 注意:通信雙方波特率需要一致才能通信成功。

CAN相關寄存器介紹(F1 / F4 / F7)

CAN主控制寄存器(CAN_MCR

?INRQ位,用于控制初始化請求。

CAN位時序寄存器(CAN_BTR

?STM32F103,設TS1=8TS2=7BRP=3,波特率 = 36000 / [( 9 + 8 + 1 ) * 4] = 500Kbps

CAN 標識符寄存器(CAN_(T/R)IxR

?x范圍:1~3,3個發送郵箱????????????????x范圍:1~2,2個接收FIFO郵箱

?????????報文使用標準標識符,EXID[17:0]值無效

????????TxRQ位置1,請求郵箱發送

????????注意:報文使用擴展標識符時,STID[10:0]等效于EXID[28:18],與EXID[17:0]組成29位擴展標識符。

????????

數據長度和時間戳寄存器(CAN_(T/R)DTxR

?x范圍:1~3,3個發送郵箱????????????????x范圍:1~2,2個接收FIFO郵箱

????????注意:DLC是多少,數據內容就有多少字節被發送,并不是每次都發送8個字節數據。

?CAN低位數據寄存器(CAN_(T/R)DLxR

?CAN高位數據寄存器(CAN_(T/R)DHxR

使用時間戳功能DLC必須為8字節

CAN過濾器模式寄存器(CAN_FM1R

?CAN過濾器位寬寄存器(CAN_FS1R

????????注意:CAN外設只能使用的有的過濾器組,不能使用沒有的過濾器組。?

CAN 過濾器FIFO關聯寄存器(CAN_FFA1R

該寄存器決定了哪個FIFO寄存器有效(即RIxRRDTxRRDLxRRDHxR的‘x)?

CAN 過濾器組x寄存器(CAN_FxR(1/2)

CAN相關HAL庫驅動介紹

CAN外設相關重要結構體:

CAN_InitTypeDefCAN_FilterTypeDefCAN_(T/R)xHeaderTypeDef

CAN_InitTypeDefuint32_t Prescaler			/* 預分頻 */
uint32_t Mode				/* 工作模式 */
uint32_t SyncJumpWidth		/* 再次同步跳躍寬度 */
uint32_t TimeSeg1			/* 時間段1(BS1)長度 */
uint32_t TimeSeg2			/* 時間段2(BS2)長度 */
uint32_t TimeTriggeredMode	/* 時間觸發通信模式 */
uint32_t AutoBusOff			/* 總線自動關閉 */
uint32_t AutoWakeUp			/* 自動喚醒 */
uint32_t AutoRetransmission 	/* 自動重傳 */
uint32_t ReceiveFifoLocked		/* 接收FIFO鎖定 */
uint32_t TransmitFifoPriority	/*  傳輸FIFO優先級 */
CAN_FilterTypeDefuint32_t FilterIdHigh			/* ID高字節 */
uint32_t FilterIdLow			/* ID低字節 */
uint32_t FilterMaskIdHigh	 	/* 掩碼高字節 */
uint32_t FilterMaskIdLow		/* 掩碼低字節 */
uint32_t FilterFIFOAssignment	/* 過濾器關聯FIFO */
uint32_t FilterBank			/* 選擇過濾器組 */
uint32_t FilterMode			/* 過濾器模式*/
uint32_t FilterScale			/* 過濾器位寬 */
uint32_t FilterActivation		/* 過濾器使能 */
Uint32_t SlaveStartFilterBank 	/* 從CAN選擇啟動過濾器組 單CAN沒有意義*/

結構體成員與寄存器情況

?

CAN基本驅動步驟

1CAN參數初始化

????????工作模式、波特率等????????HAL_CAN_Init

2、使能CAN時鐘和初始化相關引腳

????????GPIO模式設為復用功能模式????????HAL_CAN_MspInit

3、設置過濾器

????????HAL_CAN_ConfigFilter 完成過濾器的初始化

4CAN數據接收和發送

????????HAL_CAN_AddTxMessage 發送消息

????????HAL_CAN_ GetRxMessage 接收數據

5、使能CAN相關中斷/設置NVIC/編寫中斷服務函數

????????__HAL_CAN_ENABLE_IT (可選)

過濾器組設置實例:

?

關于CAN中斷?

????????啟用 CAN 接收 FIFO0 消息掛起中斷

__HAL_CAN_ENABLE_IT(&g_can_handle_struct, CAN_IT_RX_FIFO0_MSG_PENDING);
  • __HAL_CAN_ENABLE_IT:這是 STM32 HAL 庫提供的一個宏,用于啟用 CAN 外設的中斷。
  • CAN_IT_RX_FIFO0_MSG_PENDING:這個參數表示啟用 CAN 接收 FIFO0 消息掛起中斷
    • 當 CAN 接收 FIFO0 中有新的消息并且該消息已經準備好時,控制器會觸發一個中斷,允許外部應用程序處理接收到的消息。
    • FIFO(先進先出隊列)用于存儲接收到的 CAN 消息,FIFO0 是第一個 FIFO 隊列,STM32 的 CAN 控制器通常有多個 FIFO 隊列。

是的,您的理解是正確的。進入掛起中斷后,您可以讀取 can_rxheader_struct.StdId,因為當 CAN 控制器收到數據并通過過濾器后,會將其存放到 FIFO 隊列中。中斷會在 FIFO 中有新消息時觸發,并通過 HAL 函數 HAL_CAN_GetRxMessage 將數據讀取出來。

詳細解釋:

1. CAN 接收機制概述
  • CAN 總線是一個廣播式協議,當總線上有設備發送消息時,所有連接的設備都能接收到這條消息。
  • 過濾器:CAN 控制器通常配置了過濾器來篩選感興趣的消息,只有經過過濾器允許的消息才會被接收并存儲到接收 FIFO 中。STM32 的 CAN 控制器可以通過配置多個過濾器來選擇哪些消息應當接收。
  • FIFO 隊列:接收到的有效消息會被存儲到接收 FIFO(如 FIFO0)。消息排隊存儲,等待被中斷服務程序處理。
2. 中斷觸發

當接收到一條消息,并且通過了過濾器的檢查后,消息就會被存儲到 FIFO 中。此時,如果啟用了接收中斷(例如通過 CAN_IT_RX_FIFO0_MSG_PENDING),并且 FIFO 中有新消息,CAN 中斷會被觸發

3. 讀取接收的消息
  • 在進入中斷處理函數 USB_LP_CAN1_RX0_IRQHandler 后,您可以通過 HAL_CAN_GetRxMessage 函數讀取接收到的消息,并將消息的相關信息(如標識符)和數據存儲到相應的結構體中。
  • 讀取的消息頭信息(如 StdIdIDERTRDLC 等)通常存儲在 CAN_RxHeaderTypeDef 結構體中
4. 總結
  • 數據是被動接收的:當總線上有數據并且經過了過濾器的過濾,符合條件的消息會被存儲到 FIFO 中。
  • 進入中斷后,可以讀取 can_rxheader_struct.StdId:一旦中斷被觸發,您可以通過 HAL_CAN_GetRxMessage 讀取消息的標識符和數據,標識符信息存儲在 can_rxheader_struct.StdId 中。
  • 過濾器的作用:過濾器用于篩選總線上接收到的消息,只有符合條件的消息才會存放到 FIFO 中,并觸發中斷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66197.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運輸層安全協議SSL

安全套接字層 SSL (Secure Socket Layer) SSL 作用在端系統應用層的 HTTP 和運輸層之間,在 TCP 之上建立起一個安全通道,為通過 TCP 傳輸的應用層數據提供安全保障。 應用層使用 SSL 最多的就是 HTTP,但 SSL 并非僅用于 HTTP,而是…

ZooKeeper 常見問題與核心機制解析

Zookeeper集群本身不直接支持動態添加機器。在Zookeeper中,集群的配置是在啟動時靜態定義的,并且集群中的每個成員都需要知道其他所有成員。當你想要增加一個新的Zookeeper服務器到現有的集群中時,你需要更新所有現有服務器的配置文件&#x…

【Sql遞歸查詢】Mysql、Oracle、SQL Server、PostgreSQL 實現遞歸查詢的區別與案例(詳解)

文章目錄 Mysql 5.7 遞歸查詢Mysql 8 實現遞歸查詢Oracle遞歸示例SQL Server 遞歸查詢示例PostgreSQL 遞歸查詢示例 更多相關內容可查看 Mysql 5.7 遞歸查詢 MySQL 5.7 本身不直接支持標準 SQL 中的遞歸查詢語法(如 WITH RECURSIVE 這種常見的遞歸查詢方式&#xf…

【Rust自學】13.2. 閉包 Pt.2:閉包的類型推斷和標注

13.2.0. 寫在正文之前 Rust語言在設計過程中收到了很多語言的啟發,而函數式編程對Rust產生了非常顯著的影響。函數式編程通常包括通過將函數作為值傳遞給參數、從其他函數返回它們、將它們分配給變量以供以后執行等等。 在本章中,我們會討論 Rust 的一…

【JavaScript】比較運算符的運用、定義函數、if(){}...esle{} 語句

比較運算符 !><> < 自定義函數&#xff1a; function 函數名&#xff08;&#xff09;{ } 判斷語句&#xff1a; if(判斷){ }else if(判斷){ 。。。。。。 }else{ } 代碼示例&#xff1a; <!DOCTYPE html> <html> <head><meta charset&quo…

WOA-Transformer鯨魚算法優化編碼器時間序列預測(Matlab實現)

WOA-Transformer鯨魚算法優化編碼器時間序列預測&#xff08;Matlab實現&#xff09; 目錄 WOA-Transformer鯨魚算法優化編碼器時間序列預測&#xff08;Matlab實現&#xff09;預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.Matlab實現WOA-Transformer鯨魚算法優化編…

25/1/15 嵌入式筆記 初學STM32F108

GPIO初始化函數 GPIO_Ini&#xff1a;初始化GPIO引腳的模式&#xff0c;速度和引腳號 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引腳0 GPIO輸出控制函數 GPIO_SetBits&#xff1a;將指定的GPIO引腳設置為高電平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 將GPIO…

mac m4 安裝 node

brew install node // 安裝 node //安裝的路徑在&#xff1a; /opt/homebrew/bin/node brew install node14 // brew install node22 // 安裝指定版本 如果需要設置環境變量&#xff1a;通過&#xff1a; which node 查找路徑 export PATH"/usr/local/opt/…

haproxy+nginx網站架構,實現負載均衡實驗筆記

前提準備&#xff1a; 兩臺nginx&#xff0c;一臺haproxynginx1&#xff1a;192.168.180.120nginx2&#xff1a;192.168.180.130&#xff0c;NFShaproxy&#xff1a;192.168.180.110 nginx&#xff08;兩臺nginx的操作是一樣的&#xff09;&#xff1a; 1. 安裝nginx #先安…

【C++篇】紅黑樹的實現

目錄 前言&#xff1a; 一&#xff0c;紅黑樹的概念 1.1&#xff0c;紅黑樹的規則 1.2&#xff0c;紅黑樹的最長路徑 1.3&#xff0c;紅黑樹的效率分析 二&#xff0c;紅黑樹的實現 2.1&#xff0c;紅黑樹的結構 2.2&#xff0c;紅黑樹的插入 2.2.1&#xff0c;大致過程…

如何在谷歌瀏覽器中設置自定義安全警告

隨著網絡環境的日益復雜&#xff0c;瀏覽器的安全問題也愈發引人關注。谷歌瀏覽器作為一款廣泛使用的瀏覽器&#xff0c;其自定義安全警告功能為用戶提供了更加個性化和安全的瀏覽體驗。本文將詳細介紹如何在谷歌瀏覽器中設置自定義安全警告&#xff0c;幫助用戶更好地保護自己…

Spring 6 第1章——概述

一.Spring是什么 Spring是一款主流的Java EE輕量級&#xff08;體積小、不需要依賴其它組件&#xff09;開源框架Spring的目的是用于簡化Java企業級應用的開發難度和開發周期Spring的用途不僅限于服務端的開發&#xff0c;從簡單性、可測試性和松耦合的角度而言&#xff0c;任…

C語言預處理藝術:編譯前的魔法之旅

大家好&#xff0c;這里是小編的博客頻道 小編的博客&#xff1a;就愛學編程 很高興在CSDN這個大家庭與大家相識&#xff0c;希望能在這里與大家共同進步&#xff0c;共同收獲更好的自己&#xff01;&#xff01;&#xff01; 本文目錄 引言正文一、預處理的作用與流程&#xf…

基于Springboot + vue實現的旅游網站

&#x1f942;(???)您的點贊&#x1f44d;?評論&#x1f4dd;?收藏?是作者創作的最大動力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 &#x1f525;&#x1f525;&…

docker-compose和docker倉庫

一、docker-compose 1.概述 docker-compose是一個自動編排工具&#xff0c;可以根據dockerfile自動化部署docker容器。 主要功能 配置定義 使用YAML文件&#xff08;通常命名為docker - compose.yml&#xff09;來描述應用程序的服務、網絡和卷等配置。 容器編排 可以同時…

MAC AndroidStudio模擬器無網絡

先確認PC端是正常訪問網絡的&#xff1b; 模擬器端修改Wifi設置&#xff1a;設置 - 網絡和互聯網 - WALN設置 按照上圖修改&#xff1b; IP設置&#xff1a;從DHCP修改為靜態&#xff0c;IP地址&#xff1a;10.0.2.16 &#xff0c;網關&#xff1a;10.0.2.2 &#xff0c; DNS…

Wireshark 使用教程:網絡分析從入門到精通

一、引言 在網絡技術的廣闊領域中&#xff0c;網絡協議分析是一項至關重要的技能。Wireshark 作為一款開源且功能強大的網絡協議分析工具&#xff0c;被廣泛應用于網絡故障排查、網絡安全檢測以及網絡協議研究等諸多方面。本文將深入且詳細地介紹 Wireshark 的使用方法&#x…

Java 面試題 - ArrayList 和 LinkedList 的區別,哪個集合是線程安全的?

Java 面試題 - ArrayList 和 LinkedList 的區別&#xff0c;哪個集合是線程安全的&#xff1f; 在 Java 開發中&#xff0c;ArrayList和LinkedList是兩個常用的集合類&#xff0c;它們在數據結構和性能上有諸多不同&#xff0c;同時線程安全性也各有特點。深入理解這些差異&am…

nvim 打造成可用的IDE(2)

上一個 文章寫的太長了&#xff0c; 后來再寫東西 就一卡一卡的&#xff0c;所以新開一個。 主要是關于 bufferline的。 之前我的界面是這樣的。 這個圖標很不舒服有。 后來發現是在這里進行配置。 我也不知道&#xff0c;這個配置 我是從哪 抄過來的。 測試結果&#xff1…

升級 SpringBoot3 全項目講解 — 為什么 SpringBoot3 應該拋棄 Maven,搭配 Gradle 來使用?

學會這款 &#x1f525;全新設計的 Java 腳手架 &#xff0c;從此面試不再怕&#xff01; 隨著 Spring Boot 3 的發布&#xff0c;許多開發者開始考慮如何將現有項目升級到最新版本。Spring Boot 3 帶來了許多新特性&#xff0c;包括對 Java 17 的支持、更好的性能優化以及對 G…