正点原子学习笔记
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函数即可文章来源:https://www.toymoban.com/news/detail-727526.html
fputc函数介绍
USART1->SR&0X40 当上一帧发送完成后,位6(TX=1)
USART1->DR =(u8) ch; 将要发送的字符ch写入到DR寄存器
文章来源地址https://www.toymoban.com/news/detail-727526.html
到了这里,关于STM32使用printf函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!