OpenEdv-开源电子网

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

是否多此一举?求解答?(*(u32*)&(PERIPH))

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-5-3
在线时间
0 小时
发表于 2013-5-3 16:45:42 | 显示全部楼层 |阅读模式
     我是stm32学习新人,对语言还不是很理解,

经常看到库函数里面都有这样的 一句
(*(u32*)&(PERIPH))     按理解就是得到一个u32的数值,且与PERIPH相等

我现在的问题是  "PERIPH”  是指针还是结构体???
按我的理解PERIPH是指向 一个结构体的指针。
如果是这样为何不直接吧标题中的  写成 (u32)PERIPH,直接转成数值??

写成(*(u32*)&(PERIPH)) 是否多次一举

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

使用道具 举报

6

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-11-30
在线时间
0 小时
发表于 2013-5-3 18:53:01 | 显示全部楼层
回复【楼主位】fish:
---------------------------------
你好,我觉得不是这样子的,举个例子

(float)((int)(7.13)) == 7.000000
先把7.13转换为整型7,之后再把7转换为单精度浮点型

强制类型转换会把数据的精度(或其他)改变
这是我的理解,有不对的地方请指出
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-3 21:13:42 | 显示全部楼层
回复【楼主位】fish:
---------------------------------
(*(u32*)&(PERIPH)) !=PERIPH
PERIPH是一个地址。
&PERIPH,取这个地址值。
(u32*)&(PERIPH),将这个地址值强制转换为u32指针。 
(*(u32*)&(PERIPH)) ,取这个指针所指向地址的值。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-5-3
在线时间
0 小时
 楼主| 发表于 2013-5-3 22:04:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
DMA_DeInit(DMA1_Channel6);  
就以这个DMA_DeInit函数为例,其中下面是函数 原型,
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx)
那就说明DMA1_Channel6  是一个指向结构体指针,既然它是指针,那么&DMA1_Channel6 不就是存放这个指针内存地址Y吗?(这个地址Y我们不需要知道是什么)
在前面加(u32*) 意思不是就是把这个 地址强行 转变成指向一个U32值的指针,,
再在前面加* 意思就是  取这个指针Y的指向U32值, 实际就是 DMA1_Channel6 的值。

其中DMA_DeInit里面 现有这样一个检验指针值的 函数 assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));
然而IS_DMA_ALL_PERIPH有有这样的宏定义
#define IS_DMA_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == DMA1_Channel1_BASE) || \
                                   ((*(u32*)&(PERIPH)) == DMA1_Channel2_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA1_Channel3_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA1_Channel4_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA1_Channel5_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA1_Channel6_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA1_Channel7_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA2_Channel1_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA2_Channel2_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA2_Channel3_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA2_Channel4_BASE)  || \
                                   ((*(u32*)&(PERIPH)) == DMA2_Channel5_BASE))
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-3 22:38:40 | 显示全部楼层
回复【4楼】fish:
---------------------------------
按你的理解,实际测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 14:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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