AsyncUDP_STM32 庫
目錄
- v1.3.0 的重要變化
- 為什麼我們需要這個 AsyncUDP_STM32 庫
- 變更日誌
- 先決條件
- 安裝
- 使用 Arduino 庫管理器
- 手動安裝
- VS Code 和 PlatformIO
- 包的補丁
- 1. STM32板使用LAN8720
- 2. STM32板使用Serial1
- 如何修復
Multiple Definitions
連結器錯誤 - 如何設定異步 UDP 用戶端
- 如何使用 STM32F4 和 LAN8720
- 1. 接線
- 2. 使用 STLink V-2 或 V-3 的 HOWTO 程序
- 3. 如何使用串列埠進行調試
- 範例
- 1. 異步UDP客戶端
- 2.AsyncUdpNTPClient
- 3. 異步UdpSendReceive
- 4. 異步UDP伺服器
- 5.AsyncUDP多播伺服器
- 6.AsyncUDPClient_LAN8720
- 7.AsyncUdpNTPClient_LAN8720
- 8.AsyncUdpSendReceive_LAN8720
- 9. 異步UDP伺服器_LAN8720
- 10.AsyncUDP多播伺服器_LAN8720
- 11.多檔案項目新建
- 12.multiFileProject_LAN8720新建
- AsyncUdpNTPClient 範例
- 1. 文件AsyncUdpNTPClient.ino
- 2. 文件define.h
- 調試終端輸出範例
- 1. STM32F7 NUCLEO_F767ZI 上的 AsyncUdpNTPClient 和 LAN8742A 乙太網路使用 STM32Ethernet 函式庫
- 2. STM32F4 BLACK_F407VE 上的 AsyncUdpNTPClient_LAN8720 以及使用 STM32Ethernet 庫的 LAN8720 乙太網路
- 偵錯
- 故障排除
- 問題
- 待辦事項
- 完畢
- 貢獻和致謝
- 貢獻
- 執照
- 版權
v1.3.0 的重要變化
請查看如何修復Multiple Definitions
連結器錯誤
使用 LAN8720 的Generic STM32F4 series
闆卡,例如 STM32F407VE,請使用 STM32 core v2.2.0
,因為破壞 core v2.3.0
會導致編譯錯誤。將在不久的將來修復。
為什麼我們需要這個 AsyncUDP_STM32 庫
特徵
此 AsyncUDP_STM32 庫是一個完全非同步的 UDP 庫,專為無故障、多連接網路環境而設計,適用於使用 LAN8720 或內建 LAN8742A 乙太網路的 STM32 板。該庫易於使用,並且支援單播、廣播和多播環境。
該庫基於並修改自:
- 赫里斯托·戈奇科夫 (Hristo Gochkov) 的 ESPAsyncUDP
使用 LAN8720 或內建 LAN8742A 乙太網路將強大的ESPAsyncUDP 庫的更好更快的非同步功能應用到 STM32 板中。
為什麼非同步更好
- 使用非同步網路意味著您可以同時處理多個連接
- 一旦請求準備好並被解析,您就會被呼叫
- 當您發送回應時,您可以立即準備好處理其他連接,同時伺服器正在後台發送回應
- 速度真是天哪
- 作為非同步客戶端連接到 UDP 伺服器後,您可以立即準備好處理其他連接,同時用戶端在後台負責接收 UDP 回應資料包。
- 您不需要在緊密循環()中檢查 UDP 回應資料包的到達來處理它們。
目前支援的主機板
- 內建乙太網路 LAN8742A 的 STM32 板,例如:
- Nucleo-144(F429ZI、F767ZI)
- 發現(STM32F746G-DISCOVERY)
- 所有具有 32K+ 快閃記憶體、內建乙太網路的 STM32 板 (STM32F/L/H/G/WB/MP1)
- 查看EthernetWebServer_STM32支援和測試結果
- 使用乙太網路LAN8720的STM32板例如:
- Nucleo-144(F429ZI、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)
- 發現 (DISCO_F746NG)
- STM32F4 板(BLACK_F407VE、BLACK_F407VG、BLACK_F407ZE、BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
先決條件
- 適用於 Arduino 的
Arduino IDE 1.8.19+
。 - 適用於 STM32 板
Arduino Core for STM32 v2.3.0+
。 -
STM32Ethernet library v1.3.0+
適用於內建 LAN8742A 乙太網路(Nucleo-144、Discovery)。 -
LwIP library v2.1.2+
適用於內建 LAN8742A 乙太網路(Nucleo-144、Discovery)。
安裝
建議的安裝方法是:
使用 Arduino 庫管理器
最好的方法是使用Arduino Library Manager
。搜尋AsyncUDP_STM32
,然後選擇/安裝最新版本。您還可以使用此連結獲取更詳細的說明。
手動安裝
- 導覽至 AsyncUDP_STM32 頁面。
- 下載最新版本
AsyncUDP_STM32-master.zip
。 - 將 zip 檔案解壓縮到
AsyncUDP_STM32-master
目錄 - 將整個
AsyncUDP_STM32-master
資料夾複製到 Arduino 庫目錄,例如~/Arduino/libraries/
。
VS 程式碼和平台IO:
- 安裝 VS 代碼
- 安裝平台IO
- 使用庫管理器安裝AsyncUDP_STM32庫。在 Platform.io 作者的庫中搜尋 AsyncUDP_STM32
- 使用範例中包含的 platformio.ini 檔案來確保自動安裝所有相依性庫。請存取專案設定檔中的其他選項和範例文檔
包的補丁
1. STM32板使用LAN8720
使用LAN8720
的Generic STM32F4 series
闆卡,例如STM32F407VE
,請使用 STM32 core v2.2.0
,因為破壞 core v2.3.0
會導致編譯錯誤。
在某些STM32板上使用LAN8720
- Nucleo-144(F429ZI、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)
- 發現 (DISCO_F746NG)
- STM32F4 板(BLACK_F407VE、BLACK_F407VG、BLACK_F407ZE、BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
您必須將檔案 stm32f4xx_hal_conf_default.h 和 stm32f7xx_hal_conf_default.h 複製到 STM32 stm32 目錄(~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system)以覆寫舊檔案。
假設STM32 stm32核心版本是2.2.0。必須將這些檔案複製到目錄中:
- STM32F4 的
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h
。 - Nucleo-144 STM32F7 的
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h
。
每當安裝新版本時,請記住將此檔案複製到新版本目錄中。例如,新版本是x.yy.zz,則必須將這些檔案複製到對應的目錄中:
-
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.h
- `~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F7xx/stm32f7xx_hal_conf_default.h
2. STM32板使用Serial1
要在某些沒有 Serial1 定義的 STM32 板上使用 Serial1(Nucleo-144 NUCLEO_F767ZI、Nucleo-64 NUCLEO_L053R8 等)板,您必須將檔案 STM32variant.h 複製到 STM32 stm32 152 stm32 硬體目錄/package/32/32 stm32 152 stm32/152/package/32/32 stm32 目錄1/32/15. /stm32/2.3.0)。您必須修改與您的板相對應的文件,這只是一個範例。
假設STM32 stm32核心版本是2.3.0。必須將這些檔案複製到目錄中:
-
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h
適用於 Nucleo-144 NUCLEO_F767ZI。 -
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h
適用於 Nucleo-64 NUCLEO_L053R8。
每當安裝新版本時,請記住將此檔案複製到新版本目錄中。例如,新版本是x.yy.zz,則必須將這些檔案複製到對應的目錄中:
-
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_F767ZI/variant.h
-
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_L053R8/variant.h
如何修復Multiple Definitions
連結器錯誤
目前的函式庫實作使用xyz-Impl.h
而不是標準xyz.cpp
,在某些用例中可能會產生某些Multiple Definitions
連結器錯誤。
您可以包含此.hpp
文件
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " AsyncUDP_STM32.hpp " // https://github.com/khoih-prog/AsyncUDP_STM32
在許多文件中。但請務必在 1 個.h
、 .cpp
或.ino
檔案中使用以下.h
文件,不得將其包含在任何其他文件中,以避免Multiple Definitions
連結器錯誤
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
# include " AsyncUDP_STM32.h " // https://github.com/khoih-prog/AsyncUDP_STM32
檢查新的multiFileProject範例以取得HOWTO
演示。
如何設定異步 UDP 用戶端
# include < LwIP.h >
# include < STM32Ethernet.h >
# include < AsyncUDP_STM32.h >
byte mac[] = { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x01 };
IPAddress timeWindowsCom = IPAddress( 13 , 86 , 101 , 172 );
# define NTP_REQUEST_PORT 123
const int NTP_PACKET_SIZE = 48 ; // NTP timestamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
AsyncUDP Udp;
// send an NTP request to the time server at the given address
void createNTPpacket ( void )
{
...
}
void sendNTPPacket ( void )
{
createNTPpacket ();
// Send unicast
Udp. write (packetBuffer, sizeof (packetBuffer));
}
void parsePacket (AsyncUDPPacket packet)
{
...
}
void setup ()
{
...
// NTP requests are to port NTP_REQUEST_PORT = 123
if (Udp. connect (timeWindowsCom, NTP_REQUEST_PORT))
{
// Setting up Async packet Handler
Udp. onPacket ([](AsyncUDPPacket packet)
{
parsePacket (packet);
});
}
}
void loop ()
{
sendNTPPacket ();
// wait 60 seconds before asking for the time again
delay ( 60000 );
}
如何使用 STM32F4 和 LAN8720
1. 接線
這是使用LAN8720的STM32F4(BLACK_F407VE等)的接線
LAN8720 物理層 | <---> | STM32F4 |
---|
TX1 | <---> | PB_13 |
TX_EN | <---> | PB_11 |
TX0 | <---> | PB_12 |
接收0 | <---> | 電腦_4 |
接收1 | <---> | 電腦_5 |
nINT/RETCLK | <---> | PA_1 |
慢性RS | <---> | PA_7 |
MDIO | <---> | PA_2 |
多維資料中心 | <---> | 電腦_1 |
接地 | <---> | 接地 |
電壓控制電路 | <---> | +3.3V |
2. 使用 STLink V-2 或 V-3 的 HOWTO 程序
連接如下。若要進行編程,請使用STM32CubeProgrammer或 Arduino IDE
- U(S)ART 支援:“已啟用(通用序列)”
- 上傳方式:“STM32CubeProgrammer (SWD)”
意法通 | <---> | STM32F4 |
---|
時脈訊號 | <---> | 時脈訊號 |
SWDIO | <---> | SWDIO |
RST | <---> | 國家科學技術研究院 |
接地 | <---> | 接地 |
5V | <---> | 5V |
3. 如何使用串列埠進行調試
依下列方式連接 FDTI(USB 轉串口):
FDTI | <---> | STM32F4 |
---|
接收 | <---> | 發送=PA_9 |
TX | <---> | 接收=PA_10 |
接地 | <---> | 接地 |
範例
- 異步UDP客戶端
- 異步UDPNTP客戶端
- 非同步UDP發送接收
- 異步UDP伺服器
- 異步UDP組播伺服器
- AsyncUDPClient_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- 異步UDP伺服器_LAN8720
- AsyncUDP多播伺服器_LAN8720
- 多檔案項目新建
- multiFileProject_LAN8720新
AsyncUdpNTPClient 範例
1. 文件AsyncUdpNTPClient.ino
| #包含“ define.h ” |
| #包含<時間.h > |
| |
| // 0.ca.pool.ntp.org |
| IP 位址 timeServerIP = IP 位址( 208 , 81 , 1 , 244 ); |
| // time.nist.gov |
| // IP 位址 timeServerIP = IP 位址(132, 163, 96, 1); |
| |
| #定義NTP_REQUEST_PORT 123 |
| |
| // char timeServer[] = "time.nist.gov"; // NTP伺服器 |
| char timeServer[] = " 0.ca.pool.ntp.org " ; |
| |
| 常數int NTP_PACKET_SIZE = 48 ; // NTP時間戳位於訊息的前48位元組中 |
| |
| 位元組 packetBuffer[NTP_PACKET_SIZE]; //用於保存傳入和傳出資料包的緩衝區 |
| |
| //一個 UDP 實例,讓我們透過 UDP 傳送和接收封包 |
| 異步UDP UDP; |
| |
| //向給定位址的時間伺服器發送 NTP 請求 |
| 無效建立NTP包(無效) |
| { |
| 連續劇。 println ( " =============createNTPpacket ============= " ); |
| |
| //將緩衝區中的所有位元組設定為 0 |
| memset (packetBuffer, 0 , NTP_PACKET_SIZE); |
| //初始化形成 NTP 請求所需的值 |
| // (有關資料包的詳細信息,請參閱上面的 URL) |
| |
| packetBuffer[ 0 ]= 0b11100011 ; // LI、版本、模式 |
| 資料包緩衝區[ 1 ]= 0 ; //層數,或時鐘類型 |
| packetBuffer[ 2 ]= 6 ; //輪詢間隔 |
| packetBuffer[ 3 ]= 0xEC ; //對等時鐘精度 |
| |
| // 8 個位元組的零用於根延遲和根分散 |
| 資料包緩衝區[ 12 ]= 49 ; |
| packetBuffer[ 13 ]= 0x4E ; |
| 資料包緩衝區[ 14 ]= 49 ; |
| 資料包緩衝區[ 15 ]= 52 ; |
| } |
| |
| void parsePacket (AsyncUDPPacket封包) |
| { |
| 結構tm ts; |
| 字元緩衝區[ 80 ]; |
| |
| memcpy (packetBuffer, packet.data (), sizeof (packetBuffer)); |
| |
| 連續劇。 print ( "收到的UDP封包類型: " ); |
| 連續劇。 println ( packet.isBroadcast () ? "廣播" : packet.isMulticast () ? "多播" : "單播" ); |
| 連續劇。印刷( “來自: ” ); |
| 連續劇。 print ( packet.remoteIP ()); |
| 連續劇。列印( " : " ); |
| 連續劇。 print ( packet.remotePort ()); |
| 連續劇。列印( “ ,收件人: ” ); |
| 連續劇。 print ( packet.localIP ()); |
| 連續劇。列印( " : " ); |
| 連續劇。 print ( packet.localPort ()); |
| 連續劇。列印( “ ,長度: ” ); |
| 連續劇。 print ( packet.length ()); |
| 連續劇。列印(); |
| |
| unsigned long highWord = word (packetBuffer[ 40 ], packetBuffer[ 41 ]); |
| unsigned long lowWord = word (packetBuffer[ 42 ], packetBuffer[ 43 ]); |
| |
| //將四個位元組(兩個字)組合成一個長整數 |
| //這是 NTP 時間(自 1900 年 1 月 1 日以來的秒數): |
| 無符號長secsSince1900 = highWord << 16 |低字; |
| |
| 連續劇。 print ( F ( " 1900 年 1 月 1 日起的秒數 = " )); |
| 連續劇。 println (secsSince1900); |
| |
| //現在將 NTP 時間轉換為)日常時間: |
| 連續劇。 print ( F ( " Epoch/Unix 時間 = " )); |
| |
| // Unix 時間從 1970 年 1 月 1 日開始。 |
| const無符號長70Years = 2208988800UL ; |
| |
| //減去七十年: |
| 無符號長紀元 = secsSince1900 - SeventyYears; |
| time_t epoch_t = 紀元; // secsSince1900 - SeventyYears; |
| |
| //列印 Unix 時間: |
| 連續劇。 println (紀元); |
| |
| //列印小時、分鐘和秒: |
| 連續劇。 print ( F ( " UTC/GMT 時間為" )); // UTC 是格林威治子午線 (GMT) 時間 |
| |
| ts = *本地時間(& epoch_t ); |
| strftime (buf, sizeof (buf), " %a %Y-%m-%d %H:%M:%S %Z " , &ts); |
| 連續劇。列印(緩衝區); |
| } |
| |
| 無效傳送NTP封包(無效) |
| { |
| 創建NTP包(); |
| //傳送單播 |
| 烏德普。 write (packetBuffer, sizeof (packetBuffer)); |
| } |
| |
| 無效設定() |
| { |
| 連續劇。開始( 115200 ); |
| 而(!串列); |
| |
| 連續劇。 print ( " n在"上啟動 AsyncUdpNTPClient );連續劇。 println (BOARD_NAME); |
| 連續劇。 println (ASYNC_UDP_STM32_VERSION); |
| |
| #如果(_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| 連續劇。 print ( " STM32 Core版本v " );連續劇。印製(STM32_CORE_VERSION_MAJOR); |
| 連續劇。列印( " . " );連續劇。印出(STM32_CORE_VERSION_MINOR); |
| 連續劇。列印( " . " );連續劇。 println (STM32_CORE_VERSION_PATCH); |
| #結束符 |
| |
| //啟動乙太網路連線和伺服器 |
| //使用隨機mac |
| uint16_t索引= millis () % NUMBER_OF_MAC; |
| |
| //使用靜態IP |
| //乙太網路.begin(mac[index], ip); |
| //使用 DHCP 動態 IP 和隨機 mac |
| 乙太網路。開始(mac[索引]); |
| |
| //你現在已經連接了,所以列印出數據 |
| 連續劇。 print ( F ( "您已連接到網絡,IP = " )); |
| 連續劇。 println ( Ethernet.localIP ()); |
| |
| // NTP 請求將傳送到連接埠 NTP_REQUEST_PORT = 123 |
| if ( Udp.connect (timeServerIP, NTP_REQUEST_PORT)) |
| // if (Udp.connect(timeServer, NTP_REQUEST_PORT)) |
| { |
| 連續劇。 println ( " UDP已連接" ); |
| |
| 烏德普。 onPacket ([](AsyncUDPPacket資料包) |
| { |
| 解析資料包(資料包); |
| }); |
| } |
| } |
| |
| 無效循環() |
| { |
| 發送NTP資料包(); |
| |
| //等待 60 秒,然後再次詢問時間 |
| 延遲( 60000 ); |
| } |
2. 文件define.h
| /* |
| 目前支援 |
| 1)內建乙太網路的STM32板(使用USE_BUILTIN_ETHERNET = true)例如: |
| - Nucleo-144(F429ZI、F767ZI) |
| - 發現(STM32F746G-DISCOVERY) |
| - STM32板(STM32F/L/H/G/WB/MP1),附32K+快閃記憶體,內建乙太網, |
| - 請參閱如何使用內建乙太網路 (https://github.com/khoih-prog/EthernetWebServer_STM32/issues/1) |
| 2) 運行 ENC28J60 擴充板的 STM32F/L/H/G/WB/MP1 板(帶 32+K 快閃記憶體)(使用 USE_BUILTIN_ETHERNET = false) |
| 3)運行W5x00擴充板的STM32F/L/H/G/WB/MP1板(附32+K Flash) |
| */ |
| |
| #ifndef定義_h |
| #define定義_h |
| |
| #if !( 已定義( STM32F0 ) ||已定義( STM32F1 ) ||已定義( STM32F2 ) ||已定義( STM32F3 ) ||已定義( STM32F4 ) ||已定義( STM32F7 ) ||已定義( STM32F4 ) ||已定義( STM32F7 ) || |
| 定義( STM32L0 ) ||定義( STM32L1 ) ||定義( STM32L4 ) ||定義( STM32H7 ) ||定義( STM32G0 ) ||定義( STM32G4 ) || |
| 定義( STM32WB ) ||定義( STM32MP1 )) |
| #error此程式碼設計為在 STM32F/L/H/G/WB/MP1 平台上運作!請檢查您的工具->面板設定。 |
| #endif |
| |
| #define ASYNC_UDP_STM32_DEBUG_PORT串口 |
| |
| // 使用 0 到 4。 |
| #定義_ASYNC_UDP_STM32_LOGLEVEL_1 |
| |
| |
| #如果定義( STM32F0 ) |
| #warning選擇 STM32F0 板 |
| #define BOARD_TYPE “STM32F0” |
| #elif定義( STM32F1 ) |
| #warning選擇 STM32F1 板 |
| #define BOARD_TYPE “STM32F1” |
| #elif定義( STM32F2 ) |
| #warning選擇 STM32F2 板 |
| #define BOARD_TYPE “STM32F2” |
| #elif定義( STM32F3 ) |
| #warning選擇 STM32F3 板 |
| #define BOARD_TYPE “STM32F3” |
| #elif定義( STM32F4 ) |
| #warning選擇 STM32F4 板 |
| #define BOARD_TYPE “STM32F4” |
| #elif定義( STM32F7 ) |
| #warning選擇 STM32F7 板 |
| #define BOARD_TYPE “STM32F7” |
| #elif定義( STM32L0 ) |
| #warning選擇 STM32L0 板 |
| #define BOARD_TYPE “STM32L0” |
| #elif定義( STM32L1 ) |
| #warning選擇 STM32L1 板 |
| #define BOARD_TYPE “STM32L1” |
| #elif定義( STM32L4 ) |
| #warning選擇 STM32L4 板 |
| #define BOARD_TYPE “STM32L4” |
| #elif定義( STM32H7 ) |
| #warning選擇 STM32H7 板 |
| #define BOARD_TYPE “STM32H7” |
| #elif定義( STM32G0 ) |
| #warning選擇 STM32G0 板 |
| #define BOARD_TYPE “STM32G0” |
| #elif定義( STM32G4 ) |
| #warning選擇 STM32G4 板 |
| #define BOARD_TYPE “STM32G4” |
| #elif定義( STM32WB ) |
| #warning選擇 STM32WB 板 |
| #define BOARD_TYPE “STM32WB” |
| #elif定義( STM32MP1 ) |
| #warning選擇 STM32MP1 板 |
| #define BOARD_TYPE “STM32MP1” |
| #別的 |
| #warning選擇了 STM32 未知板 |
| #define BOARD_TYPE “STM32 未知” |
| #endif |
| |
| #ifndef BOARD_NAME |
| #define BOARD_NAME BOARD_TYPE |
| #endif |
| |
| #include <LwIP.h> |
| #include <STM32Ethernet.h> |
| |
| #include <AsyncUDP_STM32.h> |
| |
| // 在下方輸入控制器的 MAC 位址和 IP 位址。 |
| #define NUMBER_OF_MAC 20 |
| |
| 位元組mac [][ NUMBER_OF_MAC ] = |
| { |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x01 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x02 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x03 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x04 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x05 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x06 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x07 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x08 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x09 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0A }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0B }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0C }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0D }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0E }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x0F }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x10 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x11 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x12 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x13 }, |
| { 0xDE , 0xAD , 0xBE , 0xEF , 0x32 , 0x14 }, |
| }; |
| |
| // 根據本機網路選擇靜態IP位址 |
| IP 位址ip ( 192 , 168 , 2 , 232 ); |
| |
| #endif //define_h |
調試終端輸出範例
1. STM32F7 NUCLEO_F767ZI 上的 AsyncUdpNTPClient 和 LAN8742A 乙太網路使用 STM32Ethernet 函式庫
這是在STM32F7 Nucleo-144 NUCLEO_F767ZI 上運行 AsyncUdpNTPClient 時的終端偵錯輸出。 。它使用 AsyncUDP_STM32 庫連接到 NTP 伺服器 time.windows.com (IP=13.86.101.172),每 60 秒請求 NTP 時間。然後非同步接收和處理資料包以列印當前 UTC/GMT 時間。
Start AsyncUdpNTPClient on NUCLEO_F767ZI
AsyncUdp_STM32 v1 .3.0
STM32 Core version v2 .3.0
You ' re connected to the network, IP = 192.168.2.157
UDP connected
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858437
Epoch/Unix time = 1655869637
The UTC/GMT time is Wed 2022-06-22 03:47:17 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858497
Epoch/Unix time = 1655869697
The UTC/GMT time is Wed 2022-06-22 03:48:17 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858557
Epoch/Unix time = 1655869757
The UTC/GMT time is Wed 2022-06-22 03:49:17 GMT
2. STM32F4 BLACK_F407VE 上的 AsyncUdpNTPClient_LAN8720 以及使用 STM32Ethernet 庫的 LAN8720 乙太網路
這是使用 STM32Ethernet 函式庫在具有 LAN8720 乙太網路的 STM32F4 BLACK_F407VE上執行 AsyncUdpNTPClient_LAN8720 時的終端偵錯輸出。它使用 AsyncUDP_STM32 庫連接到 NTP 伺服器 time.windows.com (IP=13.86.101.172),每 60 秒請求 NTP 時間。然後非同步接收和處理資料包以列印當前 UTC/GMT 時間。
Start AsyncUdpNTPClient_LAN8720 on BLACK_F407VE
AsyncUdp_STM32 v1 .3.0
STM32 Core version v2 .3.0
You ' re connected to the network, IP = 192.168.2.151
UDP connected
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858616
Epoch/Unix time = 1655869816
The UTC/GMT time is Wed 2022-06-22 03:50:16 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858676
Epoch/Unix time = 1655869876
The UTC/GMT time is Wed 2022-06-22 03:51:16 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858735
Epoch/Unix time = 1655869935
The UTC/GMT time is Wed 2022-06-22 03:52:15 GMT
偵錯
預設情況下,串行上啟用調試。若要停用,請使用等級 0
# define ASYNC_UDP_STM32_DEBUG_PORT Serial
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
# define _ASYNC_UDP_STM32_LOGLEVEL_ 0
您也可以將偵錯等級從 0 變更為 4
# define ASYNC_UDP_STM32_DEBUG_PORT Serial
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
# define _ASYNC_UDP_STM32_LOGLEVEL_ 4
故障排除
如果發生編譯錯誤,通常情況下,您可能需要安裝更新版本的 Arduino IDE、Arduino STM32
核心或依賴函式庫。
有時,只有將STM32
核心更新到最新版本,該庫才會工作,因為我總是使用最新的核心/庫。
問題
將問題提交至:AsyncUDP_STM32 問題
待辦事項
- 修復錯誤。新增增強功能
- 添加對更多以太網/WiFi擴展板的支持
- 增加對更多 STM32 板的支援。
完畢
- 使用內建 LAN8742A 乙太網路連接 STM32 的初始連接埠。在STM32F7 Nucleo-144 F767ZI上進行測試。
- 新增更多範例。
- 新增調試功能。
- 使用 STM32Ethernet 庫新增對乙太網路 LAN8720的支持,適用於Nucleo-144(F429ZI、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)、Discovery(DIR4746NG_F746NG)和STM3207470747073_F746 BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
- 修復多重定義連結器錯誤
- 新STM32核心v2.3.0的更新範例
- 將範例 multiFileProject 和 multiFileProject_LAN8720 新增至多檔案專案的示範中,以避免
multiple-definitions
連結器錯誤
貢獻和致謝
- 基於 Hristo Gochkov 的 ESPAsyncUDP 並對其進行修改。非常感謝 Hristo Gochkov 提供的出色的 ESPAsyncUDP 庫
- 依賴 Frederic Pillon 的 STM32duino LwIP 庫。
- 感謝 Miguel Wisintainer 的出色工作、開發、調試和測試。
️️ 赫里斯托·戈奇科夫
| ️ 弗雷德里克‧皮隆
| TCPIP晶片
|
貢獻
如果您想為這個項目做出貢獻:
- 報告錯誤和錯誤
- 請求改進
- 建立問題並拉取請求
- 向其他人介紹這個圖書館
執照
版權
版權所有 (c) 2020 - Khoi Hoang