You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32CubeIDE中printf打印浮点数触发Hard Fault求助

问题排查与解决方案

针对你在STM32CubeIDE 1.11.0中打印FFT浮点数触发Hard Fault的问题,核心问题集中在数组越界、FFT实例未初始化以及printf浮点数支持未开启这几个点,以下是具体排查和修复步骤:

1. 紧急修复:数组越界问题

你的代码中定义sine_val[100],但生成正弦波时循环执行了FFT_BUFFER_SIZE(256次),这会直接越界写入内存,破坏其他变量或栈空间,必然触发Hard Fault。

修复:
将sine_val的定义改为与FFT_BUFFER_SIZE一致:

float32_t sine_val[FFT_BUFFER_SIZE]; // 原定义是[100],改为[256]

2. FFT实例未初始化

调用arm_rfft_fast_f32前必须先初始化fftHandler,否则FFT函数会访问非法地址导致崩溃。

修复:
在get_sineval_FFT2函数开头添加初始化代码:

void get_sineval_FFT2() {
    int frequency = 500;
    // 初始化FFT实例
    arm_rfft_fast_init_f32(&fftHandler, FFT_BUFFER_SIZE);
    
    // 后续生成正弦波、FFT计算代码...
}

3. 开启printf浮点数支持

STM32默认的printf实现未开启浮点数格式化支持,使用%f格式符会触发异常。

修复:
在STM32CubeIDE中配置链接器选项:

  • 右键项目 → Properties → C/C++ Build → Settings → MCU GCC Linker → Miscellaneous
  • 在Other flags中添加参数:-u _printf_float
  • 点击Apply保存,重新编译项目

4. 可选:检查栈空间大小

浮点数格式化计算需要更多栈空间,若栈空间不足也可能触发Hard Fault。可以增大栈大小:

  • 打开项目中的startup_stm32xxxx.s文件
  • 修改Stack_Size的值,比如从默认的0x400改为0x800或0x1000:
    Stack_Size      EQU     0x800
    

修改后的完整功能函数示例

//All global variables
#define FFT_BUFFER_SIZE 256
#define SAMPLING_RATE 16000
#define PI 3.1415926535f // 补充PI的定义,避免编译错误
arm_rfft_fast_instance_f32 fftHandler;
float32_t input_fft[FFT_BUFFER_SIZE];
float32_t output_fft[FFT_BUFFER_SIZE];
float32_t output_fft_mag[FFT_BUFFER_SIZE / 2];
float32_t sine_val[FFT_BUFFER_SIZE]; // 修复数组大小
float32_t frequencies_axis[FFT_BUFFER_SIZE / 2];


void get_sineval_FFT2() {
    int frequency = 500;
    // 初始化FFT实例
    arm_rfft_fast_init_f32(&fftHandler, FFT_BUFFER_SIZE);

    //generate sinusoidal signal
    HAL_Delay(100);
    for (int i = 0; i < FFT_BUFFER_SIZE; i++) {
        sine_val[i] = arm_sin_f32(2*PI*frequency*i/SAMPLING_RATE);
    }

    arm_rfft_fast_f32(&fftHandler, sine_val, output_fft, 0);
    arm_cmplx_mag_f32(output_fft, output_fft_mag, FFT_BUFFER_SIZE/2);

    for (int i = 0; i < FFT_BUFFER_SIZE / 2; i++) {
        frequencies_axis[i] = ((float32_t)i * SAMPLING_RATE) / FFT_BUFFER_SIZE; // 强制转换避免整数截断
        printf("frequency %f: %f \n", frequencies_axis[i], output_fft_mag[i]);
        HAL_Delay(50);
    }
}

内容的提问来源于stack exchange,提问作者user20923098

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:57:44