skw168 发表于 2022-5-24 09:46

STM32 GPIO_Init函数为什么传入的是结构体指针而不是变量

本帖最后由 skw168 于 2022-5-24 09:46 编辑

STM32 固件库GPIO初始化函数void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

1.此函数的形式参数中,为什么传入的是GPIO_InitTypeDef* GPIO_InitStruct指针,而不是结构体变量;
因为我感觉传入GPIO_InitTypeDef变量也能完成同样的功能

函数调用:      GPIO_Init(AMP_PORT, &GPIO_InitStructure);      

函数原型:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;

/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));

/*-------------------------- Configure the port pins -----------------------*/
/*-- GPIO Mode Configuration --*/
for (pinpos = 0x00; pinpos < 0x10; pinpos++)
{
    pos = ((uint32_t)0x01) << pinpos;

    /* Get the port pins position */
    currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;

    if (currentpin == pos)
    {
      if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
      {
      /* Check Speed mode parameters */
      assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

      /* Speed mode configuration */
      GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
      GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));

      /* Check Output mode parameters */
      assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));

      /* Output mode configuration */
      GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos));
      GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
      }

      GPIOx->MODER&= ~(GPIO_MODER_MODER0 << (pinpos * 2));

      GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));

      /* Pull-up Pull down resistor configuration */
      GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
      GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
    }
}
}

elec0010 发表于 2022-5-24 10:02

结构体传指针,速度非常快,传内容需要额外的复制开销

zwsam 发表于 2022-5-25 08:59

学习了!
页: [1]
查看完整版本: STM32 GPIO_Init函数为什么传入的是结构体指针而不是变量