野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8457|回复: 3

关于GPIO引脚取值判定的宏

[复制链接]
发表于 2018-5-24 16:20:06 | 显示全部楼层 |阅读模式
本帖最后由 xiatianyun 于 2018-5-24 16:23 编辑

在stm32f10x_gpio.h中有关引脚取值判定宏我不明白:
#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00))

这个宏是个&&与逻辑式,逻辑式右边好理解:PIN不等于0x00。
可是左边作何理解呢?  ((PIN) & (uint16_t)0x00) 不是等于0吗? 0x00 == 0x00有什么含义呢?
整体来看逻辑取决于右边,只要PIN不等于0就可以了?
-----------------------------------------------

回复

使用道具 举报

发表于 2018-5-24 16:55:55 | 显示全部楼层
如果PIN的高16位有非0值的话,那么((PIN) & (uint16_t)0x00) 就不会等于0x00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-24 20:16:56 | 显示全部楼层
鲁合乐 发表于 2018-5-24 16:55
如果PIN的高16位有非0值的话,那么((PIN) & (uint16_t)0x00) 就不会等于0x00

一开始我也有这种感觉,不过似乎没法说得通呀。
32位整数 & 16位整数,凭什么高16位被认为不参与呢?
事实上16位整数被上取为32位整数参与计算了,这样高16位是0。高16位&的结果就是0.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-24 20:25:32 | 显示全部楼层
我还是理解为什么要有这句判定的:PIN只能是0x0001~0xFFFF内的值。
那么可以这样:
#define IS_GPIO_PIN(PIN)   ((PIN) <= (uint16_t)0xFFFF)  && ((PIN) != (uint16_t)0x0000)
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 02:33 , Processed in 0.047414 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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