STM32 Ethernet #1 하드웨어 설정 및 Ping Test
CubeMX와 LWIP를 사용하여 STM32 보드에서 이더넷을 구성하는 방법을 알아보세요. 이 첫 번째 튜토리얼에서는 하드웨어 설정, 핀 매핑, PHY 주소, DMA 디스크립터, MPU 설정 및 성공적인 ping 테스트에 대해 다룹니다. STM32 F7/H7 사용자에게 적합합니다. 프로젝트는 게시물 끝부분에서 다운로드할 수 있습니다.
이 튜토리얼은 STM32 이더넷 시리즈의 시작을 알립니다. 첫 번째 파트에서는 하드웨어 설정 구성에 중점을 두겠습니다.
일부 마이크로컨트롤러의 경우 기본 설정을 사용하면 구성이 비교적 간단합니다. 그러나 다른 마이크로컨트롤러, 특히 Cortex-M7 아키텍처 기반 마이크로컨트롤러의 경우 캐시 가능한 메모리 영역에서 발생하는 데이터 일관성과 같은 문제로 인해 이 과정이 더 복잡해질 수 있습니다.
각 단계를 명확하고 자세하게 설명하기 위해 최선을 다하겠습니다. 다양한 설정의 영향을 더 깊이 이해하려면 이 글 마지막에 포함된 비디오를 시청하는 것을 강력히 권장합니다.
비디오 튜토리얼
STM32에서 이더넷 주변 장치 소개
CubeMX 구성
코드
결과
프로젝트 다운로드
이 프로젝트에 대한 전체 설명과 작동 방식을 보려면 영상을 확인하세요.
STM32에서 이더넷 주변 장치 소개
STM32 마이크로컨트롤러의 이더넷 주변장치는 IEEE 802.3 표준 기반의 고속 유선 통신을 지원합니다. STM32 장치는 근거리 통신망(LAN)에 직접 연결하여 TCP/IP 또는 UDP 프로토콜(일반적으로 LWIP(Lightweight IP) 스택)을 통해 다른 네트워크 장치와 통신할 수 있습니다. STM32 이더넷은 STM32F4, F7, H7 제품군을 포함한 다양한 STM32 시리즈에서 지원되며, 통합 MAC(Media Access Controller)과 외부 PHY 트랜시버를 지원합니다.
이 주변 장치는 산업 자동화, IoT 게이트웨이, 네트워크 센서, 내장형 웹 서버 등 안정적이고 빠른 데이터 교환이 필요한 애플리케이션에 이상적입니다.
중요한 특징 중 일부는 다음과 같습니다.
- 통합 10/100 Mbps MAC : 내장된 이더넷 MAC은 풀 듀플렉스 및 하프 듀플렉스 모드에서 10 Mbps 및 100 Mbps 통신 속도를 모두 지원합니다.
- 효율적인 데이터 전송을 위한 DMA 지원 : 전용 DMA(직접 메모리 액세스) 채널을 포함하여 데이터 전송 작업의 부담을 덜고 CPU 부하를 줄이며 실시간 성능을 향상합니다.
- IEEE 1588 타임스탬프 지원(선택된 MCU) : 일부 STM32 MCU는 IEEE 1588 정밀 시간 프로토콜(PTP)에 대한 하드웨어 지원을 제공하여 네트워크 장치 간에 정확한 시간 동기화를 구현합니다.
- 유연한 PHY 인터페이스(MII/RMII) : MAC은 MII(Media Independent Interface)와 RMII(Reduced MII)를 모두 지원하여 다양한 외부 이더넷 PHY 트랜시버와 연결할 수 있습니다.
CubeMX 구성
이더넷을 활성화한 후에는 CubeMX에서 설정한 핀과 보드 회로도를 비교 확인해야 합니다. 대부분의 경우 핀이 잘못 구성되어 이더넷이 작동하지 않는 가장 흔한 오류 중 하나가 됩니다.
이더넷 구성
다양한 MCU에는 다양한 구성 유형이 있습니다. 일부 MCU는 CubeMX의 메모리를 구성할 수 있지만, 그렇지 않은 MCU도 있습니다. 일부 보드에는 MII 유형 하드웨어가 있고 , 다른 보드에는 RMII 유형 하드웨어가 있습니다.
아래 그림은 다양한 ST 보드에서 사용 가능한 다양한 구성을 보여줍니다.
- 첫 번째 보드( Nucleo F207ZG )와 두 번째 보드( Disco F7508 )는 RMII 핀아웃을 사용하는 반면, 세 번째 보드( Disco H745 )는 MII 핀아웃을 사용합니다.
- 첫 번째 보드에는 PHY 주소를 선택할 수 있는 옵션이 있습니다. 내장 LAN 포트를 사용하는 경우 0으로 , 외부 모듈을 사용하는 경우 1로 설정해야 합니다.
- 두 번째와 세 번째 보드에서는 메모리 주소를 설정할 수 있지만, 첫 번째 보드에서는 설정할 수 없습니다. 사용 중인 보드에서 메모리 설정을 지원하지 않는 경우, 이 단계를 건너뛰어도 됩니다.
- H745 디스커버리 보드에서는 Tx 및 Rx DMA 디스크립터 와 Rx 버퍼의 주소를 설정할 수 있습니다. 하지만 F7508 디스커버리 보드에서는 Rx 버퍼의 주소를 설정할 수 없습니다.
- 각 DMA 설명자가 32비트 (최대 가능)를 차지한다고 가정하면 RX 설명자와 Tx 설명자의 최대 크기는 각각 128바이트(32 ×4)입니다.
- 이들 사이의 메모리는 128바이트를 염두에 두고 간격을 두고 배치됩니다.
- Rx 버퍼 길이는 1524바이트로 설정되어 있지만, 사용할 RX 버퍼 개수는 나중에 LWIP 설정에서 정의할 수 있습니다. cubeMX는 기본적으로 버퍼 개수를 12개로 설정합니다. 따라서 Rx 버퍼의 총길이는 약 18KB가 됩니다.
- 메모리는 SRAM 영역에 할당되며, 이 영역의 속성은 나중에 MPU에서 수정할 수 있습니다.
LWIP 구성
LightWeight IP는 미들웨어 섹션에서 활성화할 수 있습니다. MCU에서 활성화할 수 없는 경우, 캐시(DCache 및 ICache)가 활성화되어 있는지 확인하세요.
LWIP의 구성 대부분은 동일하게 유지됩니다. 단, 일부 MCU에서는 힙 주소를 직접 선택할 수 있습니다.
LWIP 구성 STM32
- 여기서는 DHCP를 비활성화하고 이더넷 모듈에 고정 IP를 설정하겠습니다. 보드의 IP를 192.168.0.123으로 설정했습니다.
- 키 옵션 탭에서 힙 메모리로 5KB를 사용하고 있습니다. 이 힙의 위치는 0x30004000으로 정의되어 있습니다.
- 플랫폼 설정 탭에서 PHY를 LAN8742로 설정합니다.
MPU 구성
SRAM 영역에 DMA 디스크립터가 있습니다. 이것이 MPU를 구성해야 하는 이유입니다.
MCU에서 메모리 영역을 선택할 수 없다면 아마 그럴 필요가 없을 겁니다. 하지만 Cortex M7 디바이스의 경우, 이 설정은 필수입니다. 그렇지 않으면 하드폴트(hardfault)가 발생합니다.
구성 과정에서 모든 것을 SRAM( 0x30000000 )에 설정했다는 점을 기억하세요. 전체 메모리 구조는 아래 이미지에 나와 있습니다.
아래는 위 지역의 MPU 구성을 보여주는 이미지입니다.
- 여기서는 전체 RAM 영역인 약 24KB를 포함하도록 32KB 영역을 선택했습니다.
- 나머지 구성은 해당 지역을 캐시 할 수 없는 지역으로 설정하는 것입니다.
- 이렇게 하면 CPU와 DMA 사이의 캐시 일관성 문제가 방지됩니다.
- 이 내용은 Cortex M7 재생 목록에 설명되어 있으니 확인해 보세요.
기타 구성
STM32 보드를 라우터에 연결하는 경우 컴퓨터 측에서는 아무것도 할 필요가 없습니다. 하지만 이더넷 케이블을 컴퓨터에 직접 연결하는 경우, 아래 이미지처럼 컴퓨터의 이더넷 설정을 변경해야 합니다.
Windows 컴퓨터의 구성은 아래와 같습니다.
Mac에 대한 구성은 다음과 같습니다.
코드
프로젝트가 생성되면 LWIP -> Target -> ethernetif.c 파일을 엽니다. 여기에 플래시 스크립트 파일에 정의해야 할 메모리 위치가 있습니다.
이더넷 DMA 설명자
cubeMX에서 수행한 구성에 따라 플래시 스크립트 파일에서 이러한 메모리 위치를 정의해야 합니다.
플래시 스크립트 수정
아래는 CubeMX에서 구성한 H745 Discovery 보드 용 코드입니다.
.lwip_sec (NOLOAD) : {
. = ABSOLUTE(0x30000000);
*(.RxDecripSection)
. = ABSOLUTE(0x30000080);
*(.TxDecripSection)
. = ABSOLUTE(0x30000100);
*(.Rx_PoolSection)
} >RAM_D2
아래는 cubeMX에서 구성한 F7508 Discovery 보드에 대한 코드입니다.
.lwip_sec (NOLOAD) :
{
. = ABSOLUTE(0x2004C000);
*(.RxDecripSection)
. = ABSOLUTE(0x2004C0A0);
*(.TxDecripSection)
} >RAM
메인 파일
이 튜토리얼은 연결 부분에 더 중점을 두고 있으므로 코드에 많은 내용이 없습니다. IP 주소로 ping을 보내는 것만 테스트할 것이며, 해당 코드는 아래와 같습니다.
extern struct netif gnetif;
int main()
{
int wait = 10000000;
while (wait-- >0); // Wait for sometime before initializing the system
MPU_Config();
SCB_EnableICache();
SCB_EnableDCache();
HAL_Init();
HAL_Delay (1000); // wait for some time here
SystemClock_Config();
MX_GPIO_Init();
MX_LWIP_Init();
while (1)
{
ethernetif_input(&gnetif);
sys_check_timeouts();
}
}
결과
아래는 ping 테스트 결과입니다.
STM32 이더넷 핀 테스트
구성 중에 설정한 IP 주소에서 ping이 작동하는 것을 볼 수 있습니다.
프로젝트 파일
https://controllerstech.com/stm32-ethernet-1-connection/
'STM32' 카테고리의 다른 글
STM32 중급 과정 Peripheral Hands-On: DMA 5 (0) | 2025.08.13 |
---|---|
STM32 중급 과정 Peripheral Hands-On: RCC, PWR 4 (0) | 2025.08.13 |
STM32 중급 과정 RCC, PWR 개요 3 (0) | 2025.08.13 |
STM32 중급 과정 개발환경 2 (0) | 2025.08.13 |
X-NUCELO board (EEPRMA2) 보드 (2) | 2025.08.11 |
U8G2 그래픽 라이브러리를 STM32로 포팅하기 1부: 소개 (2) | 2025.08.08 |
STM32 중급 과정 Peripheral Hands-On: ADC 8-1 (0) | 2025.08.08 |
STM32 중급 과정 테크니컬 트레이닝 소개 1 (3) | 2025.08.07 |
더욱 좋은 정보를 제공하겠습니다.~ ^^