STM32引脚复用功能详解(标准库、LL库、HAL库对比)

STM32的(标准库、LL库、HAL库)引脚复用功能(以GPIO输出PWM为例)
前言:STM32的GPIO引脚工作模式上拉输入、浮空输入、模拟输入、下拉输入,输出有推挽输出、开漏输出、复用推挽、复用开漏,此次详细描述复用推挽以及复用开漏模式。
IO引脚内部详解
IO引脚控制内部框图

  • 当普通IO引脚输出、输入时,就是使用输出控制寄存器、输入控制寄存器控制IO引脚输出高电平,输入读取引脚电平。当PWM模式控制GPIO引脚输出PWM波时,已经转换为片上外设来控制GPIO输出高低电平,如上图所示,就要使用复用功能输出,此时使用复用推挽或者复用开漏输出,才能转为片上外设控制,同理,当IO引脚使用ADC采集功能,IO引脚就要使用模拟输入,转换到片上外设ADC输入。此次以PWM模式控制GPIO输出为例进行讲解,暂不讨论输入。
  • 以F103C8讲解,PA0默认为IO引脚,使用复用默认功能TIM2_CH1(PWM模式),就要设置引脚输出模式为复用推挽。才能将IO引脚转为片上外设TIM2控制。由TIM2控制输出PWM
    PWM的基本结构
  • 由PWM模式配置基本结构可知,引脚复用成PWM模式,就要进行如下步骤:
    1.时基单元
    2.输出比较单元
    3.GPIO配置
    4运行控制
    分别对应标准库:(使用PA0引脚,TIME2定时器)
    1.TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //时基单元
    2.TIM_OC3Init(TIM2, &TIM_OCInitStructure); //输出比较单元
    3.GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIO配置
    4.TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行//运行控制
    HAL库
    1.HAL_TIM_Base_Init(&htim2);//时基单元
    2.HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);//输出比较单元
    3. HAL_GPIO_Init(MCO1_GPIO_PORT, &gpio);//GPIO配置
    4.HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//运行控制
  •     gpio.Mode      = GPIO_MODE_AF_PP;//复用推挽输出功能
            gpio.Speed     = GPIO_SPEED_FREQ_HIGH;//引脚速度快速
           gpio.Pull      = GPIO_NOPULL;
      gpio.Pin       = MCO1_PIN;
    
      /* MCO1 Clock Enable */
      MCO1_CLK_ENABLE();
    
      HAL_GPIO_Init(MCO1_GPIO_PORT, &gpio);
    
      /* Configure the MCO clock source */
      __HAL_RCC_MCO1_CONFIG(RCC_MCOSource, RCC_MCODiv);
    

    LL库对应设置如下:

    1. LL_TIM_Init(TIM2, &TIM_InitStruct);//时基单元
    2. LL_TIM_OC_Init(TIM2, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);//输出比较
    3. LL_GPIO_Init(STM32_PWM_GPIO_Port, &GPIO_InitStruct);//GPIO配置
    4. LL_TIM_CC_EnableChannel(TIM2,LL_TIM_CHANNEL_CH1);
      LL_TIM_EnableCounter(TIM2);
      LL_TIM_EnableAllOutputs(TIM2);//运行控制
      GPIO_InitStruct.Pin = STM32_PWM_Pin;
      GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;//复用功能
      GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
      GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
      GPIO_InitStruct.Alternate = LL_GPIO_AF_2;//复用模式2
      LL_GPIO_Init(STM32_PWM_GPIO_Port, &GPIO_InitStruct);
    

    图片内容参考江协科技

    作者:@#~~孙

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32引脚复用功能详解(标准库、LL库、HAL库对比)

    发表回复