您的位置:首页 > 其它

stm32库函数GPIO_PinRemapConfig分析

2013-09-12 16:01 183 查看
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)

{

  uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_REMAP(GPIO_Remap));//检测传递参数是否有效

  assert_param(IS_FUNCTIONAL_STATE(NewState));  //同上

  
  if((GPIO_Remap & 0x80000000) == 0x80000000)//判断GPIO_Remap范围

  {

    tmpreg = AFIO->MAPR2;//大容量的芯片扩展GPIO_Remap

  }

  else

  {

    tmpreg = AFIO->MAPR;//基本GPIO_Remap

  }

  tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10;//以USART3为例(0x00140010&0x000F0000)>>0x10等于0x00000004,有寻找(有2个控制位的)USART3-REMAP在AFIO_MAPR的位置作用

  tmp = GPIO_Remap & LSB_MASK;//有寻找(有1个控制位的)在AFIO_MAPR的位置作用

  if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK))

//串行线JTAG配置

  {

    tmpreg &= DBGAFR_SWJCFG_MASK;//将要配置的内容赋值给变量tmpreg

    AFIO->MAPR &= DBGAFR_SWJCFG_MASK;//将SWJ_CFG控制位清零

  }
  else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK)

//配置有两个控制位复用重映射

  {

    tmp1 = ((uint32_t)0x03) << tmpmask;//找到要配置的位

    tmpreg &= ~tmp1;//将要配置的内容赋值给变量tmpreg

    tmpreg |= ~DBGAFR_SWJCFG_MASK;//保留SWJ_CFG的控制位后的tmpreg

  }
  else

//配置有1个控制位复用重映射

  {

    tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10));//将要配置的内容赋值给变量tmpreg

    tmpreg |= ~DBGAFR_SWJCFG_MASK;//保留SWJ_CFG的控制位后的tmpreg

  }

  if (NewState != DISABLE)

  {

    tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10));//使能或失能某个外设的重映射

  }

  if((GPIO_Remap & 0x80000000) == 0x80000000)

  {

    AFIO->MAPR2 = tmpreg;

  }

  else

  {

    AFIO->MAPR = tmpreg;//将配置内容写到AFIO_MAPR寄存器中

  }  
}

新手第一次写博客,内容简介,分析不够深入,请见谅!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32