STM429HAL库函数,如果使用两个USART或两个SPI,其对应的底层MSP初始化函数怎么定义?怎么解决两个MSP初始化函数重复定义?
3条回答 默认 最新
- li.siyuan 2023-03-15 15:36关注
在 STM32 HAL 库中,对于不同的外设,每个外设都有对应的初始化函数。对于 USART 和 SPI 这样的外设,如果使用多个相同类型的外设,需要分别调用它们各自的初始化函数。
在初始化函数中,通常会初始化外设的时钟、引脚、模式等参数。如果使用多个相同类型的外设,每个外设的初始化参数可能会不同。因此,需要为每个外设分别定义一个初始化函数,并在初始化时传入相应的参数。
当使用多个相同类型的外设时,可能会出现重复定义的问题。为了解决这个问题,可以使用 static 关键字来限制初始化函数的作用域,使得它只在当前文件中可见。这样,不同的文件可以分别定义各自的初始化函数,不会互相干扰。
例如,假设我们有两个 USART 外设,分别是 USART1 和 USART2。在初始化时,需要分别调用 HAL_UART_Init 函数,并传入相应的参数。为了避免重复定义问题,我们可以在不同的文件中分别定义这两个初始化函数,并使用 static 关键字来限制它们的作用域。例如:
// usart1.c 文件 #include "usart.h" static void USART1_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); /* GPIO clock enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* USART1 GPIO configuration */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); } void USART1_Init(void) { UART_HandleTypeDef huart; /* USART1 configuration */ huart.Instance = USART1; huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; /* USART1 MSP initialization */ USART1_MspInit(&huart); /* USART1 initialization */ HAL_UART_Init(&huart); }
// usart2.c 文件 #include "usart.h" static void USART2_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USART2 clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); /* GPIO clock enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* USART2 GPIO configuration */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用