库函数 位屏蔽

2019-07-20 21:50发布

本帖最后由 1532512486 于 2016-6-2 23:07 编辑

GPIO_Initstructure.GPIO_Pin=GPIO_Pin_0;会不会影响之前GPIO_Initstructure.GPIO_Pin的值,库函数开发都不考虑位屏蔽吗??
是不是应该写成 GPIO_Initstructure.GPIO_Pin|=GPIO_Pin_0???


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zmingwang
1楼-- · 2019-07-21 01:06
这位同学,你都有这种疑问了,为什么不跟到GPIO_Init()这个函数中去看一眼呢
[mw_shl_code=c,true]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)
    {
      GPIOx->MODER  &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
      GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));

      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));
      }

      /* 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));
    }
  }
}
[/mw_shl_code]
注意看第13行有个运行16次的for循环,增量是pinpos,17行取了当前pin的掩码,19行判断是不是配置了当前pin,只有配置了的pin才进行功能设置.
也就是说,GPIO_Init这个函数,只会初始化你在GPIO_Pin中配置了的引脚,不会影响其他引脚.
jermy_z
2楼-- · 2019-07-21 05:24
 精彩回答 2  元偷偷看……
1532512486
3楼-- · 2019-07-21 08:45
zmingwang 发表于 2016-6-3 00:28
这位同学,你都有这种疑问了,为什么不跟到GPIO_Init()这个函数中去看一眼呢
[mw_shl_code=c,true]void GPIO ...

谢谢解答,,,,

一周热门 更多>