使用printf函数在STM32上进行调试输出

正点原子学习笔记

1,printf函数输出流程
2,printf的使用
3,printf函数支持

printf函数输出流程(C语言)

1)用户调用 printf()
2)编译器从stdio.h里解析
3)最终由fputc()实现输出

由此用户需要根据最终输出的硬件重新定义该函数,此过程称为:printf重定向

printf的使用

1,printf("Hello World!\r\n");
2,printf("%d\r\n",121);
                                                        常用输出控制符表

控制符 说明
%d 按十进制整数型数据的实际长度输出
%ld 输出长整型数据
%md m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出
%c 用来输出一个字符
%s 用来输出字符
%u 输出无符号整型(unsigned)
%f 输出实数,包括单精度和双精度,以小数形式输出
%x 以十六进制形式输出整数

                                                            常用转义字符表

控制符 说明
\r 回车,将当前位置移到本行开头
\n 换行,将当前位置移到下一行
\\ 代表一个反斜线字符
\' 代表一个单引号字符
\" 代表一个双引号字符
\? 代表一个问号
\0 空字符NULL
\t 水平制表(HT)(跳到下一个TAB位置)

printf函数支持

1,避免使用半主机模式                              两种方法:微库法、代码法
2,实现fputc函数                                        实现单个字符输出

半主机模式简介

用于ARM目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机
简单说:就是通过仿真器实现开发板在电脑上的输入和输出
一般我们:不使用半主机模式!!

方法一:微库法

 方法二:代码法       (推介)                 一个预处理、两个定义、三个函数

1,#pragma import(__use_no_semihosting),确保不从C库中使用半主机函数
2,定义:__FILE 结构体,避免HAL库某些情况下报错
3,定义:FILE__stdout,避免编译报错
4,实现:__ttywrch、_sys_exti 和 _sys_command_string 等三个函数

#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 

因特殊原因,不完善,但能用,正点原子提供

当使用微库法时,只需定义 fputc函数即可

fputc函数介绍

USART1->SR&0X40                 当上一帧发送完成后,位6(TX=1)
USART1->DR =(u8) ch;             将要发送的字符ch写入到DR寄存器
 

物联沃分享整理
物联沃-IOTWORD物联网 » 使用printf函数在STM32上进行调试输出

发表评论