AsyncUDP_STM32 ライブラリ
目次
- v1.3.0からの重要な変更点
- この AsyncUDP_STM32 ライブラリが必要な理由
- 特徴
- 非同期が優れている理由
- 現在サポートされているボード
- 変更履歴
- 前提条件
- インストール
- Arduinoライブラリマネージャーを使用する
- 手動インストール
- VS コードとプラットフォーム IO
- パッケージのパッチ
- 1. STM32 ボードで LAN8720 を使用する場合
- 2. STM32 ボードが Serial1 を使用する場合
Multiple Definitions
リンカーエラーを修正する方法- 非同期 UDP クライアントのセットアップ方法
- LAN8720 で STM32F4 を使用する方法
- 1. 配線
- 2. STLink V-2 または V-3 を使用した HOWTO プログラム
- 3. デバッグにシリアルポートを使用する方法
- 例
- 1.非同期UDPCクライアント
- 2.AsyncUdpNTPClient
- 3.AsyncUdpSendReceive
- 4.非同期UDPサーバー
- 5.非同期UDPマルチキャストサーバー
- 6.AsyncUDPClient_LAN8720
- 7.AsyncUdpNTPClient_LAN8720
- 8.AsyncUdpSendReceive_LAN8720
- 9.AsyncUDPServer_LAN8720
- 10.非同期UDPマルチキャストサーバー_LAN8720
- 11.マルチファイルプロジェクト新規
- 12. multiFileProject_LAN8720新規
- 例 AsyncUdpNTPClient
- 1. ファイル AsyncUdpNTPClient.ino
- 2. ファイルdefines.h
- デバッグ端末の出力サンプル
- 1. STM32Ethernet ライブラリを使用した LAN8742A イーサネットを備えた STM32F7 NUCLEO_F767ZI 上の AsyncUdpNTPClient
- 2. STM32Ethernet ライブラリを使用した LAN8720 Ethernet を備えた STM32F4 BLACK_F407VE 上の AsyncUdpNTPClient_LAN8720
- デバッグ
- トラブルシューティング
- 問題
- やるべきこと
- 終わり
- 貢献と感謝
- 貢献する
- ライセンス
- 著作権
v1.3.0からの重要な変更点
Multiple Definitions
リンカーエラーを修正する方法をご覧ください。
LAN8720 を使用する STM32F407VE などのGeneric STM32F4 series
ボードの場合は、コアv2.3.0
破壊するとコンパイル エラーが発生するため、STM32 コアv2.2.0
使用してください。近い将来に修正されます。
この AsyncUDP_STM32 ライブラリが必要な理由
特徴
この AsyncUDP_STM32 ライブラリは完全非同期 UDP ライブラリであり、LAN8720 または内蔵 LAN8742A イーサネットを使用する STM32 ボード向けに、トラブルのないマルチ接続ネットワーク環境向けに設計されています。このライブラリは使いやすく、ユニキャスト、ブロードキャスト、およびマルチキャスト環境のサポートが含まれています。
このライブラリは以下に基づいており、以下から変更されています。
- フリスト・ゴチコフの ESPAsyncUDP
LAN8720 または内蔵 LAN8742A イーサネットを使用して、強力なESPAsyncUDP ライブラリのより優れた高速な非同期機能を STM32 ボードに適用します。
非同期が優れている理由
- 非同期ネットワークを使用すると、複数の接続を同時に処理できます。
- リクエストの準備が整い、解析されると呼び出されます。
- 応答を送信すると、サーバーがバックグラウンドで応答の送信を処理している間、すぐに他の接続を処理できるようになります。
- スピードがすごい
- 非同期クライアントとして UDP サーバーに接続すると、クライアントがバックグラウンドで UDP 応答パケットの受信を処理している間、すぐに他の接続を処理できるようになります。
- UDP 応答パケットを処理するために、その到着をタイト ループ() でチェックする必要はありません。
現在サポートされているボード
- 以下のようなイーサネット LAN8742A を内蔵した STM32 ボード:
- Nucleo-144 (F429ZI、F767ZI)
- ディスカバリー (STM32F746G-DISCOVERY)
- すべての STM32 ボード (STM32F/L/H/G/WB/MP1)、32K+ フラッシュ、内蔵イーサネット付き
- 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+
。 - 内蔵 LAN8742A イーサネット用の
STM32Ethernet library v1.3.0+
(Nucleo-144、Discovery)。 - 内蔵 LAN8742A イーサネット用の
LwIP library v2.1.2+
(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 コードをインストールする
- PlatformIO をインストールする
- ライブラリ マネージャーを使用して、 AsyncUDP_STM32ライブラリをインストールします。 Platform.io 著者のライブラリで AsyncUDP_STM32 を検索する
- 例に含まれている platformio.ini ファイルを使用して、すべての依存ライブラリが自動的にインストールされるようにします。他のオプションと例については、プロジェクト構成ファイルのドキュメントを参照してください。
パッケージのパッチ
1. STM32 ボードで LAN8720 を使用する場合
LAN8720
を使用するSTM32F407VE
などのGeneric STM32F4 series
ボードの場合は、コアv2.3.0
破壊するとコンパイル エラーが発生するため、STM32 コアv2.2.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 ボード (Nucleo-144 NUCLEO_F767ZI、Nucleo-64 NUCLEO_L053R8 など) ボードで Serial1 を使用するには、ファイル STM32ariant.h を STM32 stm32 ディレクトリにコピーする必要があります。 (~/.arduino15/packages/STM32/hardware/stm32/2.3.0)。ボードに対応するファイルを変更する必要があります。これは単にその方法を示すものです。
STM32 stm32 コアのバージョンが 2.3.0 であるとします。これらのファイルは次のディレクトリにコピーする必要があります。
- Nucleo-144 NUCLEO_F767ZI の場合は、
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h
です。 - Nucleo-64 NUCLEO_L053R8 の場合は、
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h
です。
新しいバージョンをインストールするときは、必ずこのファイルを新しいバージョンのディレクトリにコピーしてください。たとえば、新しいバージョンは 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.cpp
の代わりにxyz-Impl.h
使用する現在のライブラリ実装では、特定の使用例で特定の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
多くのファイルにあります。ただし、 Multiple Definitions
リンカー エラーを避けるために、次の.h
ファイルを1 つの.h
、 .cpp
または.ino
ファイル内で必ず使用してください。これらのファイルは他のファイルに含めてはなりません。
// 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
HOWTO
デモについては、新しいmultiFileProject の例を確認してください。
非同期 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 );
}
LAN8720 で STM32F4 を使用する方法
1. 配線
LAN8720を使用したSTM32F4(BLACK_F407VE等)の配線です。
LAN8720 PHY | <---> | STM32F4 |
---|
TX1 | <---> | PB_13 |
TX_EN | <---> | PB_11 |
TX0 | <---> | PB_12 |
RX0 | <---> | PC_4 |
RX1 | <---> | PC_5 |
nINT/RETCLK | <---> | PA_1 |
CRS | <---> | PA_7 |
MDIO | <---> | PA_2 |
MDC | <---> | PC_1 |
グランド | <---> | グランド |
VCC | <---> | +3.3V |
2. STLink V-2 または V-3 を使用した HOWTO プログラム
以下のように接続します。プログラミングするには、 STM32CubeProgrammerまたは Arduino IDE を使用します。
- U(S)ART サポート: 「有効 (汎用シリアル)」
- アップロード方法:「STM32CubeProgrammer(SWD)」
STリンク | <---> | STM32F4 |
---|
SWCLK | <---> | SWCLK |
SWDIO | <---> | SWDIO |
RST | <---> | NRST |
グランド | <---> | グランド |
5v | <---> | 5V |
3. デバッグにシリアルポートを使用する方法
FDTI (USB からシリアル) を次のように接続します。
FDTI | <---> | STM32F4 |
---|
RX | <---> | TX=PA_9 |
テキサス州 | <---> | RX=PA_10 |
グランド | <---> | グランド |
例
- 非同期UDPCクライアント
- 非同期UdpNTPCクライアント
- 非同期Udp送信受信
- 非同期UDPサーバー
- 非同期UDPマルチキャストサーバー
- 非同期UDPClient_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- 非同期UDPサーバー_LAN8720
- AsyncUDPマルチキャストサーバー_LAN8720
- マルチファイルプロジェクト新規
- multiFileProject_LAN8720新規
例 AsyncUdpNTPClient
1. ファイル AsyncUdpNTPClient.ino
| # 「 defines.h 」をインクルードします |
| # < time.h >をインクルードします |
| |
| // 0.ca.pool.ntp.org |
| IPAddress timeServerIP = IPAddress( 208 , 81 , 1 , 244 ); |
| // time.nist.gov |
| // IPAddress timeServerIP = IPAddress(132, 163, 96, 1); |
| |
| # NTP_REQUEST_PORT 123を定義します |
| |
| // char timeServer[] = "time.nist.gov"; // NTPサーバー |
| char timeServer[] = " 0.ca.pool.ntp.org " ; |
| |
| const int NTP_PACKET_SIZE = 48 ; // NTP タイムスタンプはメッセージの最初の 48 バイトにあります |
| |
| バイト packetBuffer[NTP_PACKET_SIZE]; //受信パケットと送信パケットを保持するバッファー |
| |
| // UDP 経由でパケットを送受信できるようにする UDP インスタンス |
| 非同期UDP UDP; |
| |
| //指定されたアドレスのタイムサーバーに NTP リクエストを送信します |
| void createNTPpacket ( void ) |
| { |
| シリアル。 println ( " ============= createNTPpacket ============= " ); |
| |
| //バッファ内のすべてのバイトを 0 に設定します |
| memset (packetBuffer, 0 , NTP_PACKET_SIZE); |
| // NTP リクエストの形成に必要な値を初期化します |
| // (パケットの詳細については、上記の URL を参照してください) |
| |
| パケットバッファ[ 0 ] = 0b11100011 ; // LI、バージョン、モード |
| パケットバッファ[ 1 ] = 0 ; //ストラタム、またはクロックのタイプ |
| パケットバッファ[ 2 ] = 6 ; //ポーリング間隔 |
| packetBuffer[ 3 ] = 0xEC ; //ピアクロックの精度 |
| |
| //ルート遅延とルート分散の 8 バイトのゼロ |
| パケットバッファ[ 12 ] = 49 ; |
| パケットバッファ[ 13 ] = 0x4E ; |
| パケットバッファ[ 14 ] = 49 ; |
| パケットバッファ[ 15 ] = 52 ; |
| } |
| |
| void parsePacket (AsyncUDPPacket パケット) |
| { |
| 構造体tm ts; |
| char buf[ 80 ]; |
| |
| memcpy (packetBuffer, packet.data (), sizeof (packetBuffer)); |
| |
| シリアル。 print ( "受信した UDP パケットの種類: " ); |
| シリアル。 println (packet. isBroadcast () ? "ブロードキャスト" : packet. isMulticast () ? "マルチキャスト" : "ユニキャスト" ); |
| シリアル。 print ( " From: " ); |
| シリアル。 print ( packet.remoteIP ()); |
| シリアル。 print ( " : " ); |
| シリアル。 print ( packet.remotePort ()); |
| シリアル。 print ( " , To: " ); |
| シリアル。 print ( packet.localIP ()); |
| シリアル。 print ( " : " ); |
| シリアル。 print ( packet.localPort ()); |
| シリアル。 print ( " , 長さ: " ); |
| シリアル。 print ( packet.length ()); |
| シリアル。 println (); |
| |
| unsigned long highWord = word (packetBuffer[ 40 ], packetBuffer[ 41 ]); |
| unsigned long lowWord = word (packetBuffer[ 42 ], packetBuffer[ 43 ]); |
| |
| // 4 バイト (2 ワード) を結合して長整数を作成します |
| //これは NTP 時間です (1900 年 1 月 1 日からの秒数): |
| unsigned long secsSince1900 = highWord << 16 |ローワード; |
| |
| シリアル。 print ( F ( " 1900 年 1 月 1 日からの秒数 = " )); |
| シリアル。 println (secssince1900); |
| |
| //ここで NTP 時間を )日常時間に変換します: |
| シリアル。 print ( F ( "エポック/Unix 時間 = " )); |
| |
| // Unix 時間は 1970 年 1 月 1 日に始まります。秒単位では、2208988800 になります。 |
| const unsigned long seventy Years = 2208988800UL ; |
| |
| // 70 年を引きます。 |
| 符号なしの長いエポック = 秒から 1900 年 - 70 年; |
| time_t epoch_t = エポック; //秒から 1900 年 - 70 年; |
| |
| // Unix 時間を出力します: |
| シリアル。 println (エポック); |
| |
| //時、分、秒を出力します。 |
| シリアル。 print ( F ( " UTC/GMT 時間は" )); // UTC はグリニッジ子午線 (GMT) の時刻です |
| |
| ts = *ローカルタイム(& epoch_t ); |
| strftime (buf, sizeof (buf), " %a %Y-%m-%d %H:%M:%S %Z " , &ts); |
| シリアル。 println (buf); |
| } |
| |
| void sendNTPPacket ( void ) |
| { |
| createNTPpacket (); |
| //ユニキャスト送信 |
| ウドプ。 write (packetBuffer, sizeof (packetBuffer)); |
| } |
| |
| 無効なセットアップ() |
| { |
| シリアル。開始( 115200 ); |
| while (!シリアル); |
| |
| シリアル。 print ( " n AsyncUdpNTPClient を開始します。 " );シリアル。 println (BOARD_NAME); |
| シリアル。 println (ASYNC_UDP_STM32_VERSION); |
| |
| # if (_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| シリアル。 print ( " STM32 コア バージョン v " );シリアル。印刷(STM32_CORE_VERSION_MAJOR); |
| シリアル。 print ( " . " );シリアル。印刷(STM32_CORE_VERSION_MINOR); |
| シリアル。 print ( " . " );シリアル。 println (STM32_CORE_VERSION_PATCH); |
| #endif |
| |
| //イーサネット接続とサーバーを開始します |
| //ランダムな Mac を使用する |
| uint16_tインデックス=ミリス() % NUMBER_OF_MAC; |
| |
| //静的 IP を使用する |
| // Ethernet.begin(mac[index], ip); |
| // DHCP 動的 IP とランダム MAC を使用します |
| イーサネット。 begin (mac[インデックス]); |
| |
| //接続できたのでデータを出力します |
| シリアル。 print ( F ( "ネットワークに接続しています、IP = " )); |
| シリアル。 println (イーサネット.localIP ()); |
| |
| // NTP リクエストはポート NTP_REQUEST_PORT = 123 宛てです |
| if (Udp.接続(timeServerIP、NTP_REQUEST_PORT)) |
| // if (Udp.connect(timeServer, NTP_REQUEST_PORT)) |
| { |
| シリアル。 println ( " UDP 接続済み" ); |
| |
| ウドプ。 onPacket ([](AsyncUDPPacket パケット) |
| { |
| parsePacket (パケット); |
| }); |
| } |
| } |
| |
| ボイドループ() |
| { |
| sendNTPPacket (); |
| |
| //再度時間を尋ねるまで 60 秒待ってください |
| 遅延( 60000 ); |
| } |
2. ファイルdefines.h
| /* |
| 現在サポート中 |
| 1) イーサネットを内蔵した STM32 ボード (USE_BUILTIN_ETHERNET = true を使用): |
| - ヌクレオ-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 フラッシュ付き) |
| */ |
| |
| #ifndef定義_h |
| #define定義_h |
| |
| #if !( 定義された( STM32F0 ) ||定義された( STM32F1 ) ||定義された( STM32F2 ) ||定義された( STM32F3 ) ||定義された( 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 を使用します。数値が大きいほど、デバッグ メッセージとメモリ使用量が多くなります。 |
| #define _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 //定義_h |
デバッグ端末の出力サンプル
1. STM32Ethernet ライブラリを使用した LAN8742A イーサネットを備えた STM32F7 NUCLEO_F767ZI 上の AsyncUdpNTPClient
これは、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. STM32Ethernet ライブラリを使用した LAN8720 Ethernet を備えた STM32F4 BLACK_F407VE 上の AsyncUdpNTPClient_LAN8720
これは、STM32Ethernet Library を使用して LAN8720 Ethernet を備えた 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でテスト済み。
- さらに例を追加します。
- デバッグ機能を追加します。
- Nucleo-144 ( F429ZI 、NUCLEO_F746NG、NUCLEO_F746ZG、NUCLEO_F756ZG)、Discovery (DISCO_F746NG)およびSTM32F4 ボード (BLACK_F407VE、BLACK_F407VG、 BLACK_F407ZE、BLACK_F407ZG、BLACK_F407VE_Mini、DIYMORE_F407VGT、FK407M1)
- 複数定義のリンカーエラーを修正
- 新しいSTM32 コア v2.3.0の更新例
multiple-definitions
リンカー エラーを回避するために、サンプル multiFileProject および multiFileProject_LAN8720 を複数ファイル プロジェクトのデモに追加します。
貢献と感謝
- Hristo Gochkov の ESPAsyncUDP に基づいて変更されています。素晴らしい ESPAsyncUDP ライブラリを提供してくれた Hristo Gochkov に感謝します
- Frederic Pillon の STM32duino LwIP ライブラリに依存しました。
- Miguel Wisintainer の協力、開発、デバッグ、テストに感謝します。
️️フリスト・ゴチコフ
| ️フレデリック・ピヨン
| TCチップチップ
|
貢献する
このプロジェクトに貢献したい場合:
- バグやエラーを報告する
- 機能強化を求める
- 問題とプルリクエストの作成
- このライブラリについて他の人に知らせる
ライセンス
- このライブラリは MIT の下でライセンスを取得しています
著作権
著作権 (c) 2020 - コイ・ホアン