

조금 기다리면,,,

여기서 보드 찾아준다.
여기서 Nucleo-64 는 MCU의 핀 개수를 의미한다.
STM32F103RB-Nucleo 보드의 경우 내부에 MCU를 잘 보면 핀이 64개인 것을 확인할 수 있다.

현재 내가 사용중인 STM32F103RB-Nucleo 보드는 STM32F1 계열 MCU를 사용하고있다.
스크롤 조금 더 내려서 MCU/PU Series에서 STM32F1을 골라준다.

선택하면 이렇게 위에 보드에 대한 설명이 나온다.
Next 눌러주자.

프로젝트명은 LED_BLINK로 설정해줬다.

Finish 눌러주자.

Yes 해주자. Yes하면 STM32F103RB-Nucleo 보드 주변 장치의 기본 설정을 불러온다.
주변 장치의 기본 설정 이란?
STM32 보드(Nucleo-64 같은 개발 보드)는 단순히 MCU만 올려놓은 게 아니라, 특정 핀에 LED, 버튼, ST-LINK, Arduino 헤더 등을 이미 연결해뒀다.
👉 그래서 CubeIDE에서 보드를 선택할 때 자동으로 그 보드에 맞는 기본 하드웨어 연결을 미리 설정해준다.
예를들어,
Nucleo 보드에 있는 녹색 LED (보드 위에 붙어 있음)
기본적으로 PA5 핀에 연결됨
CubeIDE에서 Yes 하면 PA5 핀을 GPIO Output으로 자동 설정해줌
보드 위에 있는 사용자 버튼
기본적으로 PC13 핀에 연결됨
(위와 같은 정보는 STM32F103RB의 Board Schematic에서 얻을 수 있다.)
CubeIDE에서 Yes 하면 PC13 핀을 GPIO Input으로 자동 설정한다.

위와 같이 일부 핀들이 기본적으로 설정이 되어있는 것을 확인할 수 있다.
STM32 MCU의 각 핀과 주변장치(Peripheral) 기능을 설정하는 단계
STM32의 핀은 멀티플렉스(Multiplexed) 구조라서, 한 핀에 여러 기능이 들어있음.
따라서 개발자가 어떤 핀을 GPIO로 쓸지, UART로 쓸지, ADC로 쓸지를 지정해야 함.
CubeMX는 이 설정을 GUI로 쉽게 해주고, 선택한 대로 초기화 코드를 자동 생성해 줌

HSE와 LSE를 이번 실습에서 쓰지 않을 예정이므로 위와 같이 HSE와 LSE를 Disable 해준다.
설정을 변경하면 Pinout view에서 자동으로 변경한것이 반영되는 것을 확인할 수 있다.

STM32F103RB-Nucleo 보드의 기본 설정으로 PA5와 PC13이 GPIO로 설정되었음을 확인할 수 있다.

이렇게 PA5를 클릭하면 PA5의 세부 상태를 확인할 수 있다.
현재 LED 출력을 위해 GPIO mode가 Output으로 설정되었음을 확인할 수 있다.

나중에 Generate Code 단계를 거치면 User Label 이름으로 GPIO_PIN과 GPIO_Port가 생성된다.
(완전 동일하진 않고, 네이밍룰이 적용되어 해당 LD2 가 포함된 이름으로 생성된다)
(스포)


위는 STM32F103RB-Nucleo 보드의 Schematic 이다.

보드 뒷편의 SB(솔더 브릿지) 확인해보면 LD2가 PA5와 연결되어 있음을 확인할 수 있다.
아 !
PA5에HIGH쏴주면LD2가 켜지는구나 ! 를 알 수 있다.
클럭의 소스와 분주 비율을 설정하는 단계
STM32 MCU 내부의 CPU, 버스, 주변장치(UART, SPI, ADC 등)가 동작하려면 모두 클럭(시계신호, Oscillator) 신호가 필요하다.
이 클럭의 소스와 분주 비율을 설정하는 단계가 바로 Clock Configuration 이다.
https://velog.io/@yun_study/STM32CubeIDE-Clock-Configuration
에 관련 설명이 있다.

앞서 RCC 단계에서 HSE와 LSE를 비활성화 했으므로 Clock Configuration에서도 비활성화 되어있는 것을 확인할 수 있다.

