STM32 B-L475E-IOT01A2开发板UART串口打印无输出问题排查
STM32 B-L475E-IOT01A2 UART串口无输出问题排查
问题描述
使用STM32 B-L475E-IOT01A2开发板,尝试通过UART串口打印数据,程序编译正常且LED测试验证功能正常,但串口无任何输出(使用screen /dev/ttyACM0 9600命令测试)。工程代码大部分由CubeMX自动生成,相关代码如下:
usart.c 代码
/** file: usart.c **/ void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /** Initializes the peripherals clock */ PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; 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_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ } }
main.c 代码
/** file: main.c **/ int main(void) { HAL_UART_MspInit(&huart1); MX_USART1_UART_Init(); while(1) { HAL_UART_Transmit(&huart1, (uint8_t *)"Testing 123", 11, 100); HAL_Delay(1000); } }
排查与修复方案
1. 修正初始化顺序与缺失的系统初始化
标准CubeMX生成的工程中,main函数必须包含系统初始化流程,且无需手动调用HAL_UART_MspInit(HAL_UART_Init内部会自动调用该函数完成硬件层初始化)。修改后的main.c应如下:
/** file: main.c **/ int main(void) { // 初始化HAL库 HAL_Init(); // 配置系统时钟(CubeMX自动生成的函数,必须调用) SystemClock_Config(); // 初始化USART1,无需手动调用HAL_UART_MspInit MX_USART1_UART_Init(); while(1) { HAL_UART_Transmit(&huart1, (uint8_t *)"Testing 123", 11, 100); HAL_Delay(1000); } }
如果工程中没有SystemClock_Config()函数,需要重新通过CubeMX生成工程时正确配置系统时钟,或手动添加该函数(确保与CubeMX配置一致)。
2. 确认板载USB转串口对应的UART外设
B-L475E-IOT01A2开发板的板载USB转串口芯片(ST-Link虚拟串口)默认映射到LPUART1(PB6/PB7),而非USART1。如果使用USART1,需要额外外接USB转串口模块连接PA9/PA10引脚,或在CubeMX中重新配置ST-Link虚拟串口对应的UART为USART1。
3. 添加发送状态检查
在HAL_UART_Transmit调用后添加返回值判断,可快速定位发送是否成功:
while(1) { HAL_StatusTypeDef tx_status = HAL_UART_Transmit(&huart1, (uint8_t *)"Testing 123", 11, 100); if(tx_status != HAL_OK) { // 可通过LED闪烁等方式标记发送失败 for(uint8_t i=0; i<3; i++) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(200); } } HAL_Delay(1000); }
4. 调整GPIO拉电阻配置
如果外接USB转串口模块,可尝试将TX引脚的拉电阻改为GPIO_PULLUP:
GPIO_InitStruct.Pull = GPIO_PULLUP;
部分串口接收端需要上拉才能稳定接收信号。
内容的提问来源于stack exchange,提问作者richbai90
相关产品推荐
相关产品推荐

