[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

댓글을 달아 주세요

[FPGA]/Zynq(MPSOC)2018. 4. 21. 05:53

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - SDK테스트 Hello World

Zynq UltraScale+ MPSoC 보드 초기화 테스트 - SDK테스트 Hello World

 

1) Launch SDK

Zynq UltraScale+ MPSoC 기본 하드웨어 디자인 으로 생성한 프로젝트 파일에서 Launch SDK 로 프로젝트 파일을 생성할 수 있다.

 

 

 

2)Project 생성

Vivado에서 여러가지 다양한 예제를 제공하고 있는데 기본 예제 Hello World 프로젝트를 생성해 보자

 

 

3)코드 작성및 프로그램 실행

기본 코드 생성되고 간단히 테스트를 위해 Delay 함수도 추가 해서 실행 해 보았다.

 

 

Zynq UltraScale+ MPSoC 보드의 UART에 연결해서 시리얼 포트로 출력되는 메시지를 확인하니 정상적으로 출력되는것으로 확인된다.

 

Posted by nexp

댓글을 달아 주세요