STM32初始化串口重定向后printf调试信息不输出的难题

news/2025/9/21 21:38:43/文章来源:https://www.cnblogs.com/wzzkaifa/p/19104221

STM32初始化串口重定向后调试信息不输出的问题

@@ Author:明月清了个风

@@ Date: 2025/9/9

@@ PS:开发stm32F745的过程中发现printf有时候不打印信息,单独调试确定了串口初始化和重定向正确,但是在系统整体调试的时候虽然正确运行了却没有打印,通过使用本文所记录的方法暂时解决,但并不确定是否是最正确的解决方案,记录一下以供参考

内容结构如下:

  1. 问题现象及最终解决方法

一.问题现象及最终解决方法

现象如简介所述,确认初始化正确,重定向正确,资源分配正确,解决方法如下,在初始化时加入这行代码

setvbuf(stdout, NULL, _IONBF, 0);

表示无缓冲输出,但会增加系统调用的次数

下面贴出串口的初始化代码,应该没有错误

void hal_debug_usart_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0
};
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
// debug串口3时钟源配置
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3;
RCC_PeriphClkInit.Usart1ClockSelection = RCC_USART3CLKSOURCE_SYSCLK;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
// 使能串口3时钟
DEBUG_USART_CLK_ENABLE();
// 使能串口3引脚时钟---GPIOC
DEBUG_USART_RX_GPIO_CLK_ENABLE();
DEBUG_USART_TX_GPIO_CLK_ENABLE();
// 串口3收发引脚配置
GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN | DEBUG_USART_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
HAL_GPIO_Init(DEBUG_USART_PORT, &GPIO_InitStruct);
// 配置串口3模式
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart3);
HAL_NVIC_SetPriority(USART3_IRQn, 9, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);
}
void hal_debug_usart_dma_init(void)
{
DEBUG_USART_DMA_CLK_ENABLE();
/* DMA interrupt init */
/* 串口3---DMA1-STREAM1接收 */
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 10, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
/* 串口3---DMA1-STREAM3发送 */
HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 10, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
hdma_usart3_rx.Instance = DMA1_Stream1;
hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;
hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart3_rx.Init.Mode = DMA_NORMAL;
hdma_usart3_rx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_DeInit(&hdma_usart3_rx);
HAL_DMA_Init(&hdma_usart3_rx);
__HAL_LINKDMA(&huart3, hdmarx, hdma_usart3_rx);
hdma_usart3_tx.Instance = DMA1_Stream3;
hdma_usart3_tx.Init.Channel = DMA_CHANNEL_4;
hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart3_tx.Init.Mode = DMA_NORMAL;
hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_DeInit(&hdma_usart3_tx);
HAL_DMA_Init(&hdma_usart3_tx);
__HAL_LINKDMA(&huart3, hdmatx, hdma_usart3_tx);
}
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return (ch);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法随笔(一) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

some

https://www.cnblogs.com/binomial-kimi/p/19104225##666 888 888 888 666 114514

5. 二叉树

