Cortex-M3-STM32F1 开发:(十三)HAL 库开发 ➤ printf 函数的使用与重定向
| 上一篇 | 下一篇 |
|---|---|
| SysTick 系统滴答定时器 |
目 录
- printf 函数的使用与重定向
- ① 使用
- ② 重定向
- 1. 避免使用半主机模式
- 2. 实现 fputc 函数(重定向到 USART1 )
printf 函数的使用与重定向
我们常用 printf 函数来调试程序,printf 函数输出流程:

① 使用

② 重定向
printf 函数支持:
-
避免使用半主机模式
两种方法:微库法、代码法
-
实现 fputc 函数(重新定义该函数就可以实现 printf 的重定向,一般是重定向到串口 USART1 )
实现单个字符的输出
1. 避免使用半主机模式
半主机模式是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。简单来说:就是通过仿真器实现开发板在电脑上的输入和输出。但是我们一般不使用半主机模式,我们使用的是串口。
-
方法一:微库法
在 魔术棒 → Target选项卡,勾选:UseMicro LIB,即可避免半主机模式。

虽然微库法实现简单,但是某些标准 C 库函数运行慢、兼容性差。
-
方法二:代码法(√)
( 1 个预处理、2 个定义、3 个函数)(大概了解就行,不用深入探究)
#pragma import(__use_no_semihosting),确保不从 C 库中使用半主机函数- 定义
__FILE结构体,避免 HAL 库某些情况下报错 - 定义
FILE__stdout,避免编译报错 - 实现
_ttywrch、_sys_exit和_sys_command_string等三个函数
正点原子的
usart.c文件里已经内置了代码法(不过下面是针对编译器 AC5 的,只做参考,实际应用中要去复制新代码):// ------加入以下代码,支持printf函数,而不需要选择use MicroLIB------ #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } #endif虽然代码法稍微复杂,但是标准 C 库函数运行快、兼容性好。
2. 实现 fputc 函数(重定向到 USART1 )
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0); // 等待上一个字符发送完成 USART1->DR = (u8) ch; // 将要发送的字符 ch 写入到 DR 寄存器return ch;
}
其中 SR 是 USART1 的状态寄存器,其位 6 是发送完成标志位,0 表示未完成,1 表示完成;
其中 DR 是 USART1 的数据寄存器,用于存储要发送的字符(8 位)。
