Notice
Recent Posts
Recent Comments
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

채록채록

[Embedded] STM32CubeIDE, STM32F407G-DISC1, Demonstration Example Sample, LED tog 본문

Embedded

[Embedded] STM32CubeIDE, STM32F407G-DISC1, Demonstration Example Sample, LED tog

김책은 2025. 7. 7. 22:25


STM32F407G-DISC1 Demonstration Example sample을 통해 공부한 것...


 

  • BSP_LED_Toggle() → HAL 라이브러리 함수 → 내부적으로 HAL_GPIO_TogglePin() 호출
  • HAL_Delay(10) → SysTick_Handler()에 의해 작동되는 tick 기반 지연 함수

STM32CubeIDE에서 Debug 버튼을 눌렀을 때 내부 동작 흐름

1단계: 컴파일 (Build Phase)

  • main.c, bsp.c, stm32f4xx_hal_gpio.c 등 C 파일이 .o 파일로 변환됨 (컴파일)
  • STM32F407VGTx_FLASH.ld 링커 스크립트에 따라 .o 파일들이 .elf 바이너리로 링크됨
  • 이 ELF 파일에는:
    • 실제 실행될 명령어
    • 변수 및 주소 정보
    • 디버그용 심볼 정보 등이 포함됨

2단계: 보드로 펌웨어 업로드 (Flash Programming)

  • STM32CubeIDE가 내부적으로 ST-LINK GDB Server를 실행함
  • ST-LINK 디버거(보드의 디버깅 회로)가 MCU에 연결됨
  • .elf 파일의 .text 섹션이 MCU의 Flash 메모리 0x08000000부터 업로드됨

예:

0x08000000 → Reset_Handler  
0x08000004 → NMI_Handler  
0x08000008 → HardFault_Handler  
...  
0x08001xxx → Demo_Exec() 코드 시작

 


3단계: 디버깅 세션 시작

  • CubeIDE가 GDB를 통해 디버깅 세션 시작
  • 초기화 작업:
    • Reset + halt
    • 심볼 로딩 (변수명으로 메모리 추적 가능)
    • Breakpoint 설정 (필요 시)
    • main() 함수 진입 직전에서 정지

보드에서 실제로 실행되는 과정

1. main() → Demo_Exec() 호출

  • 가속도 센서 초기화: BSP_ACCELERO_Init()
  • LED 초기화: BSP_LED_Init(LED4~6)
  • SysTick 타이머 설정: SysTick_Config(SystemCoreClock / 100) → 10ms 주기 인터럽트

2. 무한루프 진입

반복 조건

while (UserButtonPressed == 0x00)
  • USER 버튼이 눌릴 때까지 반복

루프 내 LED 제어

BSP_LED_Toggle(LED4); HAL_Delay(10); ...
  • HAL_Delay(10): SysTick 인터럽트로 누적된 tick을 기준으로 10ms 대기

전체 흐름 요약
소스코드 (C) → 컴파일/링킹 → .elf 생성 → 보드 플래시 → 디버깅 세션 연결 → 코드 실행

1. Build (컴파일 & 링크)

1-1. 소스코드 컴파일

  • main.c, stm32f4xx_hal.c 등 .c 파일들을 각각 .o (Object File)로 컴파일
  • 사용된 컴파일러는 STM32용 ARM GCC (arm-none-eabi-gcc)

1-2. 링커(LD)를 통한 ELF 생성

  • 링커 스크립트 (STM32F407VGTx_FLASH.ld) 기반으로 .o들을 하나의 ELF 파일로 결합
  • ELF 파일은 메모리 주소 정보, 심볼 테이블, 디버그 정보, 바이너리 코드 등 포함

2. 보드에 펌웨어 업로드

2-1. GDB 서버 실행 (OpenOCD or ST-LINK GDB 서버)

  • STM32CubeIDE는 내부적으로 ST-LINK에 연결하기 위해 GDB 서버를 실행
  • ST-LINK 디버거를 통해 MCU에 접근

2-2. .elf 파일을 STM32 보드에 Flash

  • GDB 서버는 ELF 파일의 .text 섹션(실행 코드)을 보드의 Flash 영역 (0x08000000번지)에 복사
  • .data, .bss, .isr_vector 등 메모리 섹션도 초기화

3. 디버깅 세션 연결

3-1. GDB Client 실행

  • arm-none-eabi-gdb가 실행되어 ST-LINK에 연결
  • GDB는 Breakpoint, Step 실행, Watch 등 디버깅 기능 제공

3-2. 디버깅 환경 초기화

  • IDE가 GDB에 다음 명령 전달:
    • monitor reset halt (보드 리셋 + 중지)
    • 심볼 로딩 (load)
    • PC(program counter)를 main() 또는 Reset_Handler에 위치시킴

4. 실제 실행

4-1. 초기화 코드 실행

  • Reset 벡터 → Reset_Handler() → SystemInit() → main()
  • HAL 라이브러리 초기화, 클럭 세팅, GPIO 설정 등 진행

4-2. main() 진입

  • main() 또는 Demo_Exec() 함수 안에서 BSP_LED_Toggle() 등의 로직 수행

4-3. 디버그 제어

  • 이 시점부터 IDE는:
    • Step Over / Step Into
    • Breakpoint 설정
    • Register/Memory 값 모니터링
    • Variable Watch
    • Peripheral 상태 확인
      등을 실시간으로 할 수 있음

HAL 및 하드웨어 동작 상세

SysTick 작동 원리

SysTick_Config(SystemCoreClock / 100); → 84MHz / 100 = 840,000 → 10ms마다 인터럽트
  • 매 10ms마다 SysTick_Handler() 실행
  • 내부 tick++ 증가
  • HAL_Delay는 tick 값을 폴링하여 딜레이 제공

HAL_GPIO_TogglePin() 작동 구조

GPIOx->BSRR = ((odr & GPIO_Pin) << 16) | (~odr & GPIO_Pin);
  • GPIO ODR 상태 읽고 비트 반전
  • BSRR 레지스터를 사용하여 출력 상태를 원자적으로 반전
  • LED Toggle 효과 발생

USER 버튼 확인

while (UserButtonPressed == 0x00)
  • 외부 인터럽트 혹은 polling 방식으로 버튼 상태 감지
  • 눌리면 UserButtonPressed = 1이 되며 while문 탈출

이후 TIM4 설정 및 USB 설정

TIM4_Config(); // PWM 설정 Demo_USBConfig(); // USB 연결 설정
  • TIM4는 PWM 출력용
  • USB는 CDC/MSC 디바이스로 동작하기 위해 초기화 수행

 
 

'Embedded' 카테고리의 다른 글

[STM32] STMCubeMX, STM32CubeIDE, IAR EWARMS, STM32F407, LD4 Toggl  (2) 2025.07.24