본문 바로가기

쓰기

ARM Cortex-M 기초 알아보기
2015.11.08 00:09

ARM Cortex-M 기초 알아보기 - 3. GPIO 출력 제어하기

조회 수 4081
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 이번에는 GPIO의 디지털 출력 제어를 통해 MCU계의 Hello World!인 LED 깜박이기를 해 보도록 하겠습니다. 내용 수준은 기존에 8bit MCU 사용이 익숙하신 분들에 맞춰 진행할 것입니다. 사용할 MCU는 Cortex-M0의 한 종류인 STM32F030F4P6입니다. STM32F030F4P6는 TSSOP20 패키지를 가지는 엔트리급 32bit MCU입니다. 이 MCU를 선택한 것은 변환기판에 납땜하였을 때 브레드보드에 바로 꽂을 수 있기 때문입니다. 우선 초기 코드 생성을 위해 STM32CubeMX를 실행하고 MCU Selector에서 STM32F030F4Px를 선택합니다.


 아래 핀 배치도와 같이 PA7 핀을 클릭하여 GPIO_Output으로 선택합니다. 이번 경우에는 PA7 핀에 GPIO_LED라는 이름을 정해 주었습니다. 이름은 해당 핀을 우클릭하여 라벨을 입력하면 됩니다. 라벨 기능이 쓸모 있는 이유는 코드 상에서 이 라벨을 원래 핀 번호 대신 사용할 수 있기 때문입니다. 핀 이름만 알고 있다면 해당 핀이 실제로 어디 붙어 있는지 데이터시트를 보면서 찾지 않아도 되는 유용한 기능입니다. 그 다음 외부 클럭을 사용할 것이므로 PF0와 PF1 핀에 각각 RCC_OSC_IN과 RCC_OSC_OUT을 설정해 줍니다. 여기에 외부 크리스탈의 각 핀을 연결하면 됩니다. 외부 크리스탈의 각 핀과 GND 사이에는 20pF 세라믹 캐패시터를 달아 주었습니다. 프로그램 다운로드와 디버깅은 SWD(Serial Wire Debug)를 통해 할 것이므로 PA13과 PA14핀에 SYS_SWDIO와 SYS_SWCLK를 설정해 줍니다. 핀 배치가 끝났다면 Clock Configuration 탭에서 외부 클럭을 8MHz로 설정하고 HSE, PLLCLK을 선택합니다. PLLMul 값은 6배로 설정합니다. 클럭을 다 설정하면 코어 및 주변 장치에서 48MHz 클럭을 사용하는 것을 확인할 수 있습니다.


`CubeMX_Pinout.jpg
STM32CubeMX에서 pinout 설정



`CubeMX_Clock.jpg 시스템 클럭 설정


 여기까지 설정을 완료하셨다면 코드 생성을 통해 MDK-ARM V5 프로젝트를 생성합니다. µVision을 연 다음 main.c 파일의 while 루프 내부에 딱 아래 두 줄만 추가합니다.


HAL_GPIO_TogglePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin);

HAL_Delay(500);


GPIO_LED_GPIO_Port 대신 GPIOA를, GPIO_LED_Pin 대신 GPIO_PIN_7을 입력해도 됩니다. 앞서 CubeMX에서 PA7 핀에 GPIO_LED라는 라벨을 할당했기 때문에 이를 사용할 수 있습니다. HAL_GPIO_TogglePin()는 해당 GPIO 핀의 출력을 토글하는 함수이며, HAL_Delay()는 ms 단위로 프로그램 동작을 지연시키는 함수입니다. 위 두 줄을 추가하면 GPIO_LED 핀에 연결된 LED를 0.5초마다 켜거나 끄는 동작을 하게 됩니다. LED 토글같은 간단한 기능은 HAL driver를 이용하면 아두이노 수준으로 매우 쉽게 구현할 수 있습니다.


 F7을 눌러 코드를 컴파일한 후 LED가 동작하기 위한 회로를 구성합니다. 외부 크리스탈과 세라믹 캐패시터, LED를 각 핀에 맞게 구성합니다. 그 다음 SWD 인터페이스 연결을 위해 디버깅 장비를 MCU에 연결합니다. 사용한 장비는 ST-LINK/V2입니다. 연결은 아래 핀맵을 참조하시면 됩니다. 저는 ST-LINK 쪽의 VAPP(1), TMS_SWDIO(7), TCK_SWCLK(9), GND(20) 4개의 핀을 연결하였습니다. SWD는 JTAG에 비해 적은 수의 핀을 사용하므로 MCU 보드 쪽의 공간을 절약할 때 유용합니다. RESET 핀은 따로 연결하지 않았지만 디버깅 메뉴에서 MCU를 문제 없이 리셋할 수 있었습니다. VAPP의 역할은 MCU 보드쪽에서 사용하는 신호 레벨을 ST-LINK에 알려주는 역할이므로 타켓 보드에 전원은 따로 넣어 주어야 합니다. 19번 핀의 VDD가 3.3V를 제공하기는 하지만 이걸 사용해 본 결과 전압이 안정적이지 못해 전원으로 사용할 수는 없다고 보았습니다. 그래서 MCU 보드는 USB 허브를 이용하여 따로 3.3V 전원을 넣어 주었습니다. 일반적인 8bit MCU가 5V도 사용 가능한 것에 반해 Cortex MCU들은 거의 3.3V 전원을 사용합니다. 5V를 인가하면 칩이 타거나 손상될 수 있으니 주의해야 합니다.