2 题目二2.1 判断二叉树是否是搜索二叉树(中序遍历判断是否升序 / 模板套用)2.2 判断二叉树是否是完全二叉树(宽度优先遍历)2.3 判断二叉树是否是满二叉树!!! 树型 DP 问题 !!! 2.4 判断二叉树是否是平衡二叉树(形…

fastapi-langgraph

fastapi-langgraph https://github.com/fanqingsong/fastapi-langgraphFastAPI LangGraph Agent TemplateA production-ready FastAPI template for building AI agent applications with LangGraph integration. This…

学python的第7天

学python的第7天列表类型的内置方法 1.用途:多个装备、多个爱好、多门课程,甚至是多个女朋友 2.定义:[]内可以有多个任意类型的值,逗号分隔元素 # my_girl_friend = list([jason,tank,sean]) my_girl_friend = [ja…

Revit二次开发环境配置

# 文章概述 你是否刚接触 Revit 二次开发,面对复杂的开发环境无从下手? 你是否想快速实现一个带交互对话框的插件,却不知从何调用 TaskDialog? 你是否部署插件时频频失败,搞不清 .addin 文件怎么写、插件为何不加…

CF1016G Appropriate Team

首先一个结论是:只有在 \(Y \bmod X =0\) 时,才有答案。 证明显然,因为 \(\gcd\) 和 \(\operatorname{lcm}\) 的性质,\(a_i\) 和 \(v\) 是 \(X\) 的倍数,\(a_j\) 和 \(v\) 是 \(Y\) 的因数。 那么接下来,因为 \(…

CF494C Helping People

CF494C Helping People 看到保证区间不会交错,没想出来这个性质是干什么的,看了题解才知道,这说明区间之间只会互相包含。 那么我们就可以为每个区间指定一个 \(fa\) 区间来代表最小的包含它的区间,不难发现这构成…

深入解析:Extract Chart Data Directly to Excel

深入解析:Extract Chart Data Directly to Excelpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

AOSP Android12 Source 下载同步

获取Repo工具并配置镜像地址 curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo chmod a+x ~/bin/repo export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/初始化仓库并指定…

02020404 EF Core基础04-自增主键、Guid主键、混合自增、Hi/Lo算法、Migration深入、数据库其它迁移命令

02020404 EF Core基础04-自增主键、Guid主键、混合自增、Hi/Lo算法、Migration深入、数据库其它迁移命令 1. 主键无小事(视频3-6) 1.1 自增主键 1、EF Core支持多种主键生成策略:自动增长;Guid;Hi/Lo算法等。 2、…

02020403 EF Core基础03-Fluent API、Data Annotation、两种配置的选择

02020403 EF Core基础03-Fluent API、Data Annotation、两种配置的选择 1. FluentAPI哪些不该用(视频3-4) 1.1 约定配置 主要规则: 1:表名采用DbContext中的对应的DbSet的属性名。 2:数据表列的名字采用实体类属性…

深入解析:Python(1)|| 超基础语法(格式,输入输出,变量,字符串,运算符)

深入解析:Python(1)|| 超基础语法(格式,输入输出,变量,字符串,运算符)2025-09-21 21:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflo…

深入解析:STM32-FreeRTOS操作系统-任务管理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java中异步任务的执行方式有几种?

在Java中,异步任务的执行方式有多种,每种方式适用于不同的场景和需求。以下是常见的几种实现方式:Thread类 最基础的方式是直接使用Thread类创建线程执行任务:new Thread(() -> {// 异步执行的任务System.out.p…

mysql数据库自增ID为int类型超过范围

mysql数据库自增ID为int类型超过范围mysql数据的自增加的id(int)类型,超过范围:数据自增加ID,为int类型,超过范围,就插入数据库失败;怎么解决? 由于数据比较大, 1.第一个简单粗暴:把int变为(BIGINT)不用迁…

202508_浙江省网络安全测试职业职工技能竞赛_misc-1

流量分析,RE,XORTags:流量分析,RE,XOR 0x00. 题目 你是一名资深的网络安全分析取证师,受命调查一家IT公司近期遭遇的一起严重网络安全事件。 该公司主要业务是为中小型企业提供定制化管理系统和数据分析服务。 由…

python爬虫测试

python爬虫测试0.背景:要下合适自己的驱动,不然都是报错!!你需要完成以下两步:检查你的 Chrome 浏览器版本。打开 Chrome,在地址栏输入 chrome://settings/help。 你会看到你的 Chrome 版本号,例如 版本 120.0.…

广二联考题解补全计划:

第十七套: T1:取模性质,倍增 T2: DP优化,状态优化 T3:容斥原理,数位DP T1: 首先先提一个关于取模的性质,一个数对一个比它小的数取模,大小一定减半,考虑对 $ \frac {n}{2}$ 分治即可。 我们先预处理出来每个数…