从前门 2023-03-15 15:27 采纳率: 100%
浏览 22
已结题

HAL库函数怎么初始化多个USART

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
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么