2 분 소요

1. 프로젝트 디렉토리 구조

생성된 프로젝트 폴더에서 “EWARM/Project.eww” 파일을 클릭하여 IAR 프로젝트를 실행한다. 먼저, 프로젝트 디렉토리의 구조를 파악해 보자.
image

가장 크게 Application, Drivers, Middlewares, Output 디렉토리가 보인다.

(1) Application

프로그래밍을 하면서 가장 많이 접근하게 되는 폴더로, “main.c” 와 함께, 주로 다루게 되는 코드파일이 담겨 있다.

(2) Drivers

STM32 MCU의 내부 Register를 다루는 Hardware 코드와 HAL, LL 라이브러리가 담겨있다.

(3) Middlewares

Software Stack에 관한 프로그래밍 코드 파일들이 들어간다.
우리는 USB CDC 기능을 활성화 하였기 때문에 USB 통신에 관한 Software Stack 코드가 생성이 되었다. 만약, Software Stack을 필요로 하는 기능을 활성화 하지 않았다면 생성되지 않는 폴더이다.
USB 말고 Middlewares 쪽으로 생성되는 코드에는 FatFS, RTOS 등이 있다.

2. LED, Switch

첫번째로, 간단하게 LED와 Switch잘 작동하는 지 테스트를 해 보자.
main.c 파일을 열고, main()함수 안 while() loop 안에서 1초에 한 번씩 LED를 깜박이도록 해 보자.
코드 내용을 잘 보면, 주석으로

/* USER CODE BEGIN */

/* USER CODE END */

로 되어있는 구간이 있다. 이 사이에 코드를 입력하면, CubeMX에서 프로젝트를 다시 Generate 하더라도 입력한 코드가 사라지지 않는다.

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

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

while() 부분은 위와 같은데, “while(1) {“ 문구를 감싸서 한번, while 문 끝의 ”}” 중괄호 닫는 부분을 감싸서 한 번 이렇게 두 번의 User Code 구간이 있다.

(1) LED 깜박이기

while 문 안에 다음 코드를 넣고 프로그램을 다운로드 해 보자.

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin);
    LL_mDelay(500);
    LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin);
    LL_mDelay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

Toggle 함수를 사용하면 다음과 같이 간략하게 할 수 있다.

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    LL_mDelay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

LED Port와 Pin의 이름은 main.h 파일에 define 되어 있다.
프로젝트 Workspace에는 .h 파일이 보이지 않는데, CubeMX에서 헤더파일은 Import 해 주지 않도록 설정이 되어있는 것 같다. 불편한 부분 중 하나이다. 헤더파일을 열 때는,

image
짝이 되는 .c 파일을 열어서 에디터 창에서 우클릭 해서 “Open Header/Source File” 을 클릭하면 된다.
소스 파일에서는 헤더 파일을, 헤더 파일에서는 소스 파일을 열 수 있는 기능이다.
main.h 파일의 /* Private defines ———————————————————–*/ 부분을 보면,
CubeMX에서 User Label을 넣은 GPIO 핀의 이름이 나온다.
image

(2) Switch 사용하여 LED 점멸

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    if(!LL_GPIO_IsInputPinSet(SW_GPIO_Port, SW_Pin)) {
      while(!LL_GPIO_IsInputPinSet(SW_GPIO_Port, SW_Pin));
      LL_mDelay(100);
      LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

카테고리:

업데이트:

댓글남기기