stm32库函数GPIO_PinRemapConfig分析

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寄存器中
  }  

}


新手第一次写博客,内容简介,分析不够深入,请见谅!


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值