본문 바로가기

[ST_MICRO]/STM32G0

STM32G0 SSM - STM32CubeIDE에서 Iperf로 W5500의 TCP Throughput 측정 테스트

STM32G0에서 SPI 클럭의 최대 속도는 32Mhz로 STM32F1의 SPI 클럭속도(18Mhz)보다 빨라 졌다. W5500 SPI 전송율 테스트를 해 보면 STM32G0의 SPI성능을 테스트 해 볼수 있을것 같다.

 

우선 STM32CubeIDE에서 SPI 설정을 하자.

 

네트웍 전송율 테스트를 위해 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;
}

 

32Mhz SPI클럭에서 STM32G0의 W5500 iperf 전송율 테스트 결과 3.2Mbps정도로 측정이 된다.


좀더 속도를 높이기 위해 STM32G0 STM32CubeIDE SPI DMA 테스트 에서처럼 DMA를 적용해 보자.

16Mbps 정도로 측정이 된다.

 


TCP loopback 테스트로 송수신 통신을 구현하면 8Mbps 로 측정이 된다. 이는 단방향에서 16Mbps로 50%정도 줄어 드는데 MCU 성능이 떨어져서 그런것 같다. 하지만 1$ 이하 MCU에서 이더넷 전송율이 이정도면 상당히 의미가 있는것 같다. 

 

반응형