본문 바로가기

Cortex-M/GigaDevice

[GD32-48 SSM] GD32F303 - Iperf로 W5500의 TCP Throughput 측정 테스트

STM32F103 시리즈 대체용으로 추천 받은 GD32F303은 최대 클럭 120Mhz로 구동되고 SPI클럭을 30Mhz로 구동할 수 있다. STM32F103 과 비교해서 W5500의 TCP Throughtput  테스트 성능 비교를 해보면 좋을 것 같다.

 

네트웍 전송율 테스트를 위해 PC에서는 iperf 프로그램을 사용하고 STM32에서는 W5500 TCP loopback 테스트 코를 조금 수정해 iperf 클라이언트 코드로 작성했다.

int32_t iperf_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
   int32_t ret;
   uint16_t size = 0, sentsize=0;
   switch(getSn_SR(sn))
   {
      case SOCK_ESTABLISHED :
         if(getSn_IR(sn) & Sn_IR_CON)
         {
            setSn_IR(sn,Sn_IR_CON);
         }
         if((size = getSn_RX_RSR(sn)) > 0)
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;

#if _USE_DELAY
            _delay(_TX_DELAY_TIME);
#endif
            ret = recv(sn,buf,size);
            if(ret <= 0) return ret;


            #if _USE_LOOP_BACK
            sentsize = 0;
            while(size != sentsize)
            {
               ret = send(sn,buf+sentsize,size-sentsize);
               if(ret < 0)
               {
                  close(sn);
                  return ret;
               }
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
			#endif
         }
         break;
      case SOCK_CLOSE_WAIT :
         if((ret=disconnect(sn)) != SOCK_OK) return ret;
         break;
      case SOCK_INIT :
         if( (ret = listen(sn)) != SOCK_OK) return ret;
         break;
      case SOCK_CLOSED:
         if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
        	 cnt = 0;


            return ret;
         break;
      default:
         break;
   }
   return 1;
}

 

STM32F103과 같이 기본 72Mhz로 구동하고 SPI클럭을 18Mhz로 설정시 iperf 테스트 결과 4Mbps 정도로 측정이 된다.

 

GD32의 장점인 120Mhz에서 30Mhz SPI클럭으로 테스트 하면 8Mbps 정도로 측정이 된다.

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL15;//RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

 

 

 

120Mhz 구동시 SPI클럭을 60Mhz까지 설정은 가능하다.

스펙상으로는 30Mhz로 되어 있긴하지만 테스트 해보자. SMT32F103에서는 동작 차제가 되지 않았는데 GD32는 잘 동작 한다.

 

GD32F303 SPI DMA 테스트에서 사용 했던 코드를 이용해서 DMA 설정후 테스트 해보면 25Mbps로 측정이 된다.

 

5500의 FIFO 메모리를 최대로 설정하고 SPI DMA를 사용하여 GD32F303에서 W5500 iperf TCP 전송율 테스트 결과 28Mbps로 측정이 된다. 

 

 

 

TCP loopback 테스트로 송수신 통신을 구현하면 19Mbps 로 측정이 된다. STM32G431 에서 60Mhz SPI클럭에서 테스트 해보면 에러가 많이 발생해서 속도가 느려 지는데 GD32는 문제 없이 잘 구동된다.

W5500을 사용하는 MCU중에서 가격대비 가장 높은 성능을 낼 수 있는 솔루션이 아닐까 생각이 든다.

반응형