打印
[其他ST产品]

stm32怎么用printf函数?

[复制链接]
401|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2023-9-14 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。
下面就说一下使用printf需要做哪些配置。
有两种配置方法:
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义函数 如下:
// 发送数据
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
// 接收数据
int GetKey (void)
{
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”
MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。
至此完成配置,在工程中可以随意使用printf向串口发送数据了。
二、第二种方法是在工程中添加“Regtarge.c”文件
1、在main文件中包含 “stdio.h” 文件
2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中
在文件中输入如下内容(直接复制即可)
#include
#include <rt_misc.h>
#pragma import(__use_no_semihosting_swi)
extern int SendChar(int ch); // 声明外部函数,在main文件中定义
extern int GetKey(void);
struct __FILE
{
int handle; // Add whatever you need here
};
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
return (SendChar(ch));
}
int fgetc(FILE *f)
{
return (SendChar(GetKey()));
}
void _ttywrch(int ch)
{
SendChar (ch);
}
int ferror(FILE *f)
{ // Your implementation of ferror
return EOF;
}
void _sys_exit(int return_code)
{
label: goto label; // endless loop
}
3、在main文件中添加定义以下两个函数
int SendChar (int ch)
{
while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口
USART1->DR = (ch & 0x1FF);
return (ch);
}
int GetKey (void)
{
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
至此完成配置,可以在main文件中随意使用 printf 。

使用特权

评论回复
沙发
MessageRing| | 2023-9-14 22:42 | 只看该作者
AC6可以用吗

使用特权

评论回复
板凳
AloneKaven| | 2023-9-20 23:58 | 只看该作者

AC6需要修改几个地方

使用特权

评论回复
地板
jcky001| | 2023-9-21 15:10 | 只看该作者
1.在项目中包含<stdio.h>头文件,该文件中包含了printf函数的声明。

2.在项目中定义一个printf函数,可以使用STM32标准库中的HAL_UART_Transmit函数来实现。例如:

c
int fputc(int ch, FILE *f)  
{  
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);  
    return ch;  
}
其中,huart1是UART1的句柄,用于传输数据。

3.在main函数中调用printf函数即可。例如:

c
int main(void)  
{  
    printf("Hello, World!\n");  
    return 0;  
}
注意:使用printf函数时需要注意输出格式,避免使用浮点数等过于复杂的格式,以免影响性能。

使用特权

评论回复
5
童雨竹| | 2024-9-11 08:18 | 只看该作者

电路的结构类似于全桥式,只是把其中的两只开关管(T3、T4)换成了两只等值大电容C1、C2。

使用特权

评论回复
6
Wordsworth| | 2024-9-11 09:21 | 只看该作者

通过对于PCB电路板边缘的孔或通孔做电镀石墨化

使用特权

评论回复
7
Clyde011| | 2024-9-11 10:24 | 只看该作者

根据这些指标,测试员可以评估电源的性能和可靠性。

使用特权

评论回复
8
公羊子丹| | 2024-9-11 11:17 | 只看该作者

脉冲变压器磁能被积累的问题容易解决,

使用特权

评论回复
9
万图| | 2024-9-11 12:20 | 只看该作者

在PCB组装过程中通常使用两种类型的技术

使用特权

评论回复
10
Uriah| | 2024-9-11 13:23 | 只看该作者

一般PCB是V-CUT,

使用特权

评论回复
11
帛灿灿| | 2024-9-11 15:19 | 只看该作者

由于共模电流的同向性,会在线圈内产生同向的磁场而增大线圈的感抗

使用特权

评论回复
12
Bblythe| | 2024-9-11 16:22 | 只看该作者

在板的边缘上照常制作整个电镀通孔。

使用特权

评论回复
13
周半梅| | 2024-9-11 18:18 | 只看该作者

在交流电频率一定情况下,电感量越大,其对交流电阻碍能力越大

使用特权

评论回复
14
Pulitzer| | 2024-9-11 19:21 | 只看该作者

然后焊接到更大的PCB上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

966

主题

2956

帖子

7

粉丝