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

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

@@ Author:明月清了个风

@@ Date: 2025/9/9

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

内容结构如下:

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

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

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

c 复制代码
setvbuf(stdout, NULL, _IONBF, 0);

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

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

c 复制代码
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);
}
相关推荐
FakeOccupational12 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
殷忆枫13 小时前
基于K210与STM32的智能垃圾分类与物联网监管系统
stm32·物联网·分类
周洲083013 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元13 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡14 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
z203483152015 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
国科安芯17 小时前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构
ACP广源盛1392462567317 小时前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
Dr.kangder18 小时前
嵌入式面试总结(十四)——中断处理
单片机·面试·职场和发展·架构·硬件架构·嵌入式
振南的单片机世界18 小时前
硬核菊花链:3个GPIO+无限74HC595=端口扩展“无限套娃”
arm开发·stm32·单片机·嵌入式硬件