مكتبة AsyncUDP_STM32
جدول المحتويات
- تغيير مهم من v1.3.0
- لماذا نحتاج إلى مكتبة AsyncUDP_STM32 هذه
- سمات
- لماذا يعتبر المزامنة أفضل
- اللوحات المدعومة حاليا
- سجل التغيير
- المتطلبات الأساسية
- تثبيت
- استخدم مدير مكتبة اردوينو
- التثبيت اليدوي
- رمز VS وPlatformIO
- بقع الحزم
- 1. بالنسبة للوحات STM32 لاستخدام LAN8720
- 2. بالنسبة للوحات STM32 لاستخدام Serial1
- كيفية إصلاح خطأ رابط
Multiple Definitions
- كيفية إعداد عميل Async UDP
- كيفية استخدام STM32F4 مع LAN8720
- 1. الأسلاك
- 2. كيفية البرمجة باستخدام STLink V-2 أو V-3
- 3. كيفية استخدام المنفذ التسلسلي لتصحيح الأخطاء
- أمثلة
- 1. أسينكودبكلينت
- 2. أسينكوبنتبكلينت
- 3. AsyncUdpSendReceive
- 4. أسينكودبسيرفر
- 5. AsyncUDPMulticastServer
- 6. أسينكودبكلينت_LAN8720
- 7. AsyncUdpNTPClient_LAN8720
- 8. AsyncUdpSendReceive_LAN8720
- 9. AsyncUDPServer_LAN8720
- 10. AsyncUDPMulticastServer_LAN8720
- 11. مشروع متعدد الملفات جديد
- 12. multiFileProject_LAN8720 جديد
- مثال AsyncUdpNTPClient
- 1. ملف AsyncUdpNTPClient.ino
- 2. يحدد الملف.h
- تصحيح عينات إخراج المحطة الطرفية
- 1. AsyncUdpNTPClient على STM32F7 NUCLEO_F767ZI مع LAN8742A Ethernet باستخدام مكتبة STM32Ethernet
- 2. AsyncUdpNTPClient_LAN8720 على STM32F4 BLACK_F407VE مع LAN8720 Ethernet باستخدام مكتبة STM32Ethernet
- تصحيح
- استكشاف الأخطاء وإصلاحها
- مشاكل
- للقيام به
- منتهي
- مساهمات وشكر
- المساهمة
- رخصة
- حقوق الطبع والنشر
تغيير مهم من v1.3.0
يرجى إلقاء نظرة على كيفية إصلاح خطأ رابط Multiple Definitions
بالنسبة للوحات Generic STM32F4 series
، مثل STM32F407VE، باستخدام LAN8720، يرجى استخدام STM32 core v2.2.0
حيث يؤدي كسر النواة v2.3.0
إلى حدوث خطأ في الترجمة. سيتم إصلاحه في المستقبل القريب.
لماذا نحتاج إلى مكتبة AsyncUDP_STM32 هذه
سمات
مكتبة AsyncUDP_STM32 هذه هي مكتبة UDP غير متزامنة تمامًا، مصممة لبيئة شبكة متعددة الاتصالات خالية من المتاعب، للوحات STM32 التي تستخدم LAN8720 أو LAN8742A Ethernet المضمنة. المكتبة سهلة الاستخدام وتتضمن دعمًا لبيئات البث الأحادي والبث والبث المتعدد.
تعتمد هذه المكتبة على، معدلة من:
- خريستو جوتشكوف ESPAsyncUDP
لتطبيق الميزة غير المتزامنة الأفضل والأسرع لمكتبة ESPAsyncUDP القوية على لوحات STM32 باستخدام LAN8720 أو LAN8742A Ethernet المضمنة.
لماذا يعتبر المزامنة أفضل
- إن استخدام الشبكة غير المتزامنة يعني أنه يمكنك التعامل مع أكثر من اتصال في نفس الوقت
- يتم الاتصال بك بمجرد أن يصبح الطلب جاهزًا ويتم تحليله
- عندما ترسل الرد، تكون جاهزًا على الفور للتعامل مع الاتصالات الأخرى بينما يتولى الخادم إرسال الاستجابة في الخلفية
- السرعة هي يا إلهي
- بعد الاتصال بخادم UDP كعميل غير متزامن، تصبح جاهزًا على الفور للتعامل مع الاتصالات الأخرى بينما يعتني العميل بتلقي حزم استجابة UDP في الخلفية.
- ليس مطلوبًا منك التحقق في حلقة ضيقة () من وصول حزم استجابة UDP لمعالجتها.
اللوحات المدعومة حاليا
- لوحات STM32 مزودة بشبكة Ethernet LAN8742A مدمجة مثل:
- النواة 144 (F429ZI، F767ZI)
- ديسكفري (STM32F746G-DISCOVERY)
- جميع لوحات STM32 (STM32F/L/H/G/WB/MP1) مع فلاش 32K+، مع إيثرنت مدمج
- راجع دعم EthernetWebServer_STM32 ونتائج الاختبار
- لوحات STM32 تستخدم Ethernet LAN8720 مثل:
- نيوكليو-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 IDE 1.8.19+
لاردوينو. -
Arduino Core for STM32 v2.3.0+
للوحات STM32. -
STM32Ethernet library v1.3.0+
لشبكة LAN8742A Ethernet المدمجة (Nucleo-144، Discovery). -
LwIP library v2.1.2+
لشبكة LAN8742A Ethernet المدمجة (Nucleo-144، Discovery).
تثبيت
الطريقة المقترحة للتثبيت هي:
استخدم مدير مكتبة اردوينو
أفضل طريقة هي استخدام Arduino Library Manager
. ابحث عن AsyncUDP_STM32
، ثم حدد / قم بتثبيت أحدث إصدار. يمكنك أيضًا استخدام هذا الرابط للحصول على تعليمات أكثر تفصيلاً.
التثبيت اليدوي
- انتقل إلى صفحة AsyncUDP_STM32.
- قم بتنزيل أحدث إصدار
AsyncUDP_STM32-master.zip
. - قم باستخراج الملف المضغوط إلى الدليل
AsyncUDP_STM32-master
- انسخ المجلد
AsyncUDP_STM32-master
بالكامل إلى دليل مكتبات Arduino مثل ~/Arduino/libraries/
.
رمز VS ومنصة IO:
- تثبيت رمز VS
- قم بتثبيت PlatformIO
- قم بتثبيت مكتبة AsyncUDP_STM32 باستخدام Library Manager. ابحث عن AsyncUDP_STM32 في مكتبات المؤلف في Platform.io
- استخدم ملف Platformio.ini المضمن من الأمثلة لضمان تثبيت جميع المكتبات التابعة تلقائيًا. يرجى زيارة الوثائق للتعرف على الخيارات والأمثلة الأخرى في ملف تكوين المشروع
بقع الحزم
1. بالنسبة للوحات STM32 لاستخدام LAN8720
بالنسبة للوحات Generic STM32F4 series
، مثل STM32F407VE
، باستخدام LAN8720
، يرجى استخدام STM32 core v2.2.0
حيث يؤدي كسر النواة v2.3.0
إلى حدوث خطأ في الترجمة.
لاستخدام LAN8720 على بعض لوحات STM32
- نيوكليو-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. يجب نسخ هذه الملفات إلى الدليل:
-
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h
لـ STM32F4. -
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h
لـ Nucleo-144 STM32F7.
كلما تم تثبيت إصدار جديد، تذكر نسخ هذا الملف إلى دليل الإصدار الجديد. على سبيل المثال، الإصدار الجديد هو 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 (~/.arduino15/packages/STM32/hardware/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
في العديد من الملفات. ولكن تأكد من استخدام ملف .h
التالي في ملف .h
أو .cpp
أو .ino
واحد فقط ، والذي يجب ألا يتم تضمينه في أي ملف آخر ، لتجنب خطأ رابط 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
.
كيفية إعداد عميل Async 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. الأسلاك
هذه هي الأسلاك الخاصة بـ STM32F4 (BLACK_F407VE، وما إلى ذلك) باستخدام LAN8720
LAN8720 فيزي | <---> | STM32F4 |
---|
TX1 | <---> | PB_13 |
TX_EN | <---> | PB_11 |
TX0 | <---> | PB_12 |
آر إكس0 | <---> | PC_4 |
RX1 | <---> | PC_5 |
نينت/ريتكلك | <---> | PA_1 |
سي آر إس | <---> | PA_7 |
مديو | <---> | PA_2 |
حركة التغيير الديمقراطي | <---> | PC_1 |
أرض | <---> | أرض |
VCC | <---> | +3.3 فولت |
2. كيفية البرمجة باستخدام STLink V-2 أو V-3
الاتصال على النحو التالي. للبرمجة، استخدم STM32CubeProgrammer أو Arduino IDE مع
- دعم U(S)ART: "ممكّن (مسلسل عام)"
- طريقة التحميل: "STM32CubeProgrammer (SWD)"
إس تي لينك | <---> | STM32F4 |
---|
سوكلك | <---> | سوكلك |
سويديو | <---> | سويديو |
RST | <---> | نرست |
أرض | <---> | أرض |
5 فولت | <---> | 5 فولت |
3. كيفية استخدام المنفذ التسلسلي لتصحيح الأخطاء
قم بتوصيل FDTI (USB إلى المسلسل) على النحو التالي:
FDTI | <---> | STM32F4 |
---|
آر إكس | <---> | تكس=PA_9 |
تكساس | <---> | ركس=PA_10 |
أرض | <---> | أرض |
أمثلة
- AsyncUDPClient
- AsyncUdpNTPClient
- AsyncUdpSendReceive
- AsyncUDDPServer
- AsyncUDPMulticastServer
- AsyncUDPClient_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- AsyncUDPServer_LAN8720
- AsyncUDPMulticastServer_LAN8720
- مشروع متعدد الملفات جديد
- multiFileProject_LAN8720 جديد
مثال AsyncUdpNTPClient
1. ملف AsyncUdpNTPClient.ino
| # تشمل " تعريفات.ح " |
| # تشمل < الوقت. ح > |
| |
| // 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"; // خادم نتب |
| char timeServer[] = " 0.ca.pool.ntp.org " ; |
| |
| const int NTP_PACKET_SIZE = 48 ؛ // الطابع الزمني لـ NTP موجود في أول 48 بايت من الرسالة |
| |
| بايت packetBuffer[NTP_PACKET_SIZE]; // المخزن المؤقت للاحتفاظ بالحزم الواردة والصادرة |
| |
| // مثيل UDP للسماح لنا بإرسال واستقبال الحزم عبر UDP |
| AsyncUDP Udp; |
| |
| // أرسل طلب NTP إلى خادم الوقت على العنوان المحدد |
| إنشاء باطلة NTPpacket ( باطلة ) |
| { |
| مسلسل. println ( " ==================================== " ); |
| |
| // اضبط كافة وحدات البايت في المخزن المؤقت على 0 |
| memset (packetBuffer, 0 , NTP_PACKET_SIZE); |
| // تهيئة القيم اللازمة لتكوين طلب NTP |
| // (راجع عنوان URL أعلاه للحصول على تفاصيل حول الحزم) |
| |
| packetBuffer[ 0 ] = 0b11100011 ; // LI، الإصدار، الوضع |
| packetBuffer[ 1 ] = 0 ; // الطبقة، أو نوع الساعة |
| packetBuffer[ 2 ] = 6 ; // الفاصل الزمني للاستقصاء |
| packetBuffer[ 3 ] = 0xEC ; // دقة الساعة النظيرة |
| |
| // 8 بايت من الصفر لتأخير الجذر وتشتت الجذر |
| packetBuffer[ 12 ] = 49 ; |
| packetBuffer[ 13 ] = 0x4E ; |
| packetBuffer[ 14 ] = 49 ; |
| packetBuffer[ 15 ] = 52 ; |
| } |
| |
| باطلة parsePacket (حزمة AsyncUDPPacket) |
| { |
| هيكل tm ؛ |
| شار بوف[ 80 ]; |
| |
| memcpy (packetBuffer, packet.data ()، sizeof (packetBuffer)); |
| |
| مسلسل. طباعة ( " نوع حزمة UDP المستلمة: " )؛ |
| مسلسل. println ( packet.isBroadcast () ? " Broadcast " : packet.isMulticast () ? " Multicast " : " Unicast " ); |
| مسلسل. طباعة ( " من: " )؛ |
| مسلسل. طباعة ( packet.remoteIP ())؛ |
| مسلسل. مطبعة ( " : " )؛ |
| مسلسل. طباعة ( packet.remotePort ())؛ |
| مسلسل. طباعة ( " ، إلى: " )؛ |
| مسلسل. طباعة ( packet.localIP ()); |
| مسلسل. مطبعة ( " : " )؛ |
| مسلسل. طباعة ( packet.localPort ())؛ |
| مسلسل. طباعة ( " ، الطول: " )؛ |
| مسلسل. طباعة (packet. length ())؛ |
| مسلسل. برينتلن ()؛ |
| |
| unsigned long HighWord = word (packetBuffer[ 40 ], packetBuffer[ 41 ]); |
| unsigned long lowWord = word (packetBuffer[ 42 ], packetBuffer[ 43 ]); |
| |
| // ادمج البايتات الأربع (كلمتين) في عدد صحيح طويل |
| // هذا هو وقت NTP (بالثواني منذ 1 يناير 1900): |
| unsigned long secsSince1900 = HighWord << 16 | كلمة منخفضة؛ |
| |
| مسلسل. طباعة ( F ( " الثواني منذ 1 يناير 1900 = " )); |
| مسلسل. println (secsSince1900); |
| |
| // الآن قم بتحويل وقت NTP إلى )الوقت اليومي: |
| مسلسل. طباعة ( F ( " Epoch/Unix time = " ))؛ |
| |
| // يبدأ وقت يونكس في 1 يناير 1970. بالثواني، يساوي 2208988800: |
| ثابت سبعون سنة طويلة غير موقعة = 2208988800UL ؛ |
| |
| // طرح سبعين سنة: |
| فترة طويلة غير موقعة = secsSince1900 - سبعين عامًا؛ |
| time_t Epoch_t = Epoch; // secsSince1900 - سبعون سنة؛ |
| |
| // طباعة وقت يونكس: |
| مسلسل. برينتلن (عصر)؛ |
| |
| // اطبع الساعة والدقيقة والثانية: |
| مسلسل. طباعة ( F ( " التوقيت العالمي المنسق/توقيت جرينتش هو " )); // UTC هو الوقت عند Greenwich Meridian (GMT) |
| |
| ts = * التوقيت المحلي (& Epoch_t ); |
| strftime (buf, sizeof (buf), " %a %Y-%m-%d %H:%M:%S %Z " , &ts); |
| مسلسل. برينتلن (بوف)؛ |
| } |
| |
| باطلة sendNTPPacket ( باطلة ) |
| { |
| createNTPpacket (); |
| // إرسال البث الأحادي |
| UDP. الكتابة (packetBuffer، sizeof (packetBuffer))؛ |
| } |
| |
| الإعداد باطل () |
| { |
| مسلسل. تبدأ ( 115200 ); |
| بينما (!المسلسل)؛ |
| |
| مسلسل. طباعة ( " n بدء تشغيل AsyncUdpNTPClient على " ); مسلسل. برينتلن (BOARD_NAME)؛ |
| مسلسل. برينتلن (ASYNC_UDP_STM32_VERSION)؛ |
| |
| # إذا (_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| مسلسل. طباعة ( " النسخة الأساسية STM32 v " )؛ مسلسل. طباعة (STM32_CORE_VERSION_MAJOR)؛ |
| مسلسل. مطبعة ( " . " )؛ مسلسل. طباعة (STM32_CORE_VERSION_MINOR)؛ |
| مسلسل. مطبعة ( " . " )؛ مسلسل. برينتلن (STM32_CORE_VERSION_PATCH)؛ |
| # نهاية |
| |
| // ابدأ اتصال إيثرنت والخادم |
| // استخدم جهاز Mac عشوائيًا |
| uint16_t Index = millis () % NUMBER_OF_MAC; |
| |
| // استخدم عنوان IP الثابت |
| // Ethernet.begin(mac[index], ip); |
| // استخدم IP الديناميكي لـ DHCP وجهاز Mac العشوائي |
| إيثرنت. ابدأ (ماك[ فهرس ]); |
| |
| // أنت متصل الآن، لذا قم بطباعة البيانات |
| مسلسل. طباعة ( F ( " أنت متصل بالشبكة، IP = " ))؛ |
| مسلسل. println ( Ethernet.localIP ()); |
| |
| // طلبات NTP مخصصة للمنفذ NTP_REQUEST_PORT = 123 |
| إذا ( Udp.connect (timeServerIP, NTP_REQUEST_PORT)) |
| // إذا (Udp.connect(timeServer، NTP_REQUEST_PORT)) |
| { |
| مسلسل. println ( " متصل بـ UDP " ); |
| |
| UDP. onPacket ([](حزمة AsyncUDPPacket) |
| { |
| parsePacket (حزمة)؛ |
| }); |
| } |
| } |
| |
| حلقة فارغة () |
| { |
| sendNTPPacket (); |
| |
| // انتظر 60 ثانية قبل أن تسأل عن الوقت مرة أخرى |
| تأخير ( 60000 ) ؛ |
| } |
2. يحدد الملف.h
| /* |
| الدعم حاليا |
| 1) لوحات STM32 مزودة بشبكة إيثرنت مدمجة (لاستخدام USE_BUILTIN_ETHERNET = صحيح) مثل: |
| - نيوكليو-144 (F429ZI، F767ZI) |
| - ديسكفري (STM32F746G-DISCOVERY) |
| - لوحات STM32 (STM32F/L/H/G/WB/MP1) مع فلاش 32K+، مع إيثرنت مدمج، |
| - راجع كيفية استخدام شبكة Ethernet المدمجة على (https://github.com/khoih-prog/EthernetWebServer_STM32/issues/1) |
| 2) لوحات STM32F/L/H/G/WB/MP1 (مع فلاش 32+K) تعمل بدروع ENC28J60 (لاستخدام USE_BUILTIN_ETHERNET = خطأ) |
| 3) لوحات STM32F/L/H/G/WB/MP1 (مع فلاش 32+K) تعمل بدروع W5x00 |
| */ |
| |
| #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 Serial |
| |
| // استخدم من 0 إلى 4. رقم أعلى ومزيد من رسائل تصحيح الأخطاء واستخدام الذاكرة. |
| #تعريف _ASYNC_UDP_STM32_LOGLEVEL_ 1 |
| |
| |
| #إذا تم تعريفه ( STM32F0 ) |
| #تحذير تم تحديد لوحة STM32F0 |
| #تعريف نوع اللوحة "STM32F0" |
| #elif محدد ( STM32F1 ) |
| #تحذير تم تحديد لوحة STM32F1 |
| #تعريف نوع اللوحة "STM32F1" |
| #elif محدد ( STM32F2 ) |
| #تحذير تم تحديد لوحة STM32F2 |
| #تعريف نوع اللوحة "STM32F2" |
| #elif محدد ( STM32F3 ) |
| #تحذير تم تحديد لوحة STM32F3 |
| #تعريف نوع اللوحة "STM32F3" |
| #elif محدد ( STM32F4 ) |
| #تحذير تم تحديد لوحة STM32F4 |
| #تعريف نوع اللوحة "STM32F4" |
| #elif محدد( STM32F7 ) |
| #تحذير تم تحديد لوحة STM32F7 |
| #تعريف نوع اللوحة "STM32F7" |
| #elif محدد( STM32L0 ) |
| #تحذير تم تحديد لوحة STM32L0 |
| #تعريف نوع اللوحة "STM32L0" |
| #elif محدد( STM32L1 ) |
| #تحذير تم تحديد لوحة STM32L1 |
| #تعريف نوع اللوحة "STM32L1" |
| #elif محدد( STM32L4 ) |
| #تحذير تم تحديد لوحة STM32L4 |
| #تعريف نوع اللوحة "STM32L4" |
| #elif محدد( STM32H7 ) |
| #تحذير تم تحديد لوحة STM32H7 |
| #تعريف نوع اللوحة "STM32H7" |
| #elif محدد( STM32G0 ) |
| #تحذير تم تحديد لوحة STM32G0 |
| #تعريف نوع اللوحة "STM32G0" |
| #elif محدد ( STM32G4 ) |
| #تحذير تم تحديد لوحة STM32G4 |
| #تعريف نوع اللوحة "STM32G4" |
| #elif محدد ( STM32WB ) |
| #تحذير تم تحديد لوحة STM32WB |
| #define BOARD_TYPE "STM32WB" |
| #elif محدد ( STM32MP1 ) |
| #تحذير تم تحديد لوحة STM32MP1 |
| #تعريف نوع اللوحة "STM32MP1" |
| #آخر |
| #تحذير تم تحديد لوحة غير معروفة STM32 |
| #define BOARD_TYPE "STM32 غير معروف" |
| #endif |
| |
| #ifndef BOARD_NAME |
| #تعريف BOARD_NAME BOARD_TYPE |
| #endif |
| |
| #تتضمن <LwIP.h> |
| #تشمل <STM32Ethernet.h> |
| |
| #تتضمن <AsyncUDP_STM32.h> |
| |
| // أدخل عنوان MAC وعنوان IP لوحدة التحكم الخاصة بك أدناه. |
| #حدد رقم NUMBER_OF_MAC 20 |
| |
| بايت ماك [][ 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 ( 192 , 168 , 2 , 232 ); |
| |
| #endif //defines_h |
تصحيح عينات إخراج المحطة الطرفية
1. AsyncUdpNTPClient على STM32F7 NUCLEO_F767ZI مع LAN8742A Ethernet باستخدام مكتبة STM32Ethernet
هذا هو إخراج تصحيح الأخطاء الطرفية عند تشغيل AsyncUdpNTPClient على STM32F7 Nucleo-144 NUCLEO_F767ZI. . وهو يتصل بخادم NTP time.windows.com (IP=13.86.101.172) باستخدام مكتبة AsyncUDP_STM32، ويطلب وقت NTP كل 60 ثانية. يتم بعد ذلك استلام الحزمة ومعالجتها بشكل غير متزامن لطباعة التوقيت 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. AsyncUdpNTPClient_LAN8720 على STM32F4 BLACK_F407VE مع LAN8720 Ethernet باستخدام مكتبة STM32Ethernet
هذا هو إخراج تصحيح الأخطاء الطرفية عند تشغيل AsyncUdpNTPClient_LAN8720 على STM32F4 BLACK_F407VE مع LAN8720 Ethernet باستخدام مكتبة STM32Ethernet . وهو يتصل بخادم NTP time.windows.com (IP=13.86.101.172) باستخدام مكتبة AsyncUDP_STM32، ويطلب وقت NTP كل 60 ثانية. يتم بعد ذلك استلام الحزمة ومعالجتها بشكل غير متزامن لطباعة التوقيت 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
core أو المكتبات المعتمدة.
في بعض الأحيان، لن تعمل المكتبة إلا إذا قمت بتحديث نواة STM32
إلى أحدث إصدار لأنني دائمًا أستخدم أحدث النوى/المكتبات.
مشاكل
إرسال المشكلات إلى: مشكلات AsyncUDP_STM32
للقيام به
- إصلاح الخلل. أضف التعزيز
- أضف دعمًا لمزيد من درع Ethernet / WiFi
- أضف الدعم إلى المزيد من لوحات STM32.
منتهي
- المنفذ الأولي إلى STM32 باستخدام LAN8742A Etnernet المدمج. تم اختباره على STM32F7 Nucleo-144 F767ZI .
- أضف المزيد من الأمثلة.
- إضافة ميزات التصحيح.
- إضافة دعم إلى Ethernet LAN8720 باستخدام مكتبة STM32Ethernet، للوحات مثل 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 core v2.3.0 الجديد
- أضف مثال multiFileProject وmultiFileProject_LAN8720 للعرض التجريبي لمشروع متعدد الملفات لتجنب خطأ رابط
multiple-definitions
مساهمات وشكر
- استنادًا إلى ESPAsyncUDP الخاص بـ Hristo Gochkov وتم تعديله. شكرًا جزيلاً لخريستو جوتشكوف على مكتبة ESPAsyncUDP الرائعة
- تم الاعتماد عليه على مكتبة STM32duino LwIP الخاصة بفريدريك بيلون.
- شكرًا للعمل الجيد الذي قام به Miguel Wisintainer للعمل مع التطوير وتصحيح الأخطاء والاختبار.
️️ خريستو جوتشكوف
| ️ فريدريك بيلون
| com.tcpipchip
|
المساهمة
إذا كنت تريد المساهمة في هذا المشروع:
- الإبلاغ عن الأخطاء والأخطاء
- اطلب التحسينات
- إنشاء القضايا وسحب الطلبات
- أخبر الآخرين عن هذه المكتبة
رخصة
- المكتبة مرخصة من قبل معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر
حقوق النشر (ج) 2020- خوي هوانج