[ST_MICRO]/STM32F72018. 5. 9. 04:24

[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 전송 속도 테스트 결과

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



Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322018. 4. 27. 17:37

STM32 Arduino 개발환경 설정하기



보드 매니저 URL추가

아두이노 환경설정에서 보드파일 주소를 등록 해 준다.

https://raw.githubusercontent.com/stm32duino/BoardManagerFiles/master/STM32/package_stm_index.json



보드 매니저에서 STM32-Core 패키지를 인스톨 한다.


알맞은 보드 파일을 설정하면 STM32를 아두이노 개발환경해서 사용할 수 있다.



Posted by nexp

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 24. 04:52

Zynq UltraScale+ MPSoC 보드 테스트 - EtherCAT 테스트


Zynq UltraScale+ MPSoC 보드  EtherCAT 테스트 


Zynq UltraScale+ MPSoC 보드를 이용하여 EtherCAT 통신 테스트를 해보았다.

기존에 제작 하였던 EtherCAT Slave 보드를 이용하여 간단히 데이터 전송하는 예제로 테스트 했고 간단히 확인을 위해 패킷캡쳐 프로그램으로 전송되는 데이터를 확인했다. 


Wireshark 에서 Zynq UltraScale+ MPSoC의 EtherCAT 전송 데이터를 확인 할 수 있다.


Zynq MPSoC 에서 EtherCAT의 사용은 기본적인 테스트 결과 가능해 보인다. 물론 가장 기본 적인 테스트만 검토한 결과라 HOST쪽에서 좀더 많은 테스트가 필요할 것같다. 결론적으로 로봇쪽에서 Zynq MPSoC를 EtherCAT 제어용으로 사용한다면 검토 해볼만 할것 같다.


Zynq UltraScale+ MPSoC EtherCAT 테스트 기본 예제코드

int main(void)

{

struct netif *netif;

unsigned char test_buf[] = {1, 2};

unsigned int cnt = 0;

/* the mac address of the board. this should be unique per board */

unsigned char mac_ethernet_address[] = {

0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };


netif = &server_netif;

#if defined (__arm__) && !defined (ARMR5)

#if XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1 || \

XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1

ProgramSi5324();

ProgramSfpPhy();

#endif

#endif


/* Define this board specific macro in order perform PHY reset

 * on ZCU102

 */

#ifdef XPS_BOARD_ZCU102

IicPhyReset();

#endif


init_platform();


xil_printf("\r\n\r\n");

xil_printf("-----lwIP RAW Mode UDP Server Application-----\r\n");


/* initialize lwIP */

lwip_init();


/* Add network interface to the netif_list, and set it as default */

if (!xemac_add(netif, NULL, NULL, NULL, mac_ethernet_address,

PLATFORM_EMAC_BASEADDR)) {

xil_printf("Error adding N/W interface\r\n");

return -1;

}

netif_set_default(netif);


/* now enable interrupts */

platform_enable_interrupts();


/* specify that the network if is up */

netif_set_up(netif);


#if (LWIP_DHCP==1)

/* Create a new DHCP client for this interface.

 * Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at

 * the predefined regular intervals after starting the client.

 */

dhcp_start(netif);

dhcp_timoutcntr = 24;

while (((netif->ip_addr.addr) == 0) && (dhcp_timoutcntr > 0))

xemacif_input(netif);


if (dhcp_timoutcntr <= 0) {

if ((netif->ip_addr.addr) == 0) {

xil_printf("ERROR: DHCP request timed out\r\n");

assign_default_ip(&(netif->ip_addr),

&(netif->netmask), &(netif->gw));

}

}


/* print IP address, netmask and gateway */

#else

assign_default_ip(&(netif->ip_addr), &(netif->netmask), &(netif->gw));

#endif

print_ip_settings(&(netif->ip_addr), &(netif->netmask), &(netif->gw));


xil_printf("\r\n");


/* print app header */

print_app_header();


/* start the application*/

start_application();

xil_printf("\r\n");


g_netif = netif;


//low_level_input(g_netif);


while (1) {

//xemacif_input(netif);

ether_macraw_input(netif);

}


/* never reached */

cleanup_platform();


return 0;

}


Posted by nexp

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 23. 03:54

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - Giga Etherent UDP 테스트

Zynq UltraScale+ MPSoC 보드 테스트 - Giga Etherent UDP 테스트

 

TCP예제가 문제 없이 동작하므로 Giga Ethernet 통신은 확인이 되었고 EtherCAT 동작을 테스트 하기 위해 UDP통신도 문제 없이 동작하는지 확인해 볼 필요가 있다.

 

Zynq UltraScale+ MPSoC UDP 전송코드

static void udp_recv_perf_traffic(void *arg, struct udp_pcb *tpcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
int i;
unsigned char tcp_buf_rx[2048];

pcb->remote_ip = *addr;
pcb->remote_port = port;

    //수신 IP 시리얼로 출력
xil_printf("%d.%d.%d.%d\r\n",
                    (addr->addr)&0xFF, (addr->addr>>8)&0xFF,
                    (addr->addr>>16)&0xFF, (addr->addr>>24)&0xFF
          );


    //수신데이터 시리얼로 출력
    xil_printf("rx size = %d\r\n", p->len);

    for(i=0;ilen;i++)
    {
        //데이터 수신되면..
        //임시로 테스트 용으로 저장 -> 실제 제이터는 p->payload 에 있음
        tcp_buf_rx[i] = *((unsigned char*)p->payload+i);

        xil_printf("%x ", tcp_buf_rx[i]);
    }


udp_sendto(tpcb, p, addr, port);

xil_printf("UDP test passed Successfully\n\r");


pbuf_free(p);

}

Posted by nexp
TAG MPSoC, udp, ZYNQ

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 23. 03:54

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - Giga Etherent 전송 속도 테스트

Zynq UltraScale+ MPSoC 보드 테스트 - Giga Etherent TCP 전송 속도 테스트

 

 

Zynq UltraScale+ MPSoC 보드는 ZU2EG 가 적용되어 있고 Quad-core Cortex-A53 @1.5GHz CPU로 AP를 구동한다. Giga Ethernet을 이용한 EtherCAT 사용 검토가 필요해 Giga Ethernet 통신을 테스트 해보았다.

 

우선 TCP/IP 통신 테스트를 해보자.

기본 예제로 제공되는 lwIP 스택 TCP예제로 루프백 테스트를 해보면 좋을것 같다.

 

 

기본 제공 예제를 좀 수정해서 TCP루프백 테스트 해보니 96Mbps 정도가 나온다.

예전 EtherCAT 테스트용으로 제작했던 STM32F429 보드와 TCP속도 비교를 해보면 좋을것 같다.

(너무 예전이고 코어 자체가 비교가 안되지만..)

 

 

 


Zynq UltraScale+ MPSoC TCP/IP TCP 수정코드

 

 

err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
/* do not read the packet if we are not in ESTABLISHED state */
if (!p) {
tcp_close(tpcb);
tcp_recv(tpcb, NULL);
return ERR_OK;
}

/* indicate that the packet has been received */
tcp_recved(tpcb, p->len);

/* echo back the payload */
/* in this case, we assume that the payload is < TCP_SND_BUF */
if (tcp_sndbuf(tpcb) > p->len) {
err = tcp_write(tpcb, p->payload, p->len, 1);
} else
xil_printf("no space in tcp_sndbuf\n\r");

/* free the received pbuf */
pbuf_free(p);

return ERR_OK;
}

 

 

dhcp_start(echo_netif);
dhcp_timoutcntr = 24;

while(((echo_netif->ip_addr.addr) == 0) && (dhcp_timoutcntr > 0))
xemacif_input(echo_netif);

if (dhcp_timoutcntr <= 0) {
if ((echo_netif->ip_addr.addr) == 0) {
xil_printf("DHCP Timeout\r\n");
xil_printf("Configuring default IP of 192.168.1.10\r\n");
IP4_ADDR(&(echo_netif->ip_addr),  192, 168,   1, 10);
IP4_ADDR(&(echo_netif->netmask), 255, 255, 255,  0);
IP4_ADDR(&(echo_netif->gw),      192, 168,   1,  1);
}
} print_ip_settings(&ipaddr, &netmask, &gw);

#endif
/* start the application (web server, rxtest, txtest, etc..) */
start_application();

/* receive and process packets */
while (1) {
if (TcpFastTmrFlag) {
tcp_fasttmr();
TcpFastTmrFlag = 0;
}
if (TcpSlowTmrFlag) {
tcp_slowtmr();
TcpSlowTmrFlag = 0;
}
xemacif_input(echo_netif);
transfer_data();
}

 

 

Posted by nexp

댓글을 달아 주세요