CubeMx——串口与 printf 打印

CubeMx 配置

在这里插入图片描述

fputc 实现

/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
    uint8_t send_data = ch;
    HAL_UART_Transmit(&huart1, &send_data, 1, HAL_MAX_DELAY);

    return ch;
}
/* USER CODE END 1 */

使能 libc

在这里插入图片描述

编译报错解决

  • Undefined symbol use two region memory (referred from startup stm32xxx)
  • Undefined symbol initial sp (referred from entry2.o)

解决这两个错误也 比较简单,在 .s 启动文件中将 Stack_Size 改大一点就可以了

Stack_Size		EQU     0x600

在这里插入图片描述
或者直接在 CubeMx 生成的时候修改配置
在这里插入图片描述

串口打印

/* USER CODE BEGIN PV */
#include <stdio.h>
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
  printf("this is printf example\r\n");

  /* USER CODE END 2 */
### 配置 STM32CubeMX 中的 `printf` 函数 为了使 `printf` 函数能够在基于 HAL 库的 STM32 项目中正常工作并通过串口输出,需完成几个必要的设置。 #### 设置 USART 初始化结构体 在 STM32CubeMX 软件界面内配置 USART 外设参数,确保选择了合适的波特率、字长和其他属性。这一步骤会自动生成初始化代码,在生成的项目中的 `.c` 文件里找到类似如下定义: ```c UART_HandleTypeDef huart1; ``` 此句声明了一个用于 UART/USART 的处理对象实例[^1]。 #### 修改 `fputc` 和 `fgetc` 函数 为了让标准 C 库里的输入输出函数能够通过指定的串行端口传输数据,需要重写这两个函数。具体做法是在项目的源码目录下的 `usart.c` 或其他适当位置添加下面两段代码片段: 对于字符输出(即 `printf`),应有如下形式的 `fputc` 实现: ```c int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; } ``` 而对于字符输入,则可以提供相应的 `fgetc` 定义来支持像 `getchar()` 这样的调用: ```c int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xFFFF); return ch; } ``` 上述两个函数分别实现了将单个字符发送给以及从硬件 UART 接收单个字符的功能[^4]。 #### 添加 `<stdio.h>` 头文件 最后但同样重要的是,在任何打算使用这些 I/O 功能的地方——无论是主应用程序还是驱动程序模块——都应当包含标准 IO 库头文件: ```c #include <stdio.h> ``` 这样做的目的是让编译器知道如何解析 `printf`, `scanf` 及其变种版本等高级别的I/O操作符[^2]。 完成了以上步骤之后,就可以利用 `printf` 来向连接至选定 USART 线路的终端设备发送调试信息或其他任何形式的数据流了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tyustli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值