引言

本文章介绍了如何在CLion进行STM32开发下,使用printf函数支持串口重定向,以及支持打印浮点数。通过合理的CMake配置和代码实现,我们可以让STM32项目具备完整的printf调试功能。众所周知printf是在个人PC机上将输出打印在终端和屏幕上,在单片机上使用printf进行输出,则就是使用串口代替终端和屏幕进行类似的输出。

1. CMake配置

在项目的CMakeLists.txt文件中添加以下配置:

# 开启硬件浮点运算
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=fpv4-sp-d16 -mfloat-abi=hard")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=fpv4-sp-d16 -mfloat-abi=hard")

# 使能printf相关函数支持浮点数
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE -u _printf_float)

配置说明:

  • 硬件浮点运算-mfpu=fpv4-sp-d16 指定使用STM32F4的硬件浮点单元,-mfloat-abi=hard 启用硬件浮点ABI(这里博主使用的是F4的芯片,使用其他芯片可询问AI)
  • 浮点数打印支持-u _printf_float 强制链接器包含printf的浮点数处理代码

2. printf串口重定向实现

在你的串口的头文件中添加以下代码:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
   HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, 0xFFFF);//修改为对应的串口
   return ch;
}

代码说明:

  • 编译器兼容性:针对GCC和其他编译器使用不同的函数名
  • UART选择:示例使用huart1,请根据实际项目修改
  • 超时设置0xFFFF提供足够的传输超时时间

3. 使用示例

配置完成后,你可以在代码中直接使用printf进行调试:

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    
    // 初始化USART1(确保与重定向中使用的UART一致)
    MX_USART1_UART_Init();
    
    // 测试整数打印
    printf("Hello STM32!\r\n");
    printf("Integer: %d\r\n", 12345);
    
    // 测试浮点数打印
    float temperature = 25.67f;
    double precision_val = 3.1415926;
    
    printf("Temperature: %.2f°C\r\n", temperature);
    printf("Pi value: %.6lf\r\n", precision_val);
    
    while (1)
    {
        // 主循环
        HAL_Delay(1000);
        printf("Running time: %lu ms\r\n", HAL_GetTick());
    }
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