본문 바로가기

[ST_MICRO]/STM32F7

[STM32F7 EVM] STM32F767 Ethernet 테스트 - TCP 전송속도 측정

[STM32F7 EVM] STM32F767 Ethernet 테스트 - TCP 전송속도 측정

 

STM32F7 EVM 보드에는 Ehternet을 테스트 할수 있는 Ethernet Phy 모듈 연결 커넥터가 있어 Ethernet을 연결 할 수 있다.  STM32F7의 경우 클럭속도가 216Mhz로 향상 되었기 때문에 좀더 빠른 이더넷 전송 속도가 나오지 않을까 기대 하면서 TCP 전송 속도 테스트를 해 보았다. STM32F4 Ethernet TCP 전송 속도 테스트 결과 참고

 

 

 

STM32F7 EVM Ethernet 하드웨어 연결 설정

STM32F7의 Ethernet 테스트는 기존에 제작 해 두었던 Ethernet Phy모듈을 이용하였다.

 

 

 

CubeMX 환경설정

CubeMX 를 이용하여 STM32F7 프로젝트를 생성하고 Connectivity -> ETH 탭에서  RMII 모드로 설정하면 기본 핀맵이 할당된다.

 

 

 

 

STM32F7 Ethernet 핀맵 확인

 

 

 

LWIP 설정

ST에서 제공하는 TCP/IP 스텍인 LWIP 를 Enable로 체크 하면 기본 설정으로 TCP/IP 통신을 할 수 있는 코드가 생성된다.

 

 

 

 

 

STM32F7 TCP/IP 전송 속도 테스트 코드

print_ip(char *msg, ip_addr_t *ip)

{

 printf(msg);

 printf("%d.%d.%d.%d\n\r", ip4_addr1(ip), ip4_addr2(ip), ip4_addr3(ip), ip4_addr4(ip));

}



print_ip_settings(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw)

{



 print_ip("Board IP: ", ip);

 print_ip("Netmask : ", mask);

 print_ip("Gateway : ", gw);

}



int main(void)

{

  /* USER CODE BEGIN 1 */



  /* USER CODE END 1 */



  /* Enable D-Cache-------------------------------------------------------------*/

  SCB_EnableDCache();

  //SCB_EnableICache();

  /* MCU Configuration----------------------------------------------------------*/



  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();



  /* USER CODE BEGIN Init */



  /* USER CODE END Init */



  /* Configure the system clock */

  SystemClock_Config();



  /* USER CODE BEGIN SysInit */



  /* USER CODE END SysInit */



  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();



  /* USER CODE BEGIN 2 */

  sprintf(buf, "STM32 ETHERNET TEST: Clk=%d\r\n", HAL_RCC_GetHCLKFreq()/1000);

  HAL_UART_Transmit(&huart1, buf, strlen(buf), 10);

  /* USER CODE END 2 */

  MX_LWIP_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  while((gnetif.ip_addr.addr) == 0)

  {

   MX_LWIP_Process();

  }



  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);





  /* USER CODE BEGIN 2 */

  print_ip_settings(&gnetif.ip_addr.addr, &gnetif.netmask.addr, &gnetif.gw.addr);

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */



  tcp_echoserver_init();



  while (1)

  {

     ethernetif_input(&gnetif);

     sys_check_timeouts();

  }

}

 

 

 

 

STM32F7 Ethernet 전송 속도 테스트 결과

 

옵티마이즈 옵션을 -O로 설정하고 테스트 해 보면 13Mbps로 측정이 된다.

 

 

[1] iInChip Send: 13.4681 Mbps(12470418 bytes, 7.0642 sec)

iInChip Recv: 13.3232 Mbps(12470418 bytes, 7.1411 sec)

------------------------------------------------------------



옵션을 -Ofast 로 설정하면 성능 개선이 많이 된다. 20Mbps로 측정이 된다.

 

------------------------------------------------------------

[14] iInChip Send: 20.2767 Mbps(12470418 bytes, 4.6922 sec)

iInChip Recv: 20.0365 Mbps(12470418 bytes, 4.7484 sec)




좀더 속도를 높일 방법이 없을까?

I 캐시를 사용해 보자.

 

SCB_EnableICache();

 

21Mbps로 좀더 빨라 졌다.






호스트 PC의 속도도 영상을 줄 수 있을것 같은데...

 

i7-9700 @3Ghz 에서 테스트 해보았다.

 

STM32f7 EVM 보드에 LWIP 스택을 이용해 TCP loopback 전송률 테스트 해 보면 33 Mbps 로 측정이 된다.

 

Hardware 스텍을 가진 W5300 테스트 결과와 같은 전송 속도 이다. 소프트웨어 스택으로도 저렴한 가격에 Ethernet 통신을 구현 할수 있어 좋은것 같다. STM32F439 + W5300 이더넷 전송 속도 테스트결과와 비교