printf 浮点 stm32 时出现硬故障

Hard Fault when printf floats stm32

提问人:KaleM 提问时间:11/3/2023 更新时间:11/3/2023 访问量:45

问:

我在stm32cubeIDE 1.11.0上写了一个程序,可以计算正弦波的fft(我总是通过软件生成)。我显然已将导入的 DSP 库下载到项目中。 我应该在屏幕上打印频率及其幅度(以查看正弦波频率的理想峰值),但指令 printf(“frequency %f: %f \n”, (float32_t)frequencies_axis[i], output_fft_mag[i]); 导致硬故障中断...如果我打印整数和/或字符串,则不会发生这种情况。

main 是空的(它只调用有问题的函数),main 下面是由 stm32cubeIDE 自动完成的初始化。所以我只附加了函数的代码(为了简化事情),因为在我看来,问题要么出在我写的代码中,要么出在IDE设置中。

这是我第一次使用 printf,所以我可能在代码中犯了一个愚蠢的错误。我恳请您检查一下。先谢谢你。

enter image description here

enter image description here

enter image description here

enter image description here

//All global variables
#define FFT_BUFFER_SIZE 256
#define SAMPLING_RATE 16000
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[100];
float32_t frequencies_axis[FFT_BUFFER_SIZE / 2];


void get_sineval_FFT2() {
//int i = 0;
int frequency = 500;

//generate sinusoidal signal (this is what you receive from outside in the ADC pin, for example)
HAL_Delay(100);
for (int i = 0; i < FFT_BUFFER_SIZE; i++) {
    sine_val[i] = arm_sin_f32(2*PI*frequency*i/SAMPLING_RATE);
    //"sine_val" contains only one frequency (500Hz), so "output_fft" must contain all 0 except a spike at 500Hz
}

arm_rfft_fast_f32(&fftHandler, sine_val, output_fft, 0); //"output_fft" contiene: frequency values and phase information (è formato da complex numbers: in posizione pari ci sono i numeri reali e in posizione dispari c'è la complex immaginary part del numero )                                           k
arm_cmplx_mag_f32(output_fft, output_fft_mag, FFT_BUFFER_SIZE/2); //estraggo magnitude perchè ci interessa quella .. non ci interessa la fase! Estrai da "output_fft" la magnitude che è, per forza, metà fft (cioè FFT_BUFFER_SIZE/2)


for (int i = 0; i < FFT_BUFFER_SIZE / 2; i++) {
    frequencies_axis[i] = ((i * SAMPLING_RATE) / FFT_BUFFER_SIZE);
    //printf("frequencies_axis = %d \n", frequencies_axis[i]);
    printf("frequency %f: %f \n", (float32_t)frequencies_axis[i], output_fft_mag[i]);
    HAL_Delay(50);

    //sprintf(frequencies_axis_str[i], "%f", frequencies_axis[i]); //Ora "frequencies_axis_str" contains "frequencies_axis" as characters
    //printf("frequencies_axis %c : %f \n", frequencies_axis_str[i], output_fft_mag[i]);
    //HAL_UART_Transmit(&huart1, (uint16_t*)(frequencies_axis_str[i]), FFT_BUFFER_SIZE / 2, HAL_MAX_DELAY);
}

}
打印 STM32

评论

1赞 wek 11/3/2023
sprintf() 也失败了?
1赞 pmacfarlane 11/4/2023
格式说明符通常指示 a 是预期的。把你的价值投射到双重帮助上吗?%fdouble
1赞 pmacfarlane 11/4/2023
另请注意,'printf(“%f...)”在内部使用 malloc()。确保堆栈和堆“足够大”。
0赞 KaleM 11/4/2023
@pmacfarlane我声明了 printf 中使用的两个变量的“双倍”,现在它可以工作了。我真的没有想过。我仍然不清楚为什么它现在有效......是内存问题吗?float 和 double 之间有什么变化?(超越格式和精度)
1赞 pmacfarlane 11/4/2023
@KaleM 使用错误类型的参数进行转换会导致行为不明确。所以几乎任何事情都可能发生。不过,我不确定它导致硬故障的实际实际原因是什么。也许是堆栈下溢。printf()

答: 暂无答案