본문 바로가기

[ST_MICRO]/STM32F7

STM32-176 EV - iperf를 이용한 STM32F777 LwIP TCP 전송률 테스트(Iperf Throughput)

최신 버전의 STM32CubeIDE를 이용하여 [STM32-176 EV] 보드(STM32F7관 핀투핀 호환)의 내장 이더넷 전송률 테스틀 해보았다. 

 

 

우선 STM32CubeIDE를 최신으로 업데이트 하고 프로젝트를 생성한다.

ETH를 RMII 모드로 설정하고 나머지 필요한 페리를 추가 해 준다.

 

 

인터럽트 설정

 

 

LwIP 소프트웨어 스택 설정

 

 

이더넷 PHY 설정

LAN8742, DP83848 두가지 PHY가 지원된다. 기존에 없었는데 추가된것 같다.

 

 

마지막으로 클럭 설정을 218Mhz로 해 주면 된다.

 

 

 

코드 생성후 디버깅을 위해 UART에서 printf가 동작 할수 있도록 코드 추가 하고 IP정보를 출력할수 있는 함수를 만들면 된다.

#define hUART           huart1
extern struct netif gnetif;
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int _write( int32_t file , uint8_t *ptr , int32_t len )
{
	/* Implement your write code here, this is used by puts and printf for example */
	for ( int16_t i = 0 ; i < len ; ++i )
	{
		HAL_UART_Transmit( &hUART, ptr++, 1, 100);
	}
	return len;
}

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);
}

 

 

자동 생성 코드에서 DHCP로 IP를 할당 받아 오는지 확인해 보면.. 정상적으로 IP가 출력되는 것을 확인 할 수 있다.

int main(void)
{
  /* USER CODE BEGIN 1 */
	unsigned char test_buf[1024];
	int cnt = 0;
	struct netif *netif;

	netif = &server_netif;
  /* USER CODE END 1 */

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

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* 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();
  MX_LWIP_Init();

  /* USER CODE BEGIN 2 */
  printf("SysClk (System Clock) = %lu Hz..\r\n", HAL_RCC_GetSysClockFreq());
  Led1Off();


  while((gnetif.ip_addr.addr) == 0)
  {
	  MX_LWIP_Process();
  }

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

  iperf_init();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	MX_LWIP_Process();
   }
}

 

 

iperf 프로그램으로 STM32F7에서 내장 이더넷으로 TCP 전송률을 측정해 보면 50Mbps 정도로 측정이 된다.

기존에 STM32CodeMx를 이용한 라이브러리에서 테스트한 결과와 비교하면 속도가 좀 느린것 같다.

 

 

I캐시, D캐시를 사용해 좀더 속도를 올려 보자.

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();

 

 

58Mbps로 좀더 속도가 빨라지는것 같다.

반응형