์ž๋ฃŒ์‹ค ๊ธฐ์ˆ ์ž๋ฃŒ

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 ์‹ค์ˆ˜๊ฐ’ ์—ฐ์‚ฐ ์„ค์ • ๊ฐ€์ด๋“œ

๋ชฉ๋ก์œผ๋กœ

์ฒ˜๋ฆฌ ์ค‘์ž…๋‹ˆ๋‹ค...

์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.