[其他ST产品] stm32怎么用printf函数?

[复制链接]
782|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函数时需要注意输出格式,避免使用浮点数等过于复杂的格式,以免影响性能。
童雨竹 发表于 2024-9-11 08:18 | 显示全部楼层

电路的结构类似于全桥式,只是把其中的两只开关管(T3、T4)换成了两只等值大电容C1、C2。
Wordsworth 发表于 2024-9-11 09:21 | 显示全部楼层

通过对于PCB电路板边缘的孔或通孔做电镀石墨化
Clyde011 发表于 2024-9-11 10:24 | 显示全部楼层

根据这些指标,测试员可以评估电源的性能和可靠性。
公羊子丹 发表于 2024-9-11 11:17 | 显示全部楼层

脉冲变压器磁能被积累的问题容易解决,
万图 发表于 2024-9-11 12:20 | 显示全部楼层

在PCB组装过程中通常使用两种类型的技术
Uriah 发表于 2024-9-11 13:23 | 显示全部楼层

一般PCB是V-CUT,
帛灿灿 发表于 2024-9-11 15:19 | 显示全部楼层

由于共模电流的同向性,会在线圈内产生同向的磁场而增大线圈的感抗
Bblythe 发表于 2024-9-11 16:22 | 显示全部楼层

在板的边缘上照常制作整个电镀通孔。
周半梅 发表于 2024-9-11 18:18 | 显示全部楼层

在交流电频率一定情况下,电感量越大,其对交流电阻碍能力越大
Pulitzer 发表于 2024-9-11 19:21 | 显示全部楼层

然后焊接到更大的PCB上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1031

主题

3946

帖子

7

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