当前位置: 首页 > news >正文

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

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.jsqmd.com/news/1186/

相关文章:

  • 算法随笔(一) - 实践
  • some
  • 5. 二叉树
  • fastapi-langgraph
  • 第二周预习作业
  • 学python的第7天
  • Revit二次开发环境配置
  • CF1016G Appropriate Team
  • CF494C Helping People
  • 深入解析:Extract Chart Data Directly to Excel
  • AOSP Android12 Source 下载同步
  • 02020404 EF Core基础04-自增主键、Guid主键、混合自增、Hi/Lo算法、Migration深入、数据库其它迁移命令
  • 02020403 EF Core基础03-Fluent API、Data Annotation、两种配置的选择
  • 深入解析:Python(1)|| 超基础语法(格式,输入输出,变量,字符串,运算符)
  • 深入解析:STM32-FreeRTOS操作系统-任务管理
  • Java中异步任务的执行方式有几种?
  • mysql数据库自增ID为int类型超过范围
  • 202508_浙江省网络安全测试职业职工技能竞赛_misc-1
  • python爬虫测试
  • 广二联考题解补全计划:
  • 如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本 - 教程
  • Chapter 8 Contour / Shape Detection
  • 【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程
  • LeetCode 几道 Promises 和 Time 的题目 - 教程
  • [硬件电路-232]:FET(场效应管)的核心机制是通过栅极电压调控半导体“沟道“中的载流子浓度与分布,进而控制源极与漏极之间的电流大小 - 指南
  • java相关问题:面向对象入门2与类的识别
  • EXCEL自动调整列宽的快捷键
  • 【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践
  • 破解塔吊顶升高危难题!让事故率降 50%、审批快 70%
  • logicFlow________文档2