Библиотека AsyncUDP_STM32
Оглавление
- Важное изменение по сравнению с версией 1.3.0
- Зачем нам нужна эта библиотека AsyncUDP_STM32
- Функции
- Почему Async лучше
- Поддерживаемые в настоящее время платы
- Журнал изменений
- Предварительные условия
- Установка
- Используйте диспетчер библиотек Arduino.
- Ручная установка
- VS-код и платформаIO
- Патчи пакетов
- 1. Для плат STM32 используйте LAN8720.
- 2. Для плат STM32 используйте Serial1.
- КАК исправить ошибку компоновщика
Multiple Definitions
- HOWTO Настройка асинхронного UDP-клиента
- КАК использовать STM32F4 с LAN8720
- 1. Проводка
- 2. Программирование HOWTO с использованием STLink V-2 или V-3.
- 3. КАК использовать последовательный порт для отладки
- Примеры
- 1. АсинкУДПКлиент
- 2. АсинкудпНТПКлиент
- 3. Асинкудпсендрецеиве
- 4. АсинкУДПсервер
- 5. Асинхронный UDPMulticastServer
- 6. АсинкУДПКлиент_LAN8720
- 7. АсинкУдпНТПКлиент_LAN8720
- 8. AsyncUdpSendReceive_LAN8720
- 9. АсинкУДПсервер_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.
- Отлаживать
- Поиск неисправностей
- Проблемы
- ДЕЛАТЬ
- СДЕЛАННЫЙ
- Вклад и благодарность
- Содействие
- Лицензия
- Авторское право
Важное изменение по сравнению с версией 1.3.0
Пожалуйста, ознакомьтесь с HOWTO, чтобы исправить ошибку компоновщика Multiple Definitions
Для плат Generic STM32F4 series
, таких как STM32F407VE, использующих LAN8720, используйте ядро STM32 v2.2.0
, поскольку нарушение ядра v2.3.0
приводит к ошибке компиляции. Исправим в ближайшее время.
Зачем нам нужна эта библиотека AsyncUDP_STM32
Функции
Эта библиотека AsyncUDP_STM32 представляет собой полностью асинхронную библиотеку UDP, разработанную для бесперебойной сетевой среды с несколькими подключениями для плат STM32, использующих LAN8720 или встроенный Ethernet LAN8742A. Библиотека проста в использовании и включает поддержку сред одноадресной, широковещательной и многоадресной рассылки.
Эта библиотека основана на модифицированной версии:
- ESPAsyncUDP Христо Гочкова
чтобы применить лучшую и быструю асинхронную функцию мощной библиотеки ESPAsyncUDP к платам STM32 с использованием LAN8720 или встроенного Ethernet LAN8742A.
Почему Async лучше
- Использование асинхронной сети означает, что вы можете обрабатывать более одного соединения одновременно.
- Вам позвонят, как только запрос будет готов и проанализирован.
- Когда вы отправляете ответ, вы сразу же готовы обрабатывать другие соединения, пока сервер позаботится об отправке ответа в фоновом режиме.
- Скорость это омг
- После подключения к UDP-серверу в качестве асинхронного клиента вы сразу же готовы обрабатывать другие соединения, в то время как клиент позаботится о получении ответных пакетов UDP в фоновом режиме.
- Вам не требуется проверять в жестком цикле() поступление ответных пакетов UDP для их обработки.
Поддерживаемые в настоящее время платы
- Платы STM32 со встроенным Ethernet LAN8742A, такие как:
- Нуклео-144 (F429ZI, F767ZI)
- Дискавери (STM32F746G-DISCOVERY)
- Все платы STM32 (STM32F/L/H/G/WB/MP1) с флэш-памятью 32K+ и встроенным Ethernet
- См. поддержку 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+
для встроенного Ethernet LAN8742A (Nucleo-144, Discovery). -
LwIP library v2.1.2+
для встроенного Ethernet 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-код
- Установить ПлатформуИО
- Установите библиотеку AsyncUDP_STM32 с помощью диспетчера библиотек. Найдите AsyncUDP_STM32 в авторских библиотеках Platform.io.
- Используйте включенный файл Platformio.ini из примеров, чтобы гарантировать автоматическую установку всех зависимых библиотек. Ознакомьтесь с документацией по другим параметрам и примерам в файле конфигурации проекта.
Патчи пакетов
1. Для плат STM32 используйте LAN8720.
Для плат Generic STM32F4 series
, таких как STM32F407VE
, использующих LAN8720
, используйте ядро STM32 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 вариант.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
.
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. Проводка
Это проводка для STM32F4 (BLACK_F407VE и т. д.) с использованием LAN8720.
LAN8720 PHY | <---> | СТМ32Ф4 |
---|
ТХ1 | <---> | ПБ_13 |
TX_EN | <---> | ПБ_11 |
ТХ0 | <---> | ПБ_12 |
RX0 | <---> | ПК_4 |
RX1 | <---> | ПК_5 |
nINT/RETCLK | <---> | ПА_1 |
CRS | <---> | ПА_7 |
МДИО | <---> | ПА_2 |
МДЦ | <---> | ПК_1 |
Земля | <---> | Земля |
ВКК | <---> | +3,3 В |
2. Программирование HOWTO с использованием STLink V-2 или V-3.
Подключите следующим образом. Для программирования используйте STM32CubeProgrammer или Arduino IDE с
- Поддержка U(S)ART: «Включено (общий серийный номер)».
- Метод загрузки: «STM32CubeProgrammer (SWD)».
СТЛинк | <---> | СТМ32Ф4 |
---|
SWCLK | <---> | SWCLK |
СВДИО | <---> | СВДИО |
РСТ | <---> | НРСТ |
Земля | <---> | Земля |
5 В | <---> | 5В |
3. КАК использовать последовательный порт для отладки
Подключите FDTI (USB к последовательному порту) следующим образом:
ФДТИ | <---> | СТМ32Ф4 |
---|
прием | <---> | ТХ=PA_9 |
Техас | <---> | RX=PA_10 |
Земля | <---> | Земля |
Примеры
- АсинкУДПКлиент
- АсинкудпНТПКлиент
- Асинкудпсендрецеиве
- АсинкУДПсервер
- Асинхронный UDPMulticastServer
- АсинкУДПКлиент_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- АсинкУДПсервер_LAN8720
- AsyncUDPMulticastServer_LAN8720
- multiFileProject Новый
- multiFileProject_LAN8720 Новый
Пример AsyncUdpNTPClient
1. Файл AsyncUdpNTPClient.ino.
| # включаем " defines.h " |
| # включаем < time.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 " ; |
| |
| const int NTP_PACKET_SIZE = 48 ; // Метка времени NTP находится в первых 48 байтах сообщения |
| |
| байтовый packageBuffer[NTP_PACKET_SIZE]; // буфер для хранения входящих и исходящих пакетов |
| |
| // Экземпляр UDP, позволяющий отправлять и получать пакеты по UDP |
| Асинхронный UDP; |
| |
| // отправляем запрос NTP на сервер времени по указанному адресу |
| недействительный createNTPpacket ( недействительный ) |
| { |
| Сериал. println ( " ============= createNTPpacket ============= " ); |
| |
| // устанавливаем все байты в буфере в 0 |
| memset (packetBuffer, 0 , NTP_PACKET_SIZE); |
| // Инициализируем значения, необходимые для формирования NTP-запроса |
| // (подробную информацию о пакетах см. в URL-адресе выше) |
| |
| packageBuffer[ 0 ] = 0b11100011 ; // LI, Версия, Режим |
| packageBuffer[ 1 ] = 0 ; // Stratum, или тип часов |
| packageBuffer[ 2 ] = 6 ; // Интервал опроса |
| packageBuffer[ 3 ] = 0xEC ; // Точность равноправных часов |
| |
| // 8 байтов нуля для корневой задержки и корневой дисперсии |
| packageBuffer[ 12 ] = 49 ; |
| packageBuffer[ 13 ] = 0x4E ; |
| packageBuffer[ 14 ] = 49 ; |
| packageBuffer[ 15 ] = 52 ; |
| } |
| |
| void parsePacket (пакет AsyncUDPPacket) |
| { |
| структура ТМ ТС; |
| char buf[ 80 ]; |
| |
| memcpy (packetBuffer, package.data (), sizeof (packetBuffer)); |
| |
| Сериал. print ( " Тип полученного UDP-пакета: " ); |
| Сериал. println (packet. isBroadcast ()? « Broadcast » : package. isMulticast ()? « Многоадресная рассылка » : « Одноадресная рассылка » ); |
| Сериал. печать ( « От: » ); |
| Сериал. печать ( packet.remoteIP ()); |
| Сериал. печать ( " : " ); |
| Сериал. печать ( packet.remotePort ()); |
| Сериал. печать ( " , Кому: " ); |
| Сериал. печать (пакет. localIP ()); |
| Сериал. печать ( " : " ); |
| Сериал. печать (пакет. localPort ()); |
| Сериал. печать ( " , Длина: " ); |
| Сериал. печать (packet. length ()); |
| Сериал. печатьln (); |
| |
| беззнаковое длинное слово highWord = слово (packetBuffer[ 40 ], packageBuffer[ 41 ]); |
| беззнаковое длинное lowWord = слово (packetBuffer[ 42 ], packageBuffer[ 43 ]); |
| |
| // объединяем четыре байта (два слова) в длинное целое число |
| // это время NTP (в секундах с 1 января 1900 года): |
| unsigned long secsSince1900 = highWord << 16 | низкое слово; |
| |
| Сериал. print ( F ( " Секунды с 1 января 1900 = " )); |
| Сериал. println (secsSince1900); |
| |
| // теперь преобразуем время NTP в повседневное время: |
| Сериал. print ( F ( " Эпоха/время Unix = " )); |
| |
| // Время Unix начинается 1 января 1970 года. В секундах это 2208988800: |
| const unsigned long SeventyYears = 2208988800UL ; |
| |
| // вычитаем семьдесят лет: |
| беззнаковая длинная эпоха = secsSince1900 - семьдесят лет; |
| time_t epoch_t = эпоха; // secsSince1900 - семьдесят лет; |
| |
| // распечатываем 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 (буф); |
| } |
| |
| недействительный sendNTPPacket ( недействительный ) |
| { |
| создатьNTPпакет (); |
| // Отправляем одноадресную рассылку |
| Удп. запись (packetBuffer, sizeof (packetBuffer)); |
| } |
| |
| недействительная настройка () |
| { |
| Сериал. начать ( 115200 ); |
| пока (!Последовательный); |
| |
| Сериал. print ( " n Запустить AsyncUdpNTPClient on " ); Сериал. println (BOARD_NAME); |
| Сериал. println (ASYNC_UDP_STM32_VERSION); |
| |
| # if (_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| Сериал. print ( " STM32 Core версия v " ); Сериал. распечатать (STM32_CORE_VERSION_MAJOR); |
| Сериал. печать ( « . » ); Сериал. распечатать (STM32_CORE_VERSION_MINOR); |
| Сериал. печать ( « . » ); Сериал. println (STM32_CORE_VERSION_PATCH); |
| # окончание |
| |
| // запускаем Ethernet-соединение и сервер |
| // Используем случайный Mac |
| uint16_t index = миллис () % NUMBER_OF_MAC; |
| |
| // Используем статический IP |
| // Ethernet.begin(mac[index], ip); |
| // Использовать динамический IP-адрес DHCP и случайный Mac |
| Ethernet. начать (mac[ индекс ]); |
| |
| // теперь вы подключены, поэтому распечатываем данные |
| Сериал. print ( F ( " Вы подключены к сети, IP = " )); |
| Сериал. println ( Ethernet.localIP ()); |
| |
| // NTP-запросы направляются на порт NTP_REQUEST_PORT = 123 |
| если ( Udp.connect (timeServerIP, NTP_REQUEST_PORT)) |
| // если (Udp.connect(timeServer, NTP_REQUEST_PORT)) |
| { |
| Сериал. println ( " Соединение по UDP " ); |
| |
| Удп. onPacket ([](пакет AsyncUDPPacket) |
| { |
| parsePacket (пакет); |
| }); |
| } |
| } |
| |
| пустой цикл () |
| { |
| отправитьNTPPacket (); |
| |
| // подождем 60 секунд, прежде чем снова запросить время |
| задержка ( 60000 ); |
| } |
2. Файл определяет.h
| /* |
| В настоящее время поддержка |
| 1) Платы STM32 со встроенным Ethernet (для использования USE_BUILTIN_ETHERNET = true), например: |
| - Нуклео-144 (F429ZI, F767ZI) |
| - Дискавери (STM32F746G-DISCOVERY) |
| - Платы STM32 (STM32F/L/H/G/WB/MP1) с флэш-памятью 32K+, со встроенным Ethernet, |
| - См. раздел «Как использовать встроенный Ethernet» по адресу (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! Пожалуйста, проверьте настройки Инструменты->Плата. |
| #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 //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
или зависимых библиотек.
Иногда библиотека будет работать только в том случае, если вы обновите ядро STM32
до последней версии, потому что я всегда использую последние ядра/библиотеки.
Проблемы
Отправлять проблемы в: Проблемы AsyncUDP_STM32.
ДЕЛАТЬ
- Исправить ошибку. Добавить улучшение
- Добавлена поддержка большего количества экранов Ethernet/Wi-Fi.
- Добавьте поддержку большего количества плат STM32.
СДЕЛАННЫЙ
- Начальный порт на STM32 с использованием встроенного Ethernet LAN8742A. Проверено на 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 v2.3.0
- Добавьте примеры multiFileProject и multiFileProject_LAN8720 в демонстрацию для многофайлового проекта, чтобы избежать ошибки компоновщика
multiple-definitions
Вклад и благодарность
- Основан на ESPAsyncUDP Христо Гочкова и модифицирован на его основе. Большое спасибо Христо Гочкову за прекрасную библиотеку ESPAsyncUDP.
- Использовалась LwIP-библиотека STM32duino Фредерика Пиллона.
- Спасибо Мигелю Визинтайнеру за хорошую работу, разработку, отладку и тестирование.
️️ Христо Гочков
| ️ Фредерик Пиллон
| tcpipchip
|
Содействие
Если вы хотите внести свой вклад в этот проект:
- Сообщайте об ошибках и ошибках
- Попросите улучшения
- Создавайте задачи и запросы на извлечение
- Расскажите другим людям об этой библиотеке
Лицензия
- Библиотека имеет лицензию MIT.
Авторское право
Copyright (c) 2020- Хой Хоанг