[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 정도로 측정이 된다.
반응형