为什么 __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_ENABLE
从 HAL_UART_MspInit
调用(参见 stm32wbxx_hal_msp.c),后者又从 HAL_UART_Init
调用
这就是库和多维数据集示例的组织方式。更高级别的代码用指向外围实例的指针、基本初始化参数填充主描述符(在您的情况下为 huart1
),并使用此描述符调用 Init
函数。 Init
函数执行寄存器初始化,但首先调用必须在应用程序代码中实现的 MspInit
函数。 MspInit
函数执行额外的初始化,如启用时钟、GPIO 配置等。所有不适合库代码的东西
默认情况下,MspInit
也作为具有 weak
属性的空函数实现,这意味着任何其他实现都将覆盖默认值。
我正在使用 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_ENABLE
从 HAL_UART_MspInit
调用(参见 stm32wbxx_hal_msp.c),后者又从 HAL_UART_Init
这就是库和多维数据集示例的组织方式。更高级别的代码用指向外围实例的指针、基本初始化参数填充主描述符(在您的情况下为 huart1
),并使用此描述符调用 Init
函数。 Init
函数执行寄存器初始化,但首先调用必须在应用程序代码中实现的 MspInit
函数。 MspInit
函数执行额外的初始化,如启用时钟、GPIO 配置等。所有不适合库代码的东西
MspInit
也作为具有 weak
属性的空函数实现,这意味着任何其他实现都将覆盖默认值。