게시글 상세

목록으로

STM32 CubeIDE 실수값 연산 설정

조회수: 63
작성자: june9152
등록일: 2025-08-22 13:58 수정일: 2025-12-20 19:54
STM32 CubeIDE 실수값 연산 설정

🔧 STM32 CubeIDE 실수값 연산 설정

📝 과제 정보: STM32 마이크로컨트롤러에서 부동소수점(float, double) 연산을 수행하기 위한 설정 방법을 정리한 문서입니다.

1. 프로젝트 설정

1 프로젝트 속성 열기
2 MCU GCC Compiler 설정

Other flags에 다음 옵션 추가:

-u _printf_float -u _scanf_float
3 MCU GCC Linker 설정

Other flags에 다음 옵션 추가:

-u _printf_float -u _scanf_float

2. FPU(Floating Point Unit) 설정

4 FPU 활성화 (Cortex-M4F/M7 계열)
설정 항목 권장 값 설명
Floating-point unit FPv4-SP-D16 단정밀도 부동소수점
Floating-point ABI Hard 하드웨어 FPU 사용
⚠️ 주의사항: FPU가 없는 Cortex-M0/M3 계열에서는 소프트웨어 부동소수점을 사용해야 합니다.

3. 코드 예제

기본 실수 연산

#include "main.h" #include <stdio.h> #include <math.h> int main(void) { HAL_Init(); SystemClock_Config(); // 실수 변수 선언 float a = 3.14159f; float b = 2.71828f; double c = 1.414213562373095; // 기본 연산 float sum = a + b; float product = a * b; float division = a / b; // 수학 함수 float sin_value = sinf(a); float sqrt_value = sqrtf(b); double pow_value = pow(c, 2.0); // printf로 출력 (UART 설정 필요) printf("Sum: %.6f\n", sum); printf("Product: %.6f\n", product); printf("Sin(%.6f) = %.6f\n", a, sin_value); while (1) { // 메인 루프 } }

printf/scanf 실수 출력 설정

// syscalls.c 파일에서 UART를 통한 printf 구현 int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, HAL_MAX_DELAY); return len; } // 사용 예제 float temperature = 25.67f; printf("Temperature: %.2f°C\n", temperature);

4. 성능 최적화

🚀 최적화 팁

  • 단정밀도 사용: float 타입과 f 접미사 사용 (예: 3.14f)
  • 수학 함수: sinf(), cosf(), sqrtf() 등 float 버전 사용
  • 컴파일러 최적화: -O2 또는 -O3 최적화 레벨 설정
  • 인라인 함수: 간단한 연산은 인라인 함수로 구현

5. 디버깅 및 문제 해결

5 실수값 디버깅

Variables 창에서 실수값 확인:

  • Format을 Decimal로 설정
  • Precision을 6~8자리로 설정
  • Scientific notation 사용 가능
6 메모리 사용량 확인
// 빌드 후 콘솔에서 확인 text data bss dec hex filename 12345 1234 5678 19257 4b39 project.elf

6. 실습 과제

📋 과제 요구사항

  1. ADC에서 읽은 값을 전압으로 변환 (실수 연산)
  2. 삼각함수를 이용한 PWM 파형 생성
  3. PID 제어기 구현 (실수 연산 필수)
  4. UART를 통한 실수값 출력
// ADC 전압 변환 예제 float adc_to_voltage(uint16_t adc_value) { const float vref = 3.3f; // 기준전압 const float adc_resolution = 4095.0f; // 12bit ADC return (adc_value * vref) / adc_resolution; } // PID 제어기 예제 typedef struct { float kp, ki, kd; float prev_error; float integral; } PID_Controller; float pid_compute(PID_Controller *pid, float setpoint, float measured) { float error = setpoint - measured; pid->integral += error; float derivative = error - pid->prev_error; float output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative; pid->prev_error = error; return output; }
✅ 체크리스트:
  • □ 프로젝트 설정에서 printf float 옵션 추가
  • □ FPU 설정 (해당하는 경우)
  • □ 실수 연산 코드 구현
  • □ 디버깅으로 결과 확인
  • □ 메모리 사용량 체크

작성일: 2025년 8월 22일

STM32 CubeIDE 실수값 연산 설정 가이드

처리 중입니다...

잠시만 기다려주세요.