임베디드 기초 7편 - 클럭 심화: 보드레이트와 SPI 속도는 어떻게 계산되는가

들어가며 UART 보드레이트 계산 BRR 레지스터 STM32 UART는 BRR(Baud Rate Register)로 분주비를 설정한다. 기본 16배 오버샘플링(OVER8=0) 기준: RM0383 19.3.4 — Fractional baud rate generation: BRR 레지스터와 USARTDIV 관계 1 Baud Rate = f_PCLK / (16 × USARTDIV) USARTDIV는 정수부(12비트)와 소수부(4비트)로 구성된다. 소수점 이하 4비트이므로 1/16 단위까지 설정 가능하다. 계산 예시 UART2, APB1 = 50 MHz, 목표: 115200 bps 1 2 3 4 5 6 USARTDIV = 50,000,000 / (16 × 115,200) = 27.127... 정수부: 27 소수부: 0.127 × 16 = 2.03 → 반올림 → 2 BRR = (27 << 4) | 2 = 0x01B2 실제 보드레이트 역산: ...

2026년 6월 9일 · 3 min · 서보민

임베디드 기초 6편 - 클럭 트리와 RCC: 주파수는 어디서 오는가

들어가며 UART 보드레이트를 설정할 때 115200을 입력한다. SPI 속도를 설정할 때 분주비(prescaler)를 고른다. 이 숫자들의 근거가 뭘까. 전부 클럭(Clock) 에서 나온다. MCU 안의 모든 주변장치는 클럭 신호를 기반으로 동작하고, 그 클럭이 얼마인지에 따라 통신 속도가 결정된다. 클럭 소스 (Clock Source) MCU는 기준 클럭을 어딘가에서 공급받아야 한다. STM32F4의 주요 클럭 소스는 두 가지다. HSI (High Speed Internal) MCU 내부 RC 오실레이터 16 MHz 고정 외부 부품 불필요 정밀도 낮음 — 온도와 전압에 따라 ±1% 수준의 오차 리셋 직후 기본으로 사용되는 클럭 소스 오차가 있는데도 HSI를 쓰는 이유가 있다. ...

2026년 6월 3일 · 4 min · 서보민

임베디드 기초 5편 - 인터럽트와 NVIC: CPU를 기다리게 하지 마라

들어가며 4편에서 벡터 테이블을 다뤘다. [0]은 MSP, [1]은 Reset_Handler 주소였고, 나머지 항목들(NMI_Handler, HardFault_Handler, TIM2_IRQHandler…)은 그냥 지나쳤다. 이것들이 전부 인터럽트 핸들러다. 임베디드 코드의 상당 부분이 이 핸들러들 안에서 돌아간다. 폴링 vs 인터럽트 외부 이벤트(버튼 입력, 센서 데이터 도착 등)를 처리하는 방법은 두 가지다. 폴링 (Polling) 1 2 3 4 5 6 while (1) { if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) { // 버튼 눌림 처리 } do_something_else(); } CPU가 주기적으로 상태를 직접 확인한다. CPU가 루프를 돌며 GPIO를 계속 읽어야 하고, 짧은 펄스나 빠른 이벤트를 놓칠 수 있다. 확인할 이벤트가 늘어날수록 반응 속도도 느려진다. ...

2026년 5월 28일 · 4 min · 서보민

임베디드 기초 2편 - 메모리 구조와 변수 저장 원리

들어가며 1편에서 펌웨어가 플래시에 저장되고, 변수는 RAM에서 동작한다고 정리했다. 그런데 막상 “전역변수는 어디 저장돼요?”, “const는요?” 라는 질문을 받으면 정확하게 대답하기가 쉽지 않다. Flash vs RAM 다시 짚기 플래시(Flash) 비휘발성(non-volatile) — 전원을 꺼도 데이터가 유지된다 읽기는 자유롭지만, 쓰기는 Erase → Write 순서로 페이지/섹터 단위로만 가능하다 속도가 RAM보다 느리다 코드(명령어), 상수, 전역변수 초기값이 저장된다 RAM 휘발성(volatile) — 전원을 끄면 데이터가 사라진다 자유롭게 읽기/쓰기 가능하고 속도가 빠르다 실행 중 변하는 데이터(전역변수, 지역변수, 동적 할당(dynamic allocation))가 올라간다 메모리 섹션: .text / .data / .bss 링커는 빌드 결과물을 목적에 따라 여러 섹션으로 분리해서 관리한다. ...

2026년 5월 10일 · 4 min · 서보민

HAL GPIO 내부 뜯어보기 및 레지스터 직접 제어

HAL_GPIO_ReadPin()과 HAL_GPIO_WritePin()이 내부에서 어떻게 동작하는지 분석하고, ODR 대신 BSRR을 사용하는 이유와 레지스터 직접 제어 방법까지 정리한 글

2026년 4월 22일 · 4 min · 서보민

GPIO 기본개념 및 입출력 실습

GPIO의 기본 개념과 Push-Pull, Open-Drain, Pull-up, Pull-down, 그리고 STM32F411 Nucleo에서 버튼 입력과 LED 출력을 실습한 글

2026년 4월 18일 · 4 min · 서보민