为什么 __HAL_RCC_USART1_CLK_ENABLE() 不被调用?

why __HAL_RCC_USART1_CLK_ENABLE() not be called?

我正在使用 STM32CUBEMX 生成代码。在STM32WB55的例子(Examples\UART\UART_Printf)中,我没有找到__HAL_RCC_USART1_CLK_ENABLE()。我很疑惑为什么不用开启USART1时钟,而需要开启GPIOB时钟?

static void MX_USART1_UART_Init(void)

{

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_ODD;

  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.Init.ClockPrescaler = UART_PRESCALER_DIV1;

  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {
    Error_Handler();
  }

  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)

  {
    Error_Handler();
  }

  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)

  {
    Error_Handler();
  }

  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)

  {
    Error_Handler();
  }

}

static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOB_CLK_ENABLE();

}

两次调用都是必要的。

__HAL_RCC_USART1_CLK_ENABLEHAL_UART_MspInit 调用(参见 stm32wbxx_hal_msp.c),后者又从 HAL_UART_Init

调用

这就是库和多维数据集示例的组织方式。更高级别的代码用指向外围实例的指针、基本初始化参数填充主描述符(在您的情况下为 huart1),并使用此描述符调用 Init 函数。 Init 函数执行寄存器初始化,但首先调用必须在应用程序代码中实现的 MspInit 函数。 MspInit 函数执行额外的初始化,如启用时钟、GPIO 配置等。所有不适合库代码的东西

默认情况下,

MspInit 也作为具有 weak 属性的空函数实现,这意味着任何其他实现都将覆盖默认值。