STM32F Discovery - 对arm_sin_f32的未定义引用

时间:2018-03-12 14:18:20

标签: c linker-errors stm32 stm32f4discovery

我是编程STM32F Discovery板的新手。我按照here的说明操作,设法让闪亮的led灯工作。

但现在我正试图播放我从here借来代码的音频。在我的Makefile中,我已经包含CFLAGS += -lm,这是我理解arm_sin_f32已定义的地方。

这是main.c的代码:

#define USE_STDPERIPH_DRIVER
#include "stm32f4xx.h"
#define ARM_MATH_CM4
#include <arm_math.h> 
#include <math.h>
#include "speaker.h"

//Quick hack, approximately 1ms delay
void ms_delay(int ms)
{
    while (ms-- > 0) {
      volatile int x=5971;
      while (x-- > 0)
        __asm("nop");
   }
}

volatile uint32_t msTicks = 0;

// SysTick Handler (every time the interrupt occurs, this is called)
void SysTick_Handler(void){ msTicks++; }

// initialize the system tick 
void InitSystick(void){
   SystemCoreClockUpdate();
    // division occurs in terms of seconds... divide by 1000 to get ms, for example
   if (SysTick_Config(SystemCoreClock / 10000)) { while (1); } // 
update every 0.0001 s, aka 10kHz
}


//Flash orange LED at about 1hz
int main(void)
{
    SystemInit();
    InitSystick();
    init_speaker();
    int16_t audio_sample;
    int loudness = 250;
    float audio_freq = 440;
    audio_sample = (int16_t) (loudness * arm_sin_f32(audio_freq*msTicks/10000));
    send_to_speaker(audio_sample);
}

但是在尝试运行make时出现以下错误:

main.c:42: undefined reference to `arm_sin_f32'

2 个答案:

答案 0 :(得分:2)

使用-lm,您将链接到libc的数学库,浮点数为您提供

https://www.gnu.org/software/libc/manual/html_node/Trig-Functions.html

Function: double sin (double x)
Function: float sinf (float x)
Function: long double sinl (long double x)
Function: _FloatN sinfN (_FloatN x)
Function: _FloatNx sinfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

These functions return the sine of x, where x is given in radians. The return value is in the range -1 to 1.

当你使用浮动时,你会想要使用sinf

如果您想使用arm_sin_f32,那么您应该链接到CMSIS的dsp库。 https://www.keil.com/pack/doc/CMSIS/DSP/html/group__sin.html

float32_t   arm_sin_f32 (float32_t x)
    Fast approximation to the trigonometric sine function for floating-point 
    data.

您应该链接到相应的预编译库,详见:CMSIS DSP Software Library

此时最新版本的CMSIS可在以下位置获得: https://github.com/ARM-software/CMSIS_5 我不认为你应该简单地复制c文件,因为它会“污染”你自己的项目并且更新会很难。

只需克隆存储库并添加到makefile:

CMSISPATH = "C:/path/to/cmsis/top/directory"
CFLAGS += -I$(CMSISPATH)/CMSIS/DSP/Include
LDFLAGS += -L$(CMSISPATH)/CMSIS/Lib/GCC/ -larm_cortexM4lf_math

答案 1 :(得分:1)

首先,arm_sin_32不存在。 arm_sin_f32例如是。还有更多不同的。您需要将CMSIS中相应的c文件添加到项目中,例如:CMSIS / DSP / Source / FastMathFunctions / arm_sin_f32.c

我建议不要使用keil中的那个,因为它可能已经过时了 - 只需从github下载最新版本的CMSIS。

arm _....函数不是m库的一部分。

不要使用nop-s作为延迟,因为它们会在没有执行的情况下立即从管道中冲出。它们仅用于填充