[应用相关] 指针和地址求解释

[复制链接]
1134|6
 楼主| lefeng 发表于 2017-3-29 20:45 | 显示全部楼层 |阅读模式
gp, GPIO, IO, pi, se
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  
  switch (*(uint32_t*)&GPIOx)
  {
    case GPIOA_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
      break;.....
不明白switch行中GPIOx为什么要取址,GPIOx本来不就是地址么?
#define GPIOA    ((GPIO_TypeDef*)GPIOA_BASE)
求解释
lwsn 发表于 2017-3-29 21:10 | 显示全部楼层
用一个例子来表示:GPIOX本身代表的是一个房子,而取他的指针则是说这个房子的地址,当然还要取里面存的值的话就相当如放在这个房子里面的东西了。
豆腐块 发表于 2017-3-29 21:22 | 显示全部楼层
楼主不要随便拿来一段代码就学习或者参考,要学习好的代码才有意义,其实那一堆迷惑人的符号,完全没啥意义,为啥不这样写?:
switch ((uint32_t)GPIOx)
可可球 发表于 2017-3-29 21:31 | 显示全部楼层
地址是没错,但是地址的类型不一样,一个是GPIO_TypeDef*的 一个是uint32_t*的,其内存模型是不一样的,下面的使用需要强制转换才能和下面的case里面的GPIOA_BASE的数据类型匹配!
Levenburg 发表于 2017-3-29 21:49 | 显示全部楼层
楼上说的有道理,GPIO_DeInit(GPIO_TypeDef * GPIOx)定义了GPIOx为指向一块连续的内存,但GPIOx本身指向这块内存的首地址,和case后的类型也是一致的。
Thorald 发表于 2017-3-29 22:00 | 显示全部楼层
GPIOx类型转换应该是switch((uint32_t*)*&GPIOx)这个才和下面类型一致,switch (*(uint32_t*)&GPIOx)
这样不是把GPIOx的地址转换成uint32_t类型了么?
戈卫东 发表于 2017-3-30 06:15 | 显示全部楼层
很丑陋很笨重的搞法啊。
我反对ST库的原因之一啊。(其实我不用ST库的主要原因是自己懒。。。。。懒得去看它)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

1087

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部