OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6406|回复: 5

求助关于3.5库函数中对GPIOA地址传入的理解

[复制链接]

9

主题

23

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-1-5
在线时间
4 小时
发表于 2013-1-11 23:23:47 | 显示全部楼层 |阅读模式

在3.5库中有这样一句话GPIO_Init(GPIOA, &GPIO_InitStructure);
有人说 是:调用GPIO_Init函数,并将STM32微控制器的GPIOA设备地址和所定义的结构体变量GPIO_InitStructure的地址传入。
但是 我看啦一下  GPIOA是个(GPIO_TypeDef )结构体类型 其中有 ( CRL;CRH;IDR;ODR;BSRR;BRR;LCKR; )7个成员!(为什么没有分别对成员赋值,库函数里面好像直接就是对GPIOA=GPIOA_BASE = 0x40000000 + 0x10000 + 0x0800);
然后就在GPIO_Init()函数里调用GPIOx->CRL;
例如 if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
  {
    tmpreg = GPIOx->CRL;

请问 他是怎么对(GPIO_TypeDef )中7个成员赋值的?
谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-12 00:17:12 | 显示全部楼层
GPIO_Init()
完整代码,你看看,别截图一部分.
肯定是有赋值的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

23

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-1-5
在线时间
4 小时
 楼主| 发表于 2013-1-12 00:54:10 | 显示全部楼层
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
  uint32_t tmpreg = 0x00, pinmask = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); 
 
/*---------------------------- GPIO Mode Configuration -----------------------*/
  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
  {
    /* Check the parameters */
    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
    /* Output mode */
    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
  }
/*---------------------------- GPIO CRL Configuration ------------------------*/
  /* Configure the eight low port pins */
  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
  {
    tmpreg = GPIOx->CRL;//这里 怎么就提取CRL的值啦!!
    for (pinpos = 0x00; pinpos < 0x08; pinpos++)
    {
      pos = ((uint32_t)0x01) << pinpos;
      /* Get the port pins position */
      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
      if (currentpin == pos)
      {
        pos = pinpos << 2;
        /* Clear the corresponding low control register bits */
        pinmask = ((uint32_t)0x0F) << pos;
        tmpreg &= ~pinmask;
        /* Write the mode configuration in the corresponding bits */
        tmpreg |= (currentmode << pos);
        /* Reset the corresponding ODR bit */
        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << pinpos);
        }
        else
        {
          /* Set the corresponding ODR bit */
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
          }
        }
      }
    }
    GPIOx->CRL = tmpreg;
  }
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-12 02:02:21 | 显示全部楼层
回复【3楼】bigwudan:
---------------------------------
读取之前的设置,然后改变要修改的位.再写入新的值.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

23

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-1-5
在线时间
4 小时
 楼主| 发表于 2013-1-12 12:10:20 | 显示全部楼层
谢谢!你的讲解!但是我就是不明白!GPiox–>CRL是怎么和GPIOA地址建立联系的!也就是说我用GPIOX->CRL,库函数就知道代表什么?!我看啦GPIOX的结构体的!就是这点不明白!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-12 14:17:03 | 显示全部楼层
回复【5楼】bigwudan:
---------------------------------
GPIOX结构体里面就有GPIO->CRL。
库函数最终都是要操作寄存器实现的,这个是无疑的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 11:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表