打印

关于switch (*(u32*)&GPIOx)

[复制链接]
4319|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lpdyd|  楼主 | 2008-3-29 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
李朋(554886913) 16:33:47
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
  switch (*(u32*)&GPIOx)
  {
    case GPIOA_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
      break;

    case GPIOB_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
      break;

    case GPIOC_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
      break;

    case GPIOD_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE);
      break;
      
    case GPIOE_BASE:
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE);
      RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE);
      break;            

    default:
      break;
  }
}

switch (*(u32*)&GPIOx)
这句我看不懂(可能c的基础不行)
李朋(554886913) 16:35:37
#define PERIPH_BASE           ((u32)0x40000000)

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
case GPIOA_BASE:中的
GPIOA_BASE应该就是(u32)0x40010800
switch (*(u32*)&GPIOx)为什么不能用switch ((u32)&GPIOx)呢?



还是刚才那个程序

switch语句

我觉得
首先GPIO_TypeDef* GPIOx ,
定义了结构体,
&GPIOx取其首地址,
(u32)&GPIOx作类型转换,
不行吗?
沙发
香水城| | 2008-3-29 18:27 | 只看该作者

看样子楼主C语言的功夫不到家呀

&GPIOx取其首地址,
(u32)&GPIOx作类型转换,


既然&GPIOx是结构体的地址,那么(u32)作类型转换则是把一个地址转成了u32,这算什么?

原来&GPIOx是结构体的地址,(u32*)把它转换成u32的地址,再取其指向的内容,刚好得到结构体的第一个分量。

使用特权

评论回复
板凳
luxinsun| | 2008-3-30 11:43 | 只看该作者

香版:果然是学计算机专业的,比我们这些电子专业的C强多

香版:果然是学计算机专业的,比我们这些电子专业的C强多了。

使用特权

评论回复
地板
lpdyd|  楼主 | 2008-3-30 18:49 | 只看该作者

再问

2楼: 看样子楼主C语言的功夫不到家呀 

&GPIOx取其首地址,
(u32)&GPIOx作类型转换,


--------------------------------------------------------------------------------
既然&GPIOx是结构体的地址,那么(u32)作类型转换则是把一个地址转成了u32,这算什么?

原来&GPIOx是结构体的地址,(u32*)把它转换成u32的地址,再取其指向的内容,刚好得到结构体的第一个分量。

--------------------------------------------------------------------------------
"刚好得到结构体的第一个分量"
这个分量是什么呢? GPIOA_BASE?  GPIOB_BASE? 还是GPIO的第一个寄存器镜像?

在map.h中:
#ifdef _GPIOA
  #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#endif /*_GPIOA */

*(u32*)&GPIOA 可不可以这样认为:
*(u32*)& (GPIO_TypeDef *)GPIOA_BASE  ,

map.h中定义了:
#define GPIOA_BASE  ((u32)0x40010800)

那么*(u32*)&GPIOA 是不是最终写成:
*(u32*)& (GPIO_TypeDef *)((u32)0x40010800)

呵呵,麻烦楼主逐一解释一下*(u32*)& (GPIO_TypeDef *)((u32)0x40010800) 这句(如果我没写错的话).

我是菜鸟,请多关照.
 

使用特权

评论回复
5
香水城| | 2008-3-31 11:40 | 只看该作者

哈哈,我说错了,原来3楼4楼的在笑话我

0

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

18

帖子

0

粉丝