ไลบรารี AsyncUDP_STM32
สารบัญ
- การเปลี่ยนแปลงที่สำคัญจาก v1.3.0
- เหตุใดเราจึงต้องมีไลบรารี AsyncUDP_STM32 นี้
- คุณสมบัติ
- ทำไม Async ถึงดีกว่า
- บอร์ดที่รองรับในปัจจุบัน
- บันทึกการเปลี่ยนแปลง
- ข้อกำหนดเบื้องต้น
- การติดตั้ง
- ใช้ตัวจัดการไลบรารี Arduino
- ติดตั้งด้วยตนเอง
- รหัส VS และแพลตฟอร์มIO
- แพตช์ของแพ็คเกจ
- 1. สำหรับบอร์ด STM32 ให้ใช้ LAN8720
- 2. สำหรับบอร์ด STM32 ให้ใช้ Serial1
- HOWTO แก้ไขข้อผิดพลาด Linker
Multiple Definitions
- วิธีการตั้งค่าไคลเอ็นต์ Async UDP
- HOWTO ใช้ STM32F4 กับ LAN8720
- 1. การเดินสายไฟ
- 2. โปรแกรม HOWTO โดยใช้ STLink V-2 หรือ V-3
- 3. HOWTO ใช้พอร์ตอนุกรมสำหรับการดีบัก
- ตัวอย่าง
- 1. AsyncUDPClient
- 2. AsyncUdpNTPClient
- 3. AsyncUdpSendReceive
- 4. AsyncUDPเซิร์ฟเวอร์
- 5. AsyncUDPMulticastServer
- 6. AsyncUDPClient_LAN8720
- 7. AsyncUdpNTPClient_LAN8720
- 8. AsyncUdpSendReceive_LAN8720
- 9. AsyncUDPServer_LAN8720
- 10. AsyncUDPMulticastServer_LAN8720
- 11. multiFileProject ใหม่
- 12. multiFileProject_LAN8720 ใหม่
- ตัวอย่าง AsyncUdpNTPClient
- 1. ไฟล์ AsyncUdpNTPClient.ino
- 2. ไฟล์กำหนด.h
- ตัวอย่างเอาต์พุตเทอร์มินัลดีบัก
- 1. AsyncUdpNTPClient บน STM32F7 NUCLEO_F767ZI พร้อม LAN8742A Ethernet โดยใช้ STM32Ethernet Library
- 2. AsyncUdpNTPClient_LAN8720 บน STM32F4 BLACK_F407VE พร้อม LAN8720 Ethernet โดยใช้ STM32Ethernet Library
- ดีบัก
- การแก้ไขปัญหา
- ปัญหา
- สิ่งที่ต้องทำ
- เสร็จแล้ว
- ผลงานและคำขอบคุณ
- มีส่วนร่วม
- ใบอนุญาต
- ลิขสิทธิ์
การเปลี่ยนแปลงที่สำคัญจาก v1.3.0
โปรดดูที่ HOWTO Fix Multiple Definitions
Linker Error
สำหรับบอร์ด Generic STM32F4 series
เช่น STM32F407VE ที่ใช้ LAN8720 โปรดใช้ STM32 core v2.2.0
เนื่องจากการทำลายคอร์ v2.3.0
จะสร้างข้อผิดพลาดในการคอมไพล์ จะแก้ไขได้ในอนาคตอันใกล้นี้
เหตุใดเราจึงต้องมีไลบรารี AsyncUDP_STM32 นี้
คุณสมบัติ
ไลบรารี AsyncUDP_STM32 นี้เป็นไลบรารี UDP แบบอะซิงโครนัสเต็มรูปแบบ ซึ่งออกแบบมาเพื่อสภาพแวดล้อมเครือข่ายที่มีการเชื่อมต่อหลายจุดโดยปราศจากปัญหา สำหรับบอร์ด STM32 ที่ใช้ LAN8720 หรืออีเทอร์เน็ต LAN8742A ในตัว ไลบรารีนี้ใช้งานง่ายและรองรับสภาพแวดล้อมแบบ Unicast, Broadcast และ Multicast
ห้องสมุดนี้มีพื้นฐานมาจาก แก้ไขจาก:
- ESPAsyncUDP ของ Hristo Gochkov
เพื่อใช้คุณสมบัติ อะซิงโครนัส ที่ดีขึ้นและเร็วขึ้นของไลบรารี ESPAsyncUDP อันทรงพลัง ในบอร์ด STM32 โดยใช้ LAN8720 หรืออีเทอร์เน็ต LAN8742A ในตัว
ทำไม Async ถึงดีกว่า
- การใช้เครือข่ายอะซิงโครนัสหมายความว่าคุณสามารถจัดการ การเชื่อมต่อได้มากกว่าหนึ่งรายการในเวลาเดียวกัน
- คุณจะถูกเรียกเมื่อคำขอพร้อมและแยกวิเคราะห์แล้ว
- เมื่อคุณส่งการตอบกลับ คุณก็ พร้อมที่จะจัดการการเชื่อมต่ออื่นๆ ทันที ในขณะที่เซิร์ฟเวอร์ดูแลการส่งการตอบกลับในเบื้องหลัง
- ความเร็วคือพระเจ้า
- หลังจากเชื่อมต่อกับเซิร์ฟเวอร์ UDP ในฐานะไคลเอนต์ Async คุณก็ พร้อมที่จะจัดการการเชื่อมต่ออื่น ๆ ทันที ในขณะที่ไคลเอนต์ดูแลการรับแพ็กเก็ตที่ตอบสนอง 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 -
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
วิธีที่ดีที่สุดคือใช้ 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 โดยใช้ 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 ฯลฯ) คุณต้องคัดลอกไฟล์ STM32 Variant.h ลงในไดเร็กทอรี STM32 stm32 (~/.arduino15/packages/STM32/ ฮาร์ดแวร์/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
HOWTO แก้ไขข้อผิดพลาด Linker Multiple Definitions
การใช้งานไลบรารีปัจจุบันโดยใช้ xyz-Impl.h
แทนมาตรฐาน xyz.cpp
อาจสร้างข้อผิดพลาด Multiple Definitions
Linker ในบางกรณีการใช้งานบางกรณี
คุณสามารถรวมไฟล์ .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
เพียง 1 ไฟล์ ซึ่งต้อง ไม่รวมอยู่ในไฟล์อื่น เพื่อหลีกเลี่ยงข้อผิดพลาด Multiple Definitions
Linker
// 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 );
}
HOWTO ใช้ STM32F4 กับ LAN8720
1. การเดินสายไฟ
นี่คือการต่อสายไฟสำหรับ STM32F4 (BLACK_F407VE ฯลฯ) โดยใช้ LAN8720
LAN8720 พีวาย | - | STM32F4 |
---|
เท็กซัส1 | - | PB_13 |
TX_EN | - | PB_11 |
TX0 | - | PB_12 |
RX0 | - | พีซี_4 |
RX1 | - | พีซี_5 |
เก้า/RETCLK | - | PA_1 |
ซีอาร์เอส | - | PA_7 |
เอ็มดีโอ | - | PA_2 |
เอ็มดีซี | - | พีซี_1 |
จีเอ็นดี | - | จีเอ็นดี |
วีซีซี | - | +3.3V |
2. โปรแกรม HOWTO โดยใช้ STLink V-2 หรือ V-3
เชื่อมต่อดังนี้ ในการโปรแกรมให้ใช้ STM32CubeProgrammer หรือ Arduino IDE พร้อมด้วย
- การสนับสนุน U(S)ART: "เปิดใช้งานแล้ว (อนุกรมทั่วไป)"
- วิธีการอัพโหลด : "STM32CubeProgrammer (SWD)"
เอสทีลิงค์ | - | STM32F4 |
---|
SWCLK | - | SWCLK |
สวีดิโอ | - | สวีดิโอ |
พ.ศ | - | นวส |
จีเอ็นดี | - | จีเอ็นดี |
5v | - | 5V |
3. HOWTO ใช้พอร์ตอนุกรมสำหรับการดีบัก
เชื่อมต่อ FDTI (USB เข้ากับซีเรียล) ดังนี้:
ส.ส.ท | - | STM32F4 |
---|
รับ | - | เท็กซัส=PA_9 |
เท็กซัส | - | RX=PA_10 |
จีเอ็นดี | - | จีเอ็นดี |
ตัวอย่าง
- AsyncUDPClient
- AsyncUdpNTPClient
- AsyncUdpSendReceive
- AsyncUDPServer
- AsyncUDPมัลติคาสต์เซิร์ฟเวอร์
- AsyncUDPClient_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- AsyncUDPServer_LAN8720
- AsyncUDPMulticastServer_LAN8720
- multiFileProject ใหม่
- multiFileProject_LAN8720 ใหม่
ตัวอย่าง AsyncUdpNTPClient
1. ไฟล์ AsyncUdpNTPClient.ino
| # รวม " define.h " |
| # รวม < time.h > |
| |
| // 0.ca.pool.ntp.org |
| เวลาที่อยู่ IP เซิร์ฟเวอร์ IP = ที่อยู่ IP ( 208 , 81 , 1 , 244 ); |
| //time.nist.gov |
| // IPAddress timeServerIP = IPAddress (132, 163, 96, 1); |
| |
| # กำหนด NTP_REQUEST_PORT 123 |
| |
| // ถ่าน timeServer[] = "time.nist.gov"; // เซิร์ฟเวอร์ NTP |
| ถ่าน timeServer[] = " 0.ca.pool.ntp.org " ; |
| |
| const int NTP_PACKET_SIZE = 48 ; // การประทับเวลา NTP อยู่ใน 48 ไบต์แรกของข้อความ |
| |
| ไบต์ packetBuffer [NTP_PACKET_SIZE]; // บัฟเฟอร์เพื่อเก็บแพ็กเก็ตขาเข้าและขาออก |
| |
| // อินสแตนซ์ UDP เพื่อให้เราส่งและรับแพ็กเก็ตผ่าน UDP |
| AsyncUDP Udp; |
| |
| // ส่งคำขอ NTP ไปยังเซิร์ฟเวอร์เวลาตามที่อยู่ที่กำหนด |
| เป็นโมฆะ createNTPpacket ( เป็นโมฆะ ) |
| - |
| อนุกรม println ( " ============= createNTPpacket ============= " ); |
| |
| // ตั้งค่าไบต์ทั้งหมดในบัฟเฟอร์เป็น 0 |
| memset (แพ็คเก็ตบัฟเฟอร์, 0 , NTP_PACKET_SIZE); |
| // เริ่มต้นค่าที่จำเป็นในการสร้างคำขอ NTP |
| // (ดู URL ด้านบนสำหรับรายละเอียดเกี่ยวกับแพ็กเก็ต) |
| |
| แพ็กเก็ตบัฟเฟอร์[ 0 ] = 0b11100011 ; // LI, เวอร์ชัน, โหมด |
| แพ็กเก็ตบัฟเฟอร์[ 1 ] = 0 ; // Stratum หรือประเภทของนาฬิกา |
| แพ็กเก็ตบัฟเฟอร์[ 2 ] = 6 ; // ช่วงเวลาการโพล |
| แพ็กเก็ตบัฟเฟอร์[ 3 ] = 0xEC ; // ความแม่นยำของนาฬิกาเพียร์ |
| |
| // 8 ไบต์ของศูนย์สำหรับ Root Delay & Root Dispersion |
| แพ็กเก็ตบัฟเฟอร์[ 12 ] = 49 ; |
| แพ็กเก็ตบัฟเฟอร์[ 13 ] = 0x4E ; |
| แพ็กเก็ตบัฟเฟอร์[ 14 ] = 49 ; |
| แพ็กเก็ตบัฟเฟอร์[ 15 ] = 52 ; |
| - |
| |
| เป็นโมฆะ parsePacket (แพ็กเก็ต AsyncUDPPacket) |
| - |
| โครงสร้าง tm ts; |
| ถ่าน บุฟ[ 80 ]; |
| |
| memcpy (packetBuffer, packet.data (), ขนาดของ (packetBuffer)); |
| |
| อนุกรม พิมพ์ ( " ประเภทแพ็คเก็ต UDP ที่ได้รับ: " ); |
| อนุกรม println ( packet.isBroadcast () ? " Broadcast " : packet.isMulticast () ? " Multicast " : " Unicast " ); |
| อนุกรม พิมพ์ ( " จาก: " ); |
| อนุกรม พิมพ์ ( packet.remoteIP ()); |
| อนุกรม พิมพ์ ( " : " ); |
| อนุกรม พิมพ์ ( packet.remotePort ()); |
| อนุกรม พิมพ์ ( " , ถึง: " ); |
| อนุกรม พิมพ์ (แพ็คเก็ต. localIP ()); |
| อนุกรม พิมพ์ ( " : " ); |
| อนุกรม พิมพ์ (แพ็คเก็ต. localPort ()); |
| อนุกรม พิมพ์ ( " , ความยาว: " ); |
| อนุกรม พิมพ์ ( ความยาว แพ็กเก็ต ()); |
| อนุกรม พิมพ์ (); |
| |
| highWord ยาว ที่ไม่ได้ลงนาม = คำ (packetBuffer [ 40 ], packetBuffer [ 41 ]); |
| ยาว ที่ไม่ได้ลงนาม lowWord = คำ (packetBuffer [ 42 ], packetBuffer [ 43 ]); |
| |
| // รวมสี่ไบต์ (สองคำ) ให้เป็นจำนวนเต็มยาว |
| // นี่คือเวลา NTP (วินาทีนับตั้งแต่ 1 มกราคม 1900): |
| วินาที ที่ยาวนาน ที่ไม่ได้ลงนามตั้งแต่ 1900 = highWord << 16 | คำต่ำ; |
| |
| อนุกรม พิมพ์ ( F ( " วินาทีตั้งแต่ 1 มกราคม 1900 = " )); |
| อนุกรม println (วินาทีตั้งแต่ 1900); |
| |
| // ตอนนี้แปลงเวลา NTP เป็น )เวลาทุกวัน: |
| อนุกรม พิมพ์ ( F ( " เวลายุค / Unix = " )); |
| |
| // เวลา Unix เริ่มในวันที่ 1 มกราคม 1970 มีหน่วยเป็นวินาที นั่นคือ 2208988800: |
| const ไม่ได้ลงนาม ยาว เจ็ดสิบปี = 2208988800UL ; |
| |
| // ลบเจ็ดสิบปี: |
| ยุค ยาว ที่ไม่ได้ลงนาม = วินาทีตั้งแต่ 1900 - เจ็ดสิบปี; |
| time_t ยุค_t = ยุค; // วินาทีตั้งแต่ 1900 - เจ็ดสิบปี; |
| |
| // พิมพ์เวลา Unix: |
| อนุกรม println (ยุค); |
| |
| // พิมพ์ชั่วโมง นาที และวินาที: |
| อนุกรม พิมพ์ ( F ( " เวลา UTC/GMT คือ " )); // UTC คือเวลาที่ Greenwich Meridian (GMT) |
| |
| ts = * เวลาท้องถิ่น (& epoch_t ); |
| strftime (buf, ขนาดของ (buf), " %a %Y-%m-%d %H:%M:%S %Z " , &ts); |
| อนุกรม println (buf); |
| - |
| |
| เป็นโมฆะ sendNTPPacket ( เป็นโมฆะ ) |
| - |
| createNTPpacket (); |
| // ส่งยูนิคาสต์ |
| อุดรฯ เขียน (packetBuffer, sizeof (packetBuffer)); |
| - |
| |
| การตั้งค่า เป็นโมฆะ () |
| - |
| อนุกรม เริ่มต้น ( 115200 ); |
| ในขณะที่ (!อนุกรม); |
| |
| อนุกรม พิมพ์ ( " n เริ่ม AsyncUdpNTPClient บน " ); อนุกรม พิมพ์ (BOARD_NAME); |
| อนุกรม พิมพ์ (ASYNC_UDP_STM32_VERSION); |
| |
| # ถ้า (_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| อนุกรม พิมพ์ ( " STM32 Core เวอร์ชัน v " ); อนุกรม พิมพ์ (STM32_CORE_VERSION_MAJOR); |
| อนุกรม พิมพ์ ( " . " ); อนุกรม พิมพ์ (STM32_CORE_VERSION_MINOR); |
| อนุกรม พิมพ์ ( " . " ); อนุกรม พิมพ์ (STM32_CORE_VERSION_PATCH); |
| # จบ |
| |
| // เริ่มการเชื่อมต่ออีเธอร์เน็ตและเซิร์ฟเวอร์ |
| // ใช้ mac แบบสุ่ม |
| ดัชนี uint16_t = มิลลิวินาที () % NUMBER_OF_MAC; |
| |
| // ใช้ IP แบบคงที่ |
| // Ethernet.begin(mac[ดัชนี], ip); |
| // ใช้ DHCP ไดนามิก IP และ mac แบบสุ่ม |
| อีเทอร์เน็ต เริ่มต้น (mac[ ดัชนี ]); |
| |
| // คุณเชื่อมต่อแล้ว ดังนั้นให้พิมพ์ข้อมูลออกมา |
| อนุกรม พิมพ์ ( F ( " คุณเชื่อมต่อกับเครือข่ายแล้ว, IP = " )); |
| อนุกรม println (อีเทอร์เน็ต localIP ()); |
| |
| // คำขอ NTP ไปที่พอร์ต NTP_REQUEST_PORT = 123 |
| ถ้า ( เชื่อมต่อ Udp (timeServerIP, NTP_REQUEST_PORT)) |
| // ถ้า (Udp.connect(timeServer, NTP_REQUEST_PORT)) |
| - |
| อนุกรม println ( " เชื่อมต่อ UDP " ); |
| |
| อุดรฯ onPacket ([](แพ็กเก็ต AsyncUDPPacket) |
| - |
| parsePacket (แพ็กเก็ต); |
| - |
| - |
| - |
| |
| โมฆะ วง () |
| - |
| sendNTPPacket (); |
| |
| // รอ 60 วินาทีก่อนถามเวลาอีกครั้ง |
| ล่าช้า ( 60000 ); |
| - |
2. ไฟล์กำหนด.h
| - |
| การสนับสนุนในปัจจุบัน |
| 1) บอร์ด STM32 ที่มี Ethernet ในตัว (เพื่อใช้ 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) บอร์ด STM32F/L/H/G/WB/MP1 (พร้อมแฟลช 32+K) ที่ใช้ชีลด์ ENC28J60 (เพื่อใช้ USE_BUILTIN_ETHERNET = false) |
| 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! โปรดตรวจสอบเครื่องมือ -> การตั้งค่าบอร์ด |
| #เอ็นดิฟ |
| |
| #define ASYNC_UDP_STM32_DEBUG_PORT อนุกรม |
| |
| // ใช้ตั้งแต่ 0 ถึง 4 จำนวนที่สูงขึ้น ข้อความการแก้ไขข้อบกพร่องและการใช้หน่วยความจำมากขึ้น |
| #define _ASYNC_UDP_STM32_LOGLEVEL_ 1 |
| |
| |
| #ถ้า กำหนดไว้( STM32F0 ) |
| #warning เลือกบอร์ด STM32F0 แล้ว |
| #define BOARD_TYPE "STM32F0" |
| #elif กำหนดไว้( STM32F1 ) |
| #คำเตือน เลือกบอร์ด STM32F1 แล้ว |
| #define BOARD_TYPE "STM32F1" |
| #elif กำหนดไว้( STM32F2 ) |
| #คำเตือน เลือกบอร์ด STM32F2 แล้ว |
| #define BOARD_TYPE "STM32F2" |
| #elif กำหนดไว้( STM32F3 ) |
| #คำเตือน เลือกบอร์ด STM32F3 แล้ว |
| #define BOARD_TYPE "STM32F3" |
| #elif กำหนดไว้( STM32F4 ) |
| #คำเตือน เลือกบอร์ด STM32F4 แล้ว |
| #define BOARD_TYPE "STM32F4" |
| #elif กำหนดไว้ ( STM32F7 ) |
| #คำเตือน เลือกบอร์ด STM32F7 แล้ว |
| #define BOARD_TYPE "STM32F7" |
| #elif กำหนดไว้( STM32L0 ) |
| #คำเตือน เลือกบอร์ด STM32L0 แล้ว |
| #define BOARD_TYPE "STM32L0" |
| #elif กำหนดไว้( STM32L1 ) |
| #คำเตือน เลือกบอร์ด STM32L1 แล้ว |
| #define BOARD_TYPE "STM32L1" |
| #elif กำหนดไว้( STM32L4 ) |
| #คำเตือน เลือกบอร์ด STM32L4 แล้ว |
| #define BOARD_TYPE "STM32L4" |
| #elif กำหนด( STM32H7 ) |
| #คำเตือน เลือกบอร์ด STM32H7 แล้ว |
| #define BOARD_TYPE "STM32H7" |
| #elif กำหนดไว้( STM32G0 ) |
| #warning เลือกบอร์ด STM32G0 แล้ว |
| #define BOARD_TYPE "STM32G0" |
| #elif กำหนดไว้ ( STM32G4 ) |
| #คำเตือน เลือกบอร์ด STM32G4 แล้ว |
| #define BOARD_TYPE "STM32G4" |
| #elif กำหนดไว้ ( STM32WB ) |
| #คำเตือน เลือกบอร์ด STM32WB แล้ว |
| #define BOARD_TYPE "STM32WB" |
| #elif กำหนดไว้ ( STM32MP1 ) |
| #warning เลือกบอร์ด STM32MP1 แล้ว |
| #define BOARD_TYPE "STM32MP1" |
| #อื่น |
| #warning เลือกบอร์ดที่ไม่รู้จัก STM32 แล้ว |
| #define BOARD_TYPE "ไม่ทราบ STM32" |
| #เอ็นดิฟ |
| |
| #ifndef BOARD_NAME |
| #กำหนด BOARD_NAME BOARD_TYPE |
| #เอ็นดิฟ |
| |
| #รวม <LwIP.h> |
| #รวม <STM32Ethernet.h> |
| |
| #รวม <AsyncUDP_STM32.h> |
| |
| // ป้อนที่อยู่ MAC และที่อยู่ IP สำหรับคอนโทรลเลอร์ของคุณด้านล่าง |
| #กำหนด 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 ( 192 , 168 , 2 , 232 ); |
| |
| #endif //กำหนด_h |
ตัวอย่างเอาต์พุตเทอร์มินัลดีบัก
1. AsyncUdpNTPClient บน STM32F7 NUCLEO_F767ZI พร้อม LAN8742A Ethernet โดยใช้ STM32Ethernet Library
นี่คือเอาต์พุตดีบักเทอร์มินัลเมื่อรัน 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 Library
นี่คือเอาต์พุตดีบักเทอร์มินัลเมื่อรัน AsyncUdpNTPClient_LAN8720 บน STM32F4 BLACK_F407VE พร้อม LAN8720 Ethernet โดยใช้ STM32Ethernet Library โดยเชื่อมต่อกับเซิร์ฟเวอร์ 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
หรือไลบรารี่ที่ขึ้นอยู่กับ
บางครั้ง ไลบรารีจะทำงานก็ต่อเมื่อคุณอัปเดตคอร์ 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 ขอขอบคุณ Hristo Gochkov สำหรับห้องสมุด ESPAsyncUDP ที่ยอดเยี่ยม
- อาศัยไลบรารี STM32duino LwIP ของ Frederic Pillon
- ขอขอบคุณผลงานดีๆ ของ Miguel Wisintainer สำหรับการร่วมงาน การพัฒนา การดีบัก และการทดสอบ
️ ฮริสโต โกชคอฟ
| ️ เฟรเดริก พิลลอน
| ทีซีปิปชิป
|
มีส่วนร่วม
หากคุณต้องการมีส่วนร่วมในโครงการนี้:
- รายงานข้อบกพร่องและข้อผิดพลาด
- ขอการปรับปรุง
- สร้างปัญหาและดึงคำขอ
- บอกคนอื่นเกี่ยวกับห้องสมุดนี้
ใบอนุญาต
- ห้องสมุดได้รับอนุญาตภายใต้ MIT
ลิขสิทธิ์
ลิขสิทธิ์ (c) 2020- คอยฮวง