Stm32中如何使用printf打印浮点数变量

11

我希望通过usart从stm32f405注销。在我的syscall.c文件中,我已经实现了通过usart打印的函数:

int _write(int file, char *ptr, int len)
{
    int todo;
    for (todo = 0; todo < len; todo++)
    {
    usart_send_char( *ptr++ );
    }
    return len;
}

usart_send_char( *ptr++ );函数正常工作。但是当我调用以下内容时:

printf("%s, %d, %3.2f\r\n", "asd", 777, 13.2 );

我理解为:

我得到:

asd,777,0.00

浮点数变量未正确打印。

Makefile:

PROCESSOR = -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16
CFLAGS += $(PROCESSOR) $(INCLUDES) $(STFLAGS) -Wall -fno-strict-aliasing $(C_PROFILE)
LDFLAGS = $(PROCESSOR) -Wl,-Map=$(PROG).map,--cref,--gc-sections

使用的编译器:

Sourcery CodeBench Lite 2014.05-28
我哪里错了?

4
你有两个正确答案,请投票选择其中一个并标记此问题已解决。 - Bulkin
4个回答

25

我没有使用过适用于STM32F4的Sourcery Codebench gcc,但是使用GCC ARM Embedded 工具链时,默认情况下printf中的浮点数支持未启用。要启用,请将-u _printf_float添加到您的LDFLAGS中。


7
  1. 我不确定,但我认为必须为CFLAGS设置mfloat-abi标志。
  2. STM32F4有一个FPU,那么为什么要使用mfloat-abi=soft呢?不能使用mfloat-abi=hard吗?
  3. 如果您不需要经常计算浮点值,可以按以下方式进行。

代码示例:

 int i = 132;
 printf("Result is: %d.%d", i/10, i%10);

5

Snapshot of where you addd the command -u _printf_float in STM project settings

要在sprintf中启用浮点数,请像这张图片所示将-u _printf_float添加到您的项目中。


谢谢,已完成,但警告未消失。 - mathengineer

0

STM32cubeIDE有一个复选框来实现这个功能,但显然它做的事情与建议的-u_printf_float相同。而且还有一个单独的_scanf_float。右键单击项目名称,选择“属性”(在列表底部)。

Properties dialog box


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接