打印
[ARM入门]

define定义如何分析

[复制链接]
940|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
成年礼悲歌|  楼主 | 2014-10-1 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define IS_GPIO_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == GPIOA_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOB_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOC_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOD_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOE_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOF_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOG_BASE))

相关帖子

沙发
成年礼悲歌|  楼主 | 2014-10-1 16:13 | 只看该作者
这个定义求高手分析一下,一时看不出所以然来

使用特权

评论回复
板凳
成年礼悲歌|  楼主 | 2014-10-1 16:42 | 只看该作者
#define IS_GPIO_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == GPIOA_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOB_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOC_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOD_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOE_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOF_BASE) || \
                                    ((*(u32*)&(PERIPH)) == GPIOG_BASE))

*********************************************************************
首先:
PERIPH是代表STM高级外设,并不代表具体的某一个数字。
例如:
((*(u32*)&(gpio)) 这就取出了gpio这一类寄存器所在的基址;同样
((*(u32*)&(dma))取出dma寄存器的基址.
其次:‘\’是连接符
上面变成了#define IS_GPIO_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == GPIOA_BASE) ||  ((*(u32*)&(PERIPH)) == GPIOB_BASE) ||  ((*(u32*)&(PERIPH)) == GPIOC_BASE) ||  ((*(u32*)&(PERIPH)) == GPIOD_BASE) ||  ((*(u32*)&(PERIPH)) == GPIOE_BASE) || ((*(u32*)&(PERIPH)) == GPIOF_BASE) || ((*(u32*)&(PERIPH)) == GPIOG_BASE))

那么上面的变成了取出PERIPH(GPIO)的地址,和里面的数值对比判断是否属于GPIO。
从字面意思IS_GPIO_ALL_PERIPH。也可知是判断是否是GPIO的意思


使用特权

评论回复
地板
成年礼悲歌|  楼主 | 2014-10-1 16:43 | 只看该作者
自问自答了,不知道对否

使用特权

评论回复
5
bd7qwmcu| | 2014-10-1 16:45 | 只看该作者
不甚明白,等高手来,

使用特权

评论回复
6
小小小小白| | 2014-10-1 18:56 | 只看该作者
带参宏定义

使用特权

评论回复
7
小小小小白| | 2014-10-1 19:26 | 只看该作者
个人理解:
这是stm32库函数里边的断言assert,用于判断函数传入的参数是否正确。我记得如果需要启用这个断言,需要加#define debug这个宏定义。
((*(u32*)&(PERIPH))这里是取PERIPH的地址,再转换为指向u32类型的指针,再取值。
显然这段宏定义是用于判断PERIPH是否为GPIOA_BASE B C D E F G 中的任意一个,如果是,结果为1;否则,结果为0。

使用特权

评论回复
8
成年礼悲歌|  楼主 | 2014-10-1 19:51 | 只看该作者
小小小小白 发表于 2014-10-1 19:26
个人理解:
这是stm32库函数里边的断言assert,用于判断函数传入的参数是否正确。我记得如果需要启用这个断 ...

恩是这样的

使用特权

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

本版积分规则

3

主题

12

帖子

0

粉丝