채록채록
[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 |
---|