STM32初始化串口重定向后調試信息不輸出的問題
@@ Author:明月清了個風
@@ Date: 2025/9/9
@@ PS:開發stm32F745的過程中發現printf有時候不打印信息,單獨調試確定了串口初始化和重定向正確,但是在系統整體調試的時候雖然正確運行了卻沒有打印,通過使用本文所記錄的方法暫時解決,但并不確定是否是最正確的解決方案,記錄一下以供參考
內容結構如下:
- 問題現象及最終解決方法
一.問題現象及最終解決方法
現象如簡介所述,確認初始化正確,重定向正確,資源分配正確,解決方法如下,在初始化時加入這行代碼
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引腳時鐘---GPIOCDEBUG_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);
}