AsyncUDP_STM32 라이브러리
목차
- v1.3.0의 중요 변경 사항
- 이 AsyncUDP_STM32 라이브러리가 필요한 이유는 무엇입니까?
- 특징
- 비동기가 더 나은 이유
- 현재 지원되는 보드
- 변경 내역
- 전제 조건
- 설치
- Arduino 라이브러리 관리자 사용
- 수동 설치
- VS 코드 및 플랫폼IO
- 패키지의 패치
- 1. LAN8720을 사용하는 STM32 보드의 경우
- 2. STM32 보드가 Serial1을 사용하려면
-
Multiple Definitions
링커 오류를 수정하는 방법 - 비동기 UDP 클라이언트 설정 방법
- LAN8720과 함께 STM32F4를 사용하는 방법
- 1. 배선
- 2. STLink V-2 또는 V-3을 사용한 HOWTO 프로그램
- 3. 디버깅을 위해 직렬 포트를 사용하는 방법
- 예
- 1. 비동기UDP클라이언트
- 2. AsyncUdpNTP클라이언트
- 3. AsyncUdpSendReceive
- 4. 비동기UDP서버
- 5. AsyncUDP멀티캐스트서버
- 6. AsyncUDPClient_LAN8720
- 7. AsyncUdpNTPClient_LAN8720
- 8. AsyncUdpSendReceive_LAN8720
- 9. AsyncUDPServer_LAN8720
- 10. AsyncUDPMulticastServer_LAN8720
- 11. 멀티파일프로젝트 신규
- 12. multiFileProject_LAN8720 신규
- 예 AsyncUdpNTPClient
- 1. 파일 AsyncUdpNTPClient.ino
- 2. 파일 정의.h
- 디버그 터미널 출력 샘플
- 1. STM32Ethernet 라이브러리를 사용하는 LAN8742A 이더넷을 갖춘 STM32F7 NUCLEO_F767ZI의 AsyncUdpNTPClient
- 2. STM32Ethernet 라이브러리를 사용하는 LAN8720 이더넷을 갖춘 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 라이브러리는 LAN8720 또는 내장 LAN8742A 이더넷을 사용하는 STM32 보드용 문제 없는 다중 연결 네트워크 환경을 위해 설계된 완전 비동기식 UDP 라이브러리입니다. 라이브러리는 사용하기 쉽고 유니캐스트, 브로드캐스트 및 멀티캐스트 환경에 대한 지원을 포함합니다.
이 라이브러리는 다음을 기반으로 하고 수정되었습니다.
- Hristo Gochkov의 ESPAsyncUDP
LAN8720 또는 내장 LAN8742A 이더넷을 사용하여 강력한 ESPAsyncUDP 라이브러리의 더 좋고 빠른 비동기 기능을 STM32 보드에 적용합니다.
비동기가 더 나은 이유
- 비동기 네트워크를 사용한다는 것은 동시에 둘 이상의 연결을 처리할 수 있음을 의미합니다.
- 요청이 준비되고 구문 분석되면 호출됩니다.
- 응답을 보내면 서버가 백그라운드에서 응답 전송을 처리하는 동안 즉시 다른 연결을 처리할 준비가 됩니다.
- 속도는 맙소사
- 비동기 클라이언트로 UDP 서버에 연결한 후에는 클라이언트가 백그라운드에서 UDP 응답 패킷 수신을 처리하는 동안 다른 연결을 즉시 처리할 수 있습니다.
- 이를 처리하기 위해 UDP 응답 패킷의 도착을 엄격한 루프()로 확인할 필요가 없습니다.
현재 지원되는 보드
- 다음과 같은 이더넷 LAN8742A가 내장된 STM32 보드 :
- 뉴클레오-144(F429ZI, F767ZI)
- 디스커버리(STM32F746G-DISCOVERY)
- 32K+ 플래시, 내장 이더넷을 갖춘 모든 STM32 보드(STM32F/L/H/G/WB/MP1)
- EthernetWebServer_STM32 지원 및 테스트 결과 보기
- 다음과 같은 이더넷 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)
전제 조건
- 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
을 다운로드하세요. -
AsyncUDP_STM32-master
디렉터리에 zip 파일을 추출합니다. - 전체
AsyncUDP_STM32-master
폴더를 ~/Arduino/libraries/
와 같은 Arduino 라이브러리 디렉터리에 복사합니다.
VS 코드 및 플랫폼IO:
- VS 코드 설치
- PlatformIO 설치
- 라이브러리 관리자를 사용하여 AsyncUDP_STM32 라이브러리를 설치합니다. Platform.io 작성자 라이브러리에서 AsyncUDP_STM32 검색
- 예제에 포함된 platformio.ini 파일을 사용하여 모든 종속 라이브러리가 자동으로 설치되도록 하세요. 프로젝트 구성 파일에서 다른 옵션과 예제에 대한 설명서를 참조하세요.
패키지의 패치
1. LAN8720을 사용하는 STM32 보드의 경우
LAN8720
사용하는 STM32F407VE
와 같은 Generic STM32F4 series
보드의 경우 코어 v2.3.0
중단하면 컴파일 오류가 발생하므로 STM32 코어 v2.2.0
사용하십시오.
일부 STM32 보드에서 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)
이전 파일을 덮어쓰려면 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을 사용하려면 STM32 변형.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
, .cpp
또는 .ino
파일에만 다음 .h
파일을 사용해야 합니다.
// 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 등)의 Wiring 입니다.
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 | <---> | 송신=PA_9 |
텍사스 | <---> | RX=PA_10 |
접지 | <---> | 접지 |
예
- 비동기UDP클라이언트
- AsyncUdpNTP클라이언트
- AsyncUdp보내기수신
- 비동기UDP서버
- AsyncUDP멀티캐스트서버
- AsyncUDPClient_LAN8720
- AsyncUdpNTPClient_LAN8720
- AsyncUdpSendReceive_LAN8720
- AsyncUDPServer_LAN8720
- AsyncUDPMulticastServer_LAN8720
- multiFileProject 신규
- multiFileProject_LAN8720 신규
예 AsyncUdpNTPClient
1. 파일 AsyncUdpNTPClient.ino
| # " 정의합니다 .h "를 포함합니다 |
| # < time.h > 포함 |
| |
| // 0.ca.pool.ntp.org |
| IPAddress timeServerIP = IPAddress( 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바이트에 있습니다. |
| |
| 바이트 패킷 버퍼[NTP_PACKET_SIZE]; // 들어오고 나가는 패킷을 보관하기 위한 버퍼 |
| |
| // UDP를 통해 패킷을 보내고 받을 수 있는 UDP 인스턴스 |
| AsyncUDP UDP; |
| |
| // 주어진 주소의 시간 서버에 NTP 요청을 보냅니다. |
| 무효 createNTPpacket ( 무효 ) |
| { |
| 연속물. println ( " ============= createNTPpacket ============= " ); |
| |
| // 버퍼의 모든 바이트를 0으로 설정 |
| memset (packetBuffer, 0 , NTP_PACKET_SIZE); |
| // NTP 요청을 형성하는 데 필요한 값을 초기화합니다. |
| // (패킷에 대한 자세한 내용은 위의 URL 참조) |
| |
| 패킷 버퍼[ 0 ] = 0b11100011 ; // LI, 버전, 모드 |
| 패킷버퍼[ 1 ] = 0 ; // 지층 또는 시계 유형 |
| 패킷버퍼[ 2 ] = 6 ; // 폴링 간격 |
| 패킷버퍼[ 3 ] = 0xEC ; // 피어 클럭 정밀도 |
| |
| // 루트 지연 및 루트 분산을 위한 0의 8바이트 |
| 패킷버퍼[ 12 ] = 49 ; |
| 패킷버퍼[ 13 ] = 0x4E ; |
| 패킷버퍼[ 14 ] = 49 ; |
| 패킷버퍼[ 15 ] = 52 ; |
| } |
| |
| 무효 ParsePacket (AsyncUDPPacket 패킷) |
| { |
| 구조체 tm ts; |
| char buf[ 80 ]; |
| |
| memcpy (packetBuffer, packet.data (), sizeof (packetBuffer)); |
| |
| 연속물. print ( " 수신된 UDP 패킷 유형: " ); |
| 연속물. println ( packet.isBroadcast () ? " Broadcast " : packet.isMulticast () ? " Multicast " : " Unicast " ); |
| 연속물. 인쇄 ( " 보낸 사람: " ); |
| 연속물. 인쇄 ( packet.remoteIP ()); |
| 연속물. 인쇄 ( " : " ); |
| 연속물. 인쇄 ( packet.remotePort ()); |
| 연속물. 인쇄 ( " , 받는 사람: " ); |
| 연속물. 인쇄 ( packet.localIP ()); |
| 연속물. 인쇄 ( " : " ); |
| 연속물. 인쇄 ( packet.localPort ()); |
| 연속물. 인쇄 ( " , 길이: " ); |
| 연속물. 인쇄 (패킷 길이 ()); |
| 연속물. 인쇄 (); |
| |
| unsigned long highWord = word (packetBuffer[ 40 ], packetBuffer[ 41 ]); |
| unsigned long lowWord = word (packetBuffer[ 42 ], packetBuffer[ 43 ]); |
| |
| // 4바이트(두 단어)를 긴 정수로 결합합니다. |
| // 이것은 NTP 시간입니다(1900년 1월 1일 이후의 초): |
| 부호 없는 긴 secsSince1900 = highWord << 16 | 낮은단어; |
| |
| 연속물. print ( F ( " 1900년 1월 1일 이후의 초 = " )); |
| 연속물. println (secsSince1900); |
| |
| // 이제 NTP 시간을 일상 시간으로 변환합니다. |
| 연속물. print ( F ( " 에포크/유닉스 시간 = " )); |
| |
| // Unix 시간은 1970년 1월 1일에 시작됩니다. 초 단위는 2208988800입니다. |
| const unsigned long sixtyYears = 2208988800UL ; |
| |
| // 70년을 뺍니다: |
| 부호 없는 긴 시대 = secsSince1900 - 칠십년; |
| time_t epoch_t = 에포크; // secsSince1900 - 칠십년; |
| |
| // 유닉스 시간을 인쇄합니다: |
| 연속물. 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); |
| } |
| |
| 무효 sendNTPPacket ( 무효 ) |
| { |
| NTP패킷 생성 (); |
| // 유니캐스트 보내기 |
| UDP. 쓰기 (패킷버퍼, 크기 (패킷버퍼)); |
| } |
| |
| 무효 설정 () |
| { |
| 연속물. 시작 ( 115200 ); |
| 동안 (!직렬); |
| |
| 연속물. print ( " n AsyncUdpNTPClient 시작 " ); 연속물. println (BOARD_NAME); |
| 연속물. println (ASYNC_UDP_STM32_VERSION); |
| |
| # if (_ASYNC_UDP_STM32_LOGLEVEL_ > 2) |
| 연속물. 인쇄 ( " STM32 코어 버전 v " ); 연속물. 인쇄 (STM32_CORE_VERSION_MAJOR); |
| 연속물. 인쇄 ( " . " ); 연속물. 인쇄 (STM32_CORE_VERSION_MINOR); |
| 연속물. 인쇄 ( " . " ); 연속물. println (STM32_CORE_VERSION_PATCH); |
| # endif |
| |
| // 이더넷 연결과 서버를 시작합니다. |
| // 임의의 맥을 사용 |
| uint16_t 인덱스 = 밀리초 () % NUMBER_OF_MAC; |
| |
| // 고정 IP 사용 |
| // 이더넷.begin(mac[index], ip); |
| // DHCP 동적 IP 및 임의 Mac 사용 |
| 이더넷. 시작 (mac[ 인덱스 ]); |
| |
| // 이제 연결되었으므로 데이터를 출력합니다. |
| 연속물. print ( F ( " 네트워크에 연결되었습니다. IP = " )); |
| 연속물. println ( Ethernet.localIP ()); |
| |
| // NTP 요청은 NTP_REQUEST_PORT = 123 포트로 이루어집니다. |
| if ( Udp.connect (timeServerIP, NTP_REQUEST_PORT)) |
| // if (Udp.connect(timeServer, NTP_REQUEST_PORT)) |
| { |
| 연속물. println ( " UDP 연결됨 " ); |
| |
| UDP. onPacket ([](AsyncUDPPacket 패킷) |
| { |
| parsPacket (패킷); |
| }); |
| } |
| } |
| |
| 무효 루프 () |
| { |
| sendNTPPacket (); |
| |
| // 시간을 다시 묻기 전에 60초를 기다립니다. |
| 지연 ( 60000 ); |
| } |
2. 파일 정의.h
| /* |
| 현재 지원 |
| 1) 다음과 같은 이더넷이 내장된 STM32 보드(USE_BUILTIN_ETHERNET = true 사용) |
| - 뉴클레오-144 (F429ZI, F767ZI) |
| - 디스커버리(STM32F746G-DISCOVERY) |
| - 32K+ 플래시, 내장 이더넷을 갖춘 STM32 보드(STM32F/L/H/G/WB/MP1) |
| - 내장 이더넷 사용 방법은 (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 |
| |
| 바이트 맥 [][ 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. 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 이더넷을 갖춘 STM32F4 BLACK_F407VE의 AsyncUdpNTPClient_LAN8720
STM32Ethernet Library를 사용하여 LAN8720 이더넷을 갖춘 STM32F4 BLACK_F407VE 에서 AsyncUdpNTPClient_LAN8720을 실행할 때의 터미널 디버그 출력입니다. AsyncUDP_STM32 라이브러리를 사용하여 NTP 서버 time.windows.com(IP=13.86.101.172)에 연결하고 60초마다 NTP 시간을 요청합니다. 그런 다음 패킷이 수신되어 비동기적으로 처리되어 현재 UTC/GMT 시간을 인쇄합니다.
Start AsyncUdpNTPClient_LAN8720 on BLACK_F407VE
AsyncUdp_STM32 v1 .3.0
STM32 Core version v2 .3.0
You ' re connected to the network, IP = 192.168.2.151
UDP connected
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858616
Epoch/Unix time = 1655869816
The UTC/GMT time is Wed 2022-06-22 03:50:16 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858676
Epoch/Unix time = 1655869876
The UTC/GMT time is Wed 2022-06-22 03:51:16 GMT
============= createNTPpacket =============
Received UDP Packet Type: Unicast
From: 208.81.1.244:123, To: 192.168.2.157:62510, Length: 48
Seconds since Jan 1 1900 = 3864858735
Epoch/Unix time = 1655869935
The UTC/GMT time is Wed 2022-06-22 03:52:15 GMT
디버그
디버그는 직렬에서 기본적으로 활성화됩니다. 비활성화하려면 레벨 0을 사용하십시오.
# define ASYNC_UDP_STM32_DEBUG_PORT Serial
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
# define _ASYNC_UDP_STM32_LOGLEVEL_ 0
디버깅 수준을 0에서 4로 변경할 수도 있습니다.
# define ASYNC_UDP_STM32_DEBUG_PORT Serial
// Use from 0 to 4. Higher number, more debugging messages and memory usage.
# define _ASYNC_UDP_STM32_LOGLEVEL_ 4
문제 해결
컴파일 오류가 자주 발생하는 경우 최신 버전의 Arduino IDE, Arduino STM32
코어 또는 종속 라이브러리를 설치해야 할 수도 있습니다.
때로는 항상 최신 코어/라이브러리를 사용하기 때문에 STM32
코어를 최신 버전으로 업데이트하는 경우에만 라이브러리가 작동합니다.
문제
문제 제출: AsyncUDP_STM32 문제
할 일
- 버그를 수정하세요. 개선사항 추가
- 더 많은 이더넷/WiFi 쉴드에 지원 추가
- 더 많은 STM32 보드에 지원을 추가하세요.
완료
- 내장된 LAN8742A Etnernet을 사용하여 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_미니, DIYMORE_F407VGT, FK407M1)
- 다중 정의 링커 오류 수정
- 새로운 STM32 코어 v2.3.0 의 업데이트 예
-
multiple-definitions
링커 오류를 방지하기 위해 다중 파일 프로젝트 데모에 multiFileProject 및 multiFileProject_LAN8720 예제를 추가합니다.
기여와 감사
- Hristo Gochkov의 ESPAsyncUDP를 기반으로 하고 수정되었습니다. 훌륭한 ESPAsyncUDP 라이브러리를 제공해 주신 Hristo Gochkov에게 많은 감사를 드립니다.
- Frederic Pillon의 STM32duino LwIP 라이브러리를 사용했습니다.
- 함께 작업하고, 개발하고, 디버깅하고, 테스트한 Miguel Wisintainer의 노고에 감사드립니다.
️️ 흐리스토 고흐코프
| ️ 프레데릭 필론
| TCPIP칩
|
기여
이 프로젝트에 기여하고 싶다면:
- 버그 및 오류 신고
- 개선을 요청하세요
- 이슈 및 풀 요청 생성
- 다른 사람들에게 이 도서관에 대해 알리세요
특허
- 도서관은 MIT에 따라 라이센스가 부여되었습니다.
저작권
저작권 (c) 2020- 코이호앙