打印
[STM32]

程序读不懂,请大侠指导~~谢谢

[复制链接]
1426|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
函数|  楼主 | 2014-12-8 22:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在stm32f4xx_rcc.h文件中,有很多下面这样的宏定义,
#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00));

#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFB8880CC) == 0x00) && ((PERIPH) != 0x00))
#define IS_RCC_APB2_RESET_PERIPH(PERIPH) ((((PERIPH) & 0xFB8886CC) == 0x00) && ((PERIPH) != 0x00))

这样的语句是什么意思呢??

相关帖子

沙发
djxf| | 2014-12-9 19:46 | 只看该作者
问下老谭吧,呵呵。
C的宏定义撒。

使用特权

评论回复
板凳
函数|  楼主 | 2014-12-16 10:40 | 只看该作者
djxf 发表于 2014-12-9 19:46
问下老谭吧,呵呵。
C的宏定义撒。

知道是宏定义,就是用IS_RCC_APB1_PERIPH(PERIPH)代替后面的((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00));,但是((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00))的值时多少呢?该怎么理解这个?? PERIPH 取地址0X09013600,然后判断这个地址的值等于0x00是否为真,若为真则等于1,否则为0,再与上后面的(PERIPH) != 0x00),这里的这个PERIPH为什么没有取地址呢????

使用特权

评论回复
地板
djxf| | 2014-12-16 17:09 | 只看该作者
PERIPH 取地址0X09013600

这里的&是取地址?不是吧?应该是按位与吧?
这个宏定义的意思应该是:
1.PERIPH和0x09013600“按位与”后若等于0,则(((PERIPH) & 0x09013600) == 0x00)为1(真),否则为0(假);
2.(PERIPH) != 0x00不难理解,若PERIPH非0,则为1,否则为0;
3. 前后两部分再进行“逻辑与”,若两者都为1则结果为1,否则为0.
个人理解,不一定对。

使用特权

评论回复
5
函数|  楼主 | 2014-12-16 20:01 | 只看该作者
djxf 发表于 2014-12-16 17:09
这里的&是取地址?不是吧?应该是按位与吧?
这个宏定义的意思应该是:
1.PERIPH和0x09013600“按位与”后 ...

这段完整的程序如下:
/** @defgroup RCC_APB1_Peripherals
  * @{
  */
#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)
#define RCC_APB1Periph_I2C3              ((uint32_t)0x00800000)
#define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)
#define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)
#define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)
#define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)
#define RCC_APB1Periph_UART7             ((uint32_t)0x40000000)
#define RCC_APB1Periph_UART8             ((uint32_t)0x80000000)
#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00))
/**
  * @}
  */

最后一个#define语句,它是想表达什么意思呢?

使用特权

评论回复
6
zjczm| | 2014-12-17 10:34 | 只看该作者
我理解为:检测PERIPH的某些指定位是否都为0(由0x09013600的二进制指定位),且该值不为0,则返回1.否则返回0

使用特权

评论回复
7
zchong| | 2014-12-17 10:54 | 只看该作者
((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00))
基本的C语法分析不就完了吗,有啥问题呢?

使用特权

评论回复
8
zjwyczj| | 2014-12-24 15:24 | 只看该作者
宏定义啊,很简单的

使用特权

评论回复
9
江陵龙少| | 2014-12-24 21:03 | 只看该作者
6楼正解。首先,表达式最后的结果为逻辑值,真或假,其次,检测的是periph的特定比特位是否为0,再次,英文表意,periph的指定比特位若都为0,且periph是有意义的地址值(非0),则该外设就是apb1外设。

使用特权

评论回复
10
crystal1987| | 2014-12-26 14:00 | 只看该作者
这是C语言没学好啊。

使用特权

评论回复
11
戈卫东| | 2014-12-26 22:37 | 只看该作者
判断“PERIPH”的值是否在某个范围内

使用特权

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

本版积分规则

8

主题

17

帖子

0

粉丝