User Tools

Site Tools


products:w5500:tutorial:stm32f030r8_coocox:start

기본 환경 구축하기


CooCox에서 STM32F030 프로젝트 생성하기

1. 메뉴에서 Project→New Project를 선택한다.

2. “New roject” 윈도우의 Project Name 필드에 원하는 프로젝트 이름을 부여하고 “Next” 버튼을 클릭한다.

3. Model 선택 화면에서 “Chip”을 선택한 후, “Next” 버튼을 클릭한다.

4. ST → STM32F03x → STM32F030RBT6를 선택한 후, “Finish” 버튼을 클릭하면 해당 MCU 용 프로젝트가 생성된다.

5. Peripheral별 라이브러리를 선택한다. 본 프로젝트에서는 UART, Timer, SPI를 기본적인 Peripheral로 선택할 것이다. 정상적인 동작을 위해서 위 그림과 같이 USART, TIM, SPI, GPIO, MISC, RCC, CMSIS BOOT, M0 Cmsis Core 그리고 C Library를 선택하도록 한다.

6. 설정값 변경 M0는 기본적으로 SRAM의 용량이 작기 때문에 메모리를 적게 사용해야 한다. 메모리 사용에 최적화된 라이브러리를 사용하도록 설정을 변경한다.

  • 화면 왼쪽의 “Project” Plane에서 프로젝트 이름(w5500_stm32f030r8_example)을 선택한 후, 마우스 오른쪽 버튼을 클릭하면 단축메뉴가 표시된다.

  • 단축메뉴에서 “Configuration”을 선택한다.

  • “Configuration” 윈도우에서 “Link” Tab을 선택한 후,
  • “Option” 블록내의 “Library” 필드에서 “Use nano C Library”를 선택한다.

7. Platform Handler 추가하기 WIZnet은 CooCox용으로 만들어진 STM32F03x Cortex M0을 Platform Handler를 그대로 가져다 쓸 수 있도록 wizwiki.net/wiki 에 제공하고 있다. Platform Handler는 USART, SPI, Timer, GPIO, RCC 에 대한 설정을 잡는 MCU dependent 한 초기화 코드로 기본적인 설정에 맞추어서 준비되어져 있어 별도의 수정없이 그대로 사용하면 된다. 단, 사용자가 포트를 변경하고자 하는 경우에는 해당 코드를 사용자의 실제 코드에 맞추어서 수정해야 한다.

  • wizwiki.net/wiki에 있는 Platform Handler를 해당 프로젝트로 다운로드한다

CooCox에서는 프로젝트의 환경내에 실제 디스크에 저장된 파일 시스템을 로딩하는 작업을 해주어야 정상적인 동작이 된다.

  • “Project” Plane의 프로젝트 이름을 클릭한 후, 마우스 오른쪽 버튼을 클릭해서 단축 메뉴를 표시한다.
  • 단축메뉴에서 “Add Group”을 선택한다.

  • “Add Group” 대화상자가 표시되면, GroupName을 “PlatformHandler”라고 입력한 후, “OK”를 클릭한다.

“Project” Plane의 디렉토리 구조에 “PlatformHandler”가 표시되는 것을 확인할 수 있다. PlatformHandler 그룹에는 아직 어떤 파일도 포함되어져 있지 않기 때문에 파일을 로딩하는 작업을 해야한다.

  • 디렉토리 구조에서 “PlatformHandler”를 선택한 후, 마우스 오른쪽 버튼을 클릭해서 단축 메뉴를 표시한다.
  • 단축 메뉴에서 “Add Files”를 선택한다.

  • wizwiki.net/wiki에서 다운로드 한 PlatformHandler를 저장한 디렉토리로 이동해서 모든 .c 파일과 .h 파일을 선택한 후, “Open” 버튼을 클릭한다.

여기까지 WIZnet의 W5500을 사용하기 위한 CooCox 프로젝트 생성은 완료되었다.


CooCox에서 Debug용 UART 포트 활성화하기

1. Syscall 파일 수정

사용자 코드에서 디버그 메시지를 출력하기 위한 printf() 문을 사용하기 위해서는 기본적으로 제공되는 syscall.c 내의 _write() 문을 수정해야한다. 아래 그림과 같이 _write()문을 수정한다.


Peripheral 초기화 및 기본 실행 코드 추가하기

1. Peripheral 관련 헤더 파일 추가하기

main.c에 아래 그림과 같이 관련 헤더파일을 추가한다.

2. Peripheral 초기 코드 및 기본 실행 코드 추가하기

  • 디버그 메시지를 출력하기 위해서 main() 함수내에서 다음과 같이 코드를 추가한다.
main.c
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();

위와 같이 코드를 추가하고 나면, USART1 포트로 데이터 출력이 가능해진다.

  • 부팅시 “W5500 example on STM32F030R8”이라는 메시지를 출력하도록 printf()문을 추가한다.

3. 컴파일 및 실행하기

  • 바이너리 파일을 생성하기 위해서는 Project→Build를 선택하거나 단축키(F7)을 누르거나 아래 붉은 색 원으로 쌓여 있는 아이콘 클릭한다.
  • 컴파일이 성공하면 아래 “Console”창과 같은 결과가 표시된다.

  • 컴파일이 완료되면 CoFlash.exe를 실행해서 바이너리 파일을 MCU로 다운로드한다.
  • “Command” Tab을 선택한 후, “Program” 블록에서 다운로드할 바이너리 파일을 선택한 후,
  • “Program” 버튼을 클릭한다.