위와같이 MUX에서 PLLCLK를 선택해서 HCLK가 64MHz가 되도록 설정하자.
현재는 HSI(내부 고속 클럭)를 소스로, PLL로 주파수를 곱하고, 이를 MUX에서 선택해 HCLK를 64MHz로 만든 것이다.
(STM32F103RB-Nucleo 보드 최대 HCLK 는 72MHz 이지만, 내부 클럭으로는 64MHz가 최대이다.)
앞서 수행한 설정을 기반으로 코드를 자동 생성하는 단계
Pinout & Configuration (핀 기능 설정=주변 장치 설정)
Clock Configuration (클럭 설정)
Middleware 선택 (FreeRTOS, FATFS 등)
이런 걸 CubeMX를 통해 GUI로 다 설정한 뒤, 코드 자동 생성을 하는 단계가 바로 Generate Code임.
즉, 내가 GUI에서 고른 설정을 반영해서 C 초기화 코드(HAL 기반 코드)와 프로젝트 구조를 자동으로 만들도록 하는 단계이다.

Project-Generate Code 를 눌러준다.

위와 같이 자동으로 여러 파일들이 생긴 것을 확인할 수 있다.

Project-Build Project로 프로젝트를 빌드해보자.

Console을 보면 성공적으로 빌드된 것을 확인할 수 있다.
C언어로 소스코드를 작성하는 단계
앞서 CubeMX로 설정한 주변 장치, 클럭 설정등의 정보를 바탕으로 Generate Code 단계에서 이미 주변 장치, 클럭 설정관련 코드는 자동으로 생성되었다.
이제는 C언어로 소스코드를 작성할 차례이다.
CubeIDE 프로젝트 생성하면 Drivers/STM32F1xx_HAL_Driver/ 같은 폴더가 생기는데,
여기 안에 HAL 함수들이 전부 들어있다.
예를들어,
stm32f1xx_hal_gpio.c → GPIO 제어 HAL 구현체
stm32f1xx_hal_uart.c → UART 제어 HAL 구현체
stm32f1xx_hal_rcc.c → RCC 클럭 제어 HAL 구현체
이런식으로 말이다.
HAL Driver에서 제공되는 함수를 이용할 것이다.

위는 HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) 함수이다.
GPIO 핀의 출력을 Toggle하는 함수이다.

위는 HAL_Delay(uint32_t Delay) 함수이다.
ms단위로 딜레이를 주는 함수이다.
우리는 GPIO 5번의 출력을 Toggle 해야한다.
main.h에 들어가서 GPIO 5 번이 어떤 이름의 변수로 Generate 되었는지 확인해야한다.

GPIO 5번은 LD2_Pin으로, GPIOA는 LD2_GPIO_Port 이름으로 Generate된 것을 확인할 수 있다.
.c 파일에서 이 이름으로 코드를 짜면 된다

main.c로 가서 while 문의 BEGIN-END 내부에 위와같이 C 코드를 적어준다.
(코딩하는 규칙 관련 학습 기록이다., https://velog.io/@yun_study/STM32CubeIDE-%EA%B8%B0%EB%8A%A5)

GOOD

지금 주변이 복잡하긴한데,,,,어쨋든 STM32F103RB-Nucleo 보드와 PC를 USB로 연결해준다.

장치관리자에 들어가보면 STM32F103RB-Nucleo 보드가 가상 COM 포트로 잡힌 것을 확인할 수 있다.

Run-Run

OK 눌러준다

성공 !
STM32 MCU 내부의 Flash memory에 코드가 정상적으로 올라간 듯 하다.

시스템의 오류나 결함을 검출하여 제거하는 과정
문법 관련 오류는 빌드 과정에서 컴파일러가 잡아주지만, 코드상의 논리적인 오류 는 디버깅을 통해 찾아내야한다.
Debug 모드에서는 코드를 한 줄씩 실행해볼 수 있고, Breakpoint를 지정해 지정된 포인트에서만 정지해서 코드를 살펴볼 수도있다.

위 처럼 디버깅 화면으로 진입한다.
앞전에 Run-Run 했을떄와 마찬가지로 변경 내용 저장 및 빌드, 코드 업로드까지 진행된후에 디버깅 화면으로 전환된다.

위와 같이 다양한 디버깅 관련 기능들이 존재한다.

위처럼 Line number-우클릭-Toggle Breakpoint or Add Breakpoint를 통해 Breakpoint 설정이 가능하다.

위와 같이 resume 버튼을 누르면 100에 Breakpoint 설정했으므로 100번째 줄 너머의 코드 수행 직전까지만 코드를 실행한다.

종료버튼 누르면 디버그 모드를 종료할 수 있다.

참고로 해당 버튼 누르면 코드를 처음부터 다시 실행한다.
끝!