게시글 상세
목록으로STM32 CubeIDE 실수값 연산 설정
조회수: 63
작성자: june9152
등록일: 2025-08-22 13:58
수정일: 2025-12-20 19:54
🔧 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. 실습 과제
📋 과제 요구사항
- ADC에서 읽은 값을 전압으로 변환 (실수 연산)
- 삼각함수를 이용한 PWM 파형 생성
- PID 제어기 구현 (실수 연산 필수)
- 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 실수값 연산 설정 가이드