개발보드의 USART 포트를 PC와 연결한 후, 개발보드를 reset하면 아래와 같이 printf()문에서 지정한 문자열이 표시되는 것을 확인할 수 있다.


프로젝트에 W5500용 ioLibrary 연결하기

1. ioLibrary_BSD 다운로드

  • 본 프로젝트에서 W5500을 사용하기 위해서는 WIZnet에서 제공하는 ioLibrary_BSD 라이브러리를 다운로드한다. ioLibrary_BSD Driver에서 최신 라이브러리를 다운로드한다.

2. 프로젝트 디렉토리에 copy ioLibrary_BSD 라이브러리는 “Ethernet” 디렉토리와 “Internet” 디렉토리로 구성되어 있는데, “Ethernet” 디렉토리는 W5500 드라이브를 포함하고 있고 “Internet” 디렉토리는 응용 프로토콜을 포함하고 있다.

  • 다운로드한 “Ethernet” 디렉토리와 “Internet” 디렉토리 전체를 앞에서 생성한 프로젝트 디렉토리의 루트 영역으로 복사한다.

3. 프로젝트에 ioLibrary_BSD 연결하기 프로젝트 디렉토리에 복사한 “Ethernet” 디렉토리와 “Internet” 디렉토리 내의 파일들을 프로젝트에서 실제로 연결하는 작업이 필요하다.

  • “Project” Plane에서 프로젝트 명을 선택한 후, 마우스 오른쪽 버튼을 클릭해서 단축메뉴를 표시한다.
  • 단축메뉴에서 “Add Group”을 선택한다.

  • “Add Group” 대화상자가 표시되면 GroupName으로 “Ethernet”을 입력하고 “OK” 버튼을 클릭한다.
  • 새롭게 생성된 “Ethernet” 그룹을 선택한 후, “Add File” 메뉴를 선택한다.
  • “Add Files” 대화상자가 표시되면 “Ethernet” 디렉토리 내의 파일들을 선택한다.

4. main() 함수에 코드 추가하기

  • W5500을 사용하기 위해 필요한 헤더 파일을 포함한다.
main.c
#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_misc.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_spi.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_usart.h"
#include "common.h"
#include <stdint.h>
#include <stdio.h>
 
#include "Ethernet/socket.h"
 
/////////////////////////////////////////
// SOCKET NUMBER DEFINION for Examples //
/////////////////////////////////////////
#define SOCK_TCPS        	0
#define SOCK_UDPS        	1
#define SOCK_DNS		6
#define SOCK_HTTP		7
  • 전역 변수 관련 코드를 추가한다.
main.c
////////////////////////////////////////////////
// Shared Buffer Definition for LOOPBACK TEST //
////////////////////////////////////////////////
 
uint8_t gDATABUF[DATA_BUF_SIZE];
 
///////////////////////////////////
// Default Network Configuration //
///////////////////////////////////
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},
                            .ip = {192, 168, 1, 123},
                            .sn = {255,255,255,0},
                            .gw = {192, 168, 1, 1},
                            .dns = {8,8,8,8},
                            .dhcp = NETINFO_STATIC };
  • W5500 통신 관련 함수를 추가한다.
main.c
//////////////////////////////////////////////////////////////////////////////////////////////
// Call back function for W5500 SPI - Theses used as parameter of reg_wizchip_xxx_cbfunc()  //
// Should be implemented by WIZCHIP users because host is dependent                         //
//////////////////////////////////////////////////////////////////////////////////////////////
void  wizchip_select(void);
void  wizchip_deselect(void);
void  wizchip_write(uint8_t wb);
uint8_t wizchip_read();
 
 
void  wizchip_select(void){
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
 
void  wizchip_deselect(void){
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
 
void  wizchip_write(uint8_t wb){
	SPI_SendByte(wb);
}
 
uint8_t wizchip_read(){
	return SPI_ReceiveByte();
}
  • W5500 초기화 관련 코드를 추가한다.
/////////////////////////////////////////////////////////////
// Initialize the network information to be used in WIZCHIP //
/////////////////////////////////////////////////////////////
void network_init(void)
{
   uint8_t tmpstr[6];


	ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);


	ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);

	// Display Network Information
	ctlwizchip(CW_GET_ID,(void*)tmpstr);
	printf("\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);
	printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],
		  gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);
	printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
	printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
	printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
	printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
	printf("======================\r\n");
}
/////////////////////////////////////////////////////////////
  • main() 함수에서 W5500 초기화 관련 함수를 호출하는 코드를 추가한다.
main.c
int main(void)
{
	uint8_t tmp = 0;
 
	uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
 
	RCC_Configuration();
	GPIO_Configuration();
	USART_Configuration();
	SPI_Configuration();
	Timer_Configuration();
 
	reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
 
	/* SPI read & write callback function */
	reg_wizchip_spi_cbfunc(wizchip_read, wizchip_write);
 
 
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1)
			break;
	}
 
    /* WIZCHIP SOCKET Buffer initialize */
    if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1)
    {
       printf("WIZCHIP Initialized fail.\r\n");
       while(1);
    }
 
    /* PHY link status check */
    do
    {
       if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1)
          printf("Unknown PHY Link stauts.\r\n");
    }while(tmp == PHY_LINK_OFF);
 
    printf("W5500 example on STM32F030R8\r\n");
 
	/* Network Initialization */
	network_init();
 
	while(1)
    {
    }
}

튜토리얼 시작

응용1. Loopback 테스트

products/w5500/tutorial/stm32f030r8_coocox/start.txt · Last modified: 2015/03/16 10:33 (external edit)