STM32 printf 重定向 usart3

jiause

问题描述:

      今天调试串口,首先用串口1 printf打印输出,调试成功,在串口1成功的基础上,准备改用串口3 printf结果一直不成功。

串口没有一点反应。

解决过程:

        1.时钟问题 : USART1 和 USART3 挂接的时钟不同

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能GPIOB,USART3

       2.重定向函数 参考正点原子USART1

//加入代码,支持printf函数。并且不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要支持的函数            
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数
int fput
STM32 开发中,实现 `printf` 函数输出重定向的核心在于重写标准库中与输出相关的底层函数 `fputc`。标准库中的 `printf` 函数依赖于 `fputc` 来完成实际的输出操作。默认情况下,`fputc` 的输出目标是标准输出设备(如显示器),但在嵌入式系统中,通常需要将输出重定向到串口、LCD 或其他通信接口。 ### 重定向的基本原理 要实现 `printf` 的重定向,需要重写 `int fputc(int ch, FILE *f)` 函数,并将其绑定到特定的硬件接口。例如,若希望将输出通过串口发送,可以将 `fputc` 的实现修改为调用串口发送函数。 以下是一个将 `printf` 输出重定向到串口的示例代码: ```c #include <stdio.h> int __io_putchar(int ch) { // 假设使用 USART2 作为输出串口 while (!(USART2->SR & USART_SR_TXE)); // 等待发送缓冲区为空 USART2->DR = (ch & 0xFF); // 发送字符 return ch; } int fputc(int ch, FILE *f) { __io_putchar(ch); // 调用底层发送函数 return ch; } ``` 在上述代码中,`__io_putchar` 是一个用于发送字符的底层函数,而 `fputc` 是标准库中 `printf` 调用的函数。通过重写 `fputc`,可以将 `printf` 的输出重定向到指定的硬件接口。 ### 避免使用 Semihosting(半主机模式) 在某些开发环境中(如 Keil MDK),默认情况下可能会启用 Semihosting 模式来支持 `printf` 输出。然而,Semihosting 模式依赖于调试器,并且在实际运行时可能无法正常工作。因此,在重定向 `printf` 时,通常需要禁用 Semihosting 并确保 `fputc` 已被正确重写。 ### 应用场景 - **串口调试**:将 `printf` 输出重定向到串口,通过串口助手查看调试信息。 - **LCD 显示**:将 `printf` 输出重定向到 LCD 屏幕,用于显示调试信息或用户界面。 - **日志记录**:将 `printf` 输出重定向到 SD 卡或其他存储设备,用于记录系统运行日志。 ### 注意事项 - 重写 `fputc` 时,应确保底层硬件(如串口)已经正确初始化。 - 在多线程环境中,`fputc` 可能需要考虑线程安全问题。 - 若使用标准库的其他输入/输出函数(如 `scanf`),可能需要同时重写 `fgetc`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值