hal库printf输出16进制
时间: 2025-07-08 10:19:29 浏览: 3
### 使用 HAL 库配合 `printf` 函数输出 16 进制数值
为了实现通过 `printf` 函数以 16 进制格式输出数据,可以按照以下方法完成配置和代码编写:
#### 配置环境
在使用 STM32 的 HAL 库时,默认情况下 `printf` 函数可能会启用半主机模式(semi-hosting),这会导致调试信息被发送到 IDE 而不是串口。因此需要关闭半主机模式并重新定义标准输入/输出流。
可以通过重定向 `stdout` 和 `stderr` 到 UART 来解决此问题。具体操作是在项目中加入自定义的 `_write` 或者 `fputc` 函数[^2]。
#### 示例代码
以下是完整的代码示例,展示如何利用 HAL 库中的 `HAL_UART_Transmit` 实现 `printf` 函数的重定向,并支持 `%x` 格式的十六进制输出。
```c
#include "stdio.h"
#include "stm32f1xx_hal.h"
// 定义UART句柄结构体
UART_HandleTypeDef huart1;
// 初始化UART外设
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
// Initialization Error
while (1);
}
}
// 重定向printf函数的标准输出到USART
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); // 发送单字节字符
return ch;
}
int main(void)
{
HAL_Init(); // 初始化HAL库
MX_USART1_UART_Init(); // 初始化USART1
printf("Hexadecimal Output:\n");
uint16_t value = 0xABCD; // 待输出的16进制值
printf("Value in hex is: %x\n", value);
while (1)
{
// 主循环保持运行状态
}
}
```
上述代码实现了以下几个功能:
- **初始化 UART 外设**:通过调用 `MX_USART1_UART_Init()` 设置波特率、停止位等参数。
- **重定向 `printf` 输出**:通过自定义 `fputc` 将每个字符写入指定的 UART 接口中[^3]。
- **测试输出**:演示了如何使用 `printf("%x")` 打印变量 `value` 的十六进制表示形式。
需要注意的是,如果希望输出大端序或者特定格式的数据,则需进一步调整 `printf` 的格式化字符串或手动处理二进制数据[^1]。
---
###
阅读全文
相关推荐

















