[STM32] Ethernet 통신

이상윤·2022년 10월 17일
0

STM32

목록 보기
4/8

참고영상
이 실습은 위의 링크를 보고 실습을 진행한 내용을 정리해보았다.

환경

MCU 모델 : STM32F429ZIT6U
보드 : NUCLEO-F429ZI

1. Target Select

최초에 프로젝트를 생성하게 되면 MCU Selector 화면이 나온다.
이때, MCU selector로 진행할 경우 STM32F429ZIT6U 모델을 선택하거나

Board Selector로 진행할 경우 NUCLEO-F429ZI 보드를 선택하고 Next 버튼을 누르면 프로젝트가 생성된다.

2. Pinout & Configuaration

Connectivity -> ETH 에서
Mode는 Disable -> RMII
Advanced Parameters의 PHY를 LAN8742로 선택해준다.

LAN8742로 선택해주는 이유는 UM1974 문서에 의하면 해당 Nucleo보드는
external PHY로 LAN8742A-CZ-TR 모델을 사용한다고 한다.

  • 이때, 주의해야 할 사항이 하나 있다.
    Board Selector로 NUCLEO-F429ZI를 선택해서 진행한 경우는 괜찮지만
    MCU Selecotor로 STM32F429ZIT6U를 선택해서 진행한 경우는
    ETH의 Pin을 선택할 때

위와 같이 선택되었는데 UM1974문서에 의하면 아래와 같다.

ETH_TXD0는 PG13핀에
ETH_TX_EN은 PG11에 매칭이 되어야 한다.

다음은 Middleware -> LWIP에서
Enabled를 체크해주고 General Settings에서 DHCP를 Disabled로 선택하고
IP_ADDRESS, NETMASK, GATEWAY를 입력해준다.

이때, Gateway 주소와 Netmask는 현재 연결된 네트위크의 정보와 동일하게 적어준다.
(커맨드 창에서 ipconfig 명령어를 통해 조회 가능)
IP 주소는 할당되지 않은 새 주소를 입력한다.

Platform Settings까지 설정해준 뒤 Code Generation을 통해 코드를 생성해준다.

3. 코드 추가하기

프로젝트에서 LWIP -> APP -> lwip.c 의 struct netif gnetif를 복사하고

LWIP -> APP -> lwip.h에 USER code 입력부분에
extern struct netif gnetif;extern 키워드를 붙여 입력한다.

다운로드 링크
위 링크로 들어가 압축파일을 다운로드한다.
다운로드한뒤 압축파일을 풀자.

위 사진처럼 순서대로 폴더를 타고 들어오면 Inc폴더와 Src폴더가 보인다.

Inc 폴더내부의 udp_echoserver.h를 복사한다.

마찬가지로 Src 폴더 내부의 udp_echoserver.c를 복사한다.

main.c 파일에서

#include "udp_echoserver.h"를 입력한다.

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* 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_LWIP_Init();
  /* USER CODE BEGIN 2 */
  udp_echoserver_init();
  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
	  ethernetif_input(&gnetif);
	  sys_check_timeouts();
  }
  /* USER CODE END 3 */
}

위와 같이 main 함수를 작성한다. 그리고 보드에 내려받고 실행시켜본다.

4. 실행 결과

echo server로써 동작을 하는 것을 확인할 수 있었다.

0개의 댓글