[其他ST产品] 基于STM32CUBEMX配置printf经验分享

[复制链接]
1131|19
 楼主| 豌豆爹 发表于 2023-4-10 10:26 | 显示全部楼层 |阅读模式
概述
    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。

生成例程
    这里准备了GD32303C_START开发板进行验证。



printf()函数
    printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf(“<式样化字符串>”,<参数表>);
    其中式样化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出;另一部分是式样化规定字符, 以"%“开端, 后跟一个或几个规定字符, 用来确定输出内容式样。参量表是需求输出的一系列参数, 其个数务必与式样化字符串所阐明的输出参数个数一样多, 各参数之间用英文逗号”,"分开, 且顺序逐一对应, 不然将会出现意想不到的错误。
    注意:函数printf从右到左压栈,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的。

STM32CUBEMX配置
  


 楼主| 豌豆爹 发表于 2023-4-10 10:26 | 显示全部楼层
keil配置
    microlib 进行了高度优化以使代码变得很小。它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。


代码
    在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。
  • /* USER CODE BEGIN Includes */
  • #include "stdio.h"
  • /* USER CODE END Includes */

复制代码


    函数声明和串口重定向:
  • /* USER CODE BEGIN PFP */
  • void uart1_data(void);          //接收函数
  • #ifdef __GNUC__                  //串口重定向
  • #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  • #else
  • #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  • #endif
  • PUTCHAR_PROTOTYPE
  • {
  •     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
  •     return ch;
  • }
  • /* USER CODE END PFP */

复制代码


    printf()打印。
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •     /* USER CODE END WHILE */
  •     /* USER CODE BEGIN 3 */
  •     printf("串口打印例程\r\n");
  •     HAL_Delay(1000);
  •   }
  •   /* USER CODE END 3 */

复制代码



Bowclad 发表于 2023-4-10 22:56 | 显示全部楼层
还是重写putchar啊
Undshing 发表于 2023-4-11 21:40 | 显示全部楼层
Bowclad 发表于 2023-4-10 22:56
还是重写putchar啊

printf就是用putchar实现的
jtracy3 发表于 2023-5-10 20:27 | 显示全部楼层
printf函数和scanf函数是“标准函数接口”。
claretttt 发表于 2023-5-11 15:42 | 显示全部楼层
在使用printf函数前需要进行相应的配置和初始化。
averyleigh 发表于 2023-5-11 16:14 | 显示全部楼层
如何用printf 打印出十六进制数?
macpherson 发表于 2023-5-11 17:27 | 显示全部楼层
printf函数是C语言标准库函数之一,在输出到串口、LCD等外设时十分方便。
elsaflower 发表于 2023-5-11 18:04 | 显示全部楼层
printf速度慢是因为一个字节占据的时间太长了。
pl202 发表于 2023-5-11 18:38 | 显示全部楼层
printf()之类的函数,使用了半主机模式。
qiufengsd 发表于 2023-5-11 18:46 | 显示全部楼层
printf 实际上是连续调用 fputc 来输出每一个字符的
1988020566 发表于 2023-5-11 19:31 | 显示全部楼层
有串口初始化的例程。               
jtracy3 发表于 2023-5-11 20:28 | 显示全部楼层
STM32为什么要用重定向printf来打印串口数据?
plsbackup 发表于 2023-5-11 20:53 | 显示全部楼层
Generation 选择 UseMicroLIB。 即可使用printf进行串口输出。
uptown 发表于 2023-5-11 20:59 | 显示全部楼层
printf就是单片机STM32用来打印调试信息的函数,底层调用串口驱动发送。
belindagraham 发表于 2023-5-11 21:55 | 显示全部楼层
需要配置USART或UART的相关寄存器,使其能够正常工作。然后,将USART或UART与printf函数关联起来,实现printf函数输出内容到串口或其他外设中。
Jacquetry 发表于 2023-5-11 22:53 | 显示全部楼层
是不是串口初始化的问题
dspmana 发表于 2023-5-18 17:18 | 显示全部楼层
stm32串口printf程序中怎么换行
zerorobert 发表于 2023-5-21 13:32 | 显示全部楼层
stm32串口printf程序中怎么换行
公羊子丹 发表于 2024-5-21 08:09 | 显示全部楼层

发射出过量的电磁干扰(EMI)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

534

主题

2361

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部