`STLINK.jpg

ST-LINK/V2 연결 방법


 디버깅 장비를 연결하였다면 타켓 설정에서 device를 ST-LINK로 설정한 뒤 F8 키를 눌러 MCU에 프로그램을 다운로드합니다. 프로그램을 MCU의 user flash 영역에 다운로드 하였으므로 flash 영역에서 boot해야 합니다. STM32F030F4P6의 1번 핀인 BOOT0 핀을 GND에 연결하면 MCU가 user flash 영역을 통해 boot하게 됩니다. Boot 설정이 끝나면 Ctrl+F5 키를 통해 디버그 세션을 엽니다. F5를 눌러 프로그램을 run하면 약간의 초기화 시간 이후 LED가 1초 주기로 깜박거리는 것을 확인할 수 있습니다.


`LED.jpg

Hello LED!


 STM32CubeMX에서 제공하는 HAL 드라이버를 사용하니 STM32F030F4P6의 데이터시트를 하나도 보지 않고 LED를 깜박일 수 있었습니다. 생각보다 편리하네요. 다음 번에는 스위치를 이용해 GPIO 입력을 받고, 입력에 따라 LED를 깜박여 보도록 하겠습니다.

  1. ARM Cortex-M 기초 알아보기 - 6. PWM 사용하기

    이번 글에서는 PWM을 이용하여 모터를 구동시켜보도록 하겠습니다. 먼저 STM32CubeMX를 이용하여 설정을 진행합니다. PWM을 사용하기 위해 타이머 TIM1의 Clock Source를 Internal Clock으로 설정해 줍니다. 그 후 사용하고 싶은 채널을 PWM Generation탭으로...
    Date2016.03.25 CategoryARM Cortex-M 기초 알아보기 By최호선 Views3874
    Read More
  2. ARM Cortex-M 기초 알아보기 - 5. ADC 사용하기

    이번에는 ADC와 관련하여 STM32F407VGT6 Discovery board에 연결된 Potentiometer의 ADC 값을 Debug Viewer를 통해 실시간으로 받아보도록 하겠습니다. (프로젝트 진행자가 변경된 이유로 인해 MCU가 Discovery board로 변경되었습니다.) STM32CubeMX의 Confi...
    Date2016.01.28 CategoryARM Cortex-M 기초 알아보기 By최호선 Views4348
    Read More
  3. ARM Cortex-M 기초 알아보기 - 4. GPIO 입력 제어하기

    이번에는 스위치를 통해 GPIO의 입력을 받아 LED를 켜고 끄는 예제를 다루어 보겠습니다. STM32CubeMX 설정은 지난번과 같지만 스위치 입력을 받기 위해 PA4 핀을 GPIO_Input으로 설정합니다. 핀 라벨은 GPIO_SW라고 붙였습니다. STM32CubeMX의 Configuration...
    Date2015.11.10 CategoryARM Cortex-M 기초 알아보기 By박정현 Views3821
    Read More
  4. ARM Cortex-M 기초 알아보기 - 3. GPIO 출력 제어하기

    이번에는 GPIO의 디지털 출력 제어를 통해 MCU계의 Hello World!인 LED 깜박이기를 해 보도록 하겠습니다. 내용 수준은 기존에 8bit MCU 사용이 익숙하신 분들에 맞춰 진행할 것입니다. 사용할 MCU는 Cortex-M0의 한 종류인 STM32F030F4P6입니다. STM32F030F4...
    Date2015.11.08 CategoryARM Cortex-M 기초 알아보기 By박정현 Views4081
    Read More
  5. ARM Cortex-M 기초 알아보기 - 2. 개발 환경 구축

    Cortex-M을 지원하는 IDE는 여러 종류가 있습니다. 그 중에서 저는 ARM에서 공식적으로 지원하는 Keil µVision IDE를 사용하려고 합니다. Keil µVision은 말 그대로 ARM에서 공식적으로 지원하기 때문입니다. 코어 설계사에서 직접 제공하는 IDE가 사후 지원...
    Date2015.10.26 CategoryARM Cortex-M 기초 알아보기 By박정현 Views6043
    Read More
  6. ARM Cortex-M 기초 알아보기 - 1. 개요

    자신이 원하는 대로 움직이는 기계나 회로 등을 만들 때는 MCU 만한 것이 없습니다. 국내에서는 2000년대 들어 8051, PIC, AVR 등을 통해 8bit MCU들이 퍼지기 시작하였고, 2010년 이후 Arduino의 등장을 통해 기존의 8bit MCU를 쉽게 사용할 수 없던 일반인...
    Date2015.10.26 CategoryARM Cortex-M 기초 알아보기 By박정현 Views6252
    Read More
  7. 2013-07-23 소모성 데시칸트 제습기

    2013년 여름에 시작한 프로젝트입니다. 정확한 시작일이 기억나지 않아 가지고 있는 자료 중에서 가장 오래된 것의 날짜를 선택하였습니다. 2013년 여름은 제가 지금 살고 있는 집으로 이사를 온 때인데, 집 주변이 광활한 논으로 둘러싸여 있습니다. 그 때문...
    Date2015.02.08 Category화학식 제습장치 By박정현 Views1425
    Read More
Board Pagination Prev 1 Next
/ 1