[ST_MICRO]/STM32H7

[STM32H757-RP] LWIP TCP Ethernet 테스트 - iperf 성능 측정

nexp 2025. 1. 29. 23:57

 

STM32H757 듀얼코어 MCU를 사용하려고 했던 가장큰 목적은 이더넷 때문이다. Cortex-M4코어로 고속의 이더넷 통신을 하면서 Cortex-M7 코어로 연산이 필요한 작업을 진행하기에 최적의 MCU이기 때문이다.

 

STM32H757에서 이더넷 테스트를 진행해 보자.

 

[STM32H757-RP] 보드의 이더넷 파이 RMII 연결 핀맵

STM32H747과 핀수는 같지만 핀맵이 달라서 기존 STM32H7 시리즈와 달리 핀맵을 조금 수정했다.

 

 

우선 M4 코어에 이더넷을 연결하여 테스트 해보자.

 

 

LWIP 스택도 M4코어로 할당해서  설정할 수 있다.

 

 

LWIP로 TCP 전송률 테스트를 위해 간단히 iperf 서버를 구현해서 테스트 가능하다.

#include "lwip/tcp.h"

#define IPERF_TCP_PORT 5001

static err_t iperf_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    if (p == NULL)
    {
        tcp_close(tpcb);
        return ERR_OK;
    }

    tcp_recved(tpcb, p->tot_len);
    pbuf_free(p);
    return ERR_OK;
}

static err_t iperf_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{
    tcp_recv(newpcb, iperf_recv);
    return ERR_OK;
}

void iperf_tcp_server_init(void)
{
    struct tcp_pcb *pcb = tcp_new();
    if (pcb != NULL)
    {
        err_t err = tcp_bind(pcb, IP_ADDR_ANY, IPERF_TCP_PORT);
        if (err == ERR_OK)
        {
            pcb = tcp_listen(pcb);
            tcp_accept(pcb, iperf_accept);
        }
    }
}

 

 

iperf 서버 초기화 및 iperf 구동 테스트 코드 

int main(void)
{
 /* USER CODE BEGIN 1 */
 /* USER CODE END 1 */
/* USER CODE BEGIN Boot_Mode_Sequence_1 */
 /*HW semaphore Clock enable*/
 __HAL_RCC_HSEM_CLK_ENABLE();
 /* Activate HSEM notification for Cortex-M4*/
 HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
 /*
 Domain D2 goes to STOP mode (Cortex-M4 in deep-sleep) waiting for Cortex-M7 to
 perform system initialization (system clock config, external memory configuration.. )
 */
 HAL_PWREx_ClearPendingEvent();
 HAL_PWREx_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFE, PWR_D2_DOMAIN);
 /* Clear HSEM flag */
 __HAL_HSEM_CLEAR_FLAG(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
/* USER CODE END Boot_Mode_Sequence_1 */
 /* MCU Configuration--------------------------------------------------------*/
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 /* USER CODE BEGIN Init */
	HAL_Delay(1000);
 /* USER CODE END Init */
 /* USER CODE BEGIN SysInit */
 /* USER CODE END SysInit */
 /* Initialize all configured peripherals */
 MX_GPIO_Init();

 MX_LWIP_Init();
 /* USER CODE BEGIN 2 */
 while((gnetif.ip_addr.addr) == 0)
 {
	  MX_LWIP_Process();
 }
 print_ip_settings(&gnetif.ip_addr.addr, &gnetif.netmask.addr, &gnetif.gw.addr);
 
 iperf_tcp_server_init();
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
	  MX_LWIP_Process();
 }
 /* USER CODE END 3 */
}

 

 

 

이렇게 설정 후 기본 코드로 Ping 테스트를 위해 DHCP할당 되는것 확인된다.

PC에서 iperf 클라이언트로 접속하여 TCP 전송률 테스트를 해 보면 50Mbps 정도로 측정이 된다.. 

 

 

코드 옵티마이즈 옵션을 속도 우선으로 하면



STM32H757에서 M4코어에서 iperf로 TCP전송률은 60Mbps 정도로 측정이 된다.

 

M4 코어에서는 잘 동작하는것이 확인된다.

 


이제 M7 코어로 테스트 해 보자

 



STM32H757에서 M7코어에서 iperf로 TCP전송률도 60Mbps 정도로 측정이 된다.

 

 

 

반응형