You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:10:31