OpenEdv-开源电子网

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

关于GPIO_Pin成员变量的取值范围的问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-7-29 11:14:43 | 显示全部楼层 |阅读模式
5金钱
#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) !=(uint16_t)0x00))
这句话怎样解释?为什么GPIO_Pin成员变量的取值范围0x0000到0xffff?
从而可以利用如下的GPIO_Pin_0~GPIO_Pin_15来代替16位数字?
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
……
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */



最佳答案

查看完整内容[请看2#楼]

1   (PIN) & (uint16_t)0x00) == 0x00IN与0x00相与;无论PIN为何值其相与的结果都为0x00;也就是这个等式恒成立成立; 2   (PIN) !=(uint16_t)0x00)如果PIN=0x00;就不成立;其他的PIN值都成立; 1&&2 表示两者都成立为真 否则为假;也就是PIN的值不能为0x00; #define GPIO_Pin_0 ((uint16_t)0x0001)   =>#define GPIO_Pin_0 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-29
在线时间
0 小时
发表于 2015-7-29 11:14:44 | 显示全部楼层
1   (PIN) & (uint16_t)0x00) == 0x00IN与0x00相与;无论PIN为何值其相与的结果都为0x00;也就是这个等式恒成立成立;
2   (PIN) !=(uint16_t)0x00)如果PIN=0x00;就不成立;其他的PIN值都成立;
1&&2 表示两者都成立为真 否则为假;也就是PIN的值不能为0x00;
#define GPIO_Pin_0 ((uint16_t)0x0001)   =>#define GPIO_Pin_0 0000 0000 0000 0001
#define GPIO_Pin_1 ((uint16_t)0x0002)   =>#define GPIO_Pin_0 0000 0000 0000 0010
#define GPIO_Pin_2 ((uint16_t)0x0003)   =>#define GPIO_Pin_0 0000 0000 0000 0100
......
#define GPIO_Pin_15 ((uint16_t)0x0001)   =>#define GPIO_Pin_0 1000 0000 0000 0000
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-5-22
在线时间
0 小时
 楼主| 发表于 2015-7-30 11:00:50 | 显示全部楼层
回复【2楼】hooey:
---------------------------------
谢谢你的回答,你说的我明白了,有一点我不明白的是在GPIO的初始化函数void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)中,对于MODE参数的选择是:
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \
                            ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \
                            ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \
                            ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))
为什么PIN参数的选择不是像MODE一样写成下面的形式呢?
#define IS_GPIO_PIN(PIN)  (((PIN) == GPIO_Pin_0) || ((PIN) == GPIO_Pin_1)|| \
                            ((PIN) == GPIO_Pin_2) || ((PIN) == GPIO_Pin_3) || \
                            ((PIN) == GPIO_Pin_4) || ((PIN) == GPIO_Pin_5) || \
                            ((PIN) == GPIO_Pin_6) || ((PIN) == GPIO_Pin_7)......||\
                            ((PIN) == GPIO_Pin_15)||((PIN) == GPIO_Pin_ALL))
我觉得这样的话更容易理解啊!
而原库函数是写成#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) !=(uint16_t)0x00))这样的,我觉得这样不容理解啊。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-29
在线时间
0 小时
发表于 2015-7-31 21:04:49 | 显示全部楼层
回复【3楼】路人F:
---------------------------------
对单一一个IO口 两个函数是一样的,但是对两个及以上就有差别了;
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \ 
                            ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \ 
                            ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \ 
                            ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP)) 
MODE只能为GPIO_Mode_X中的一个;你可以是推挽输出,也可以是开漏输出,但是不能同时为开漏输出和推挽输出;
也就是说MODE=GPIO_Mode_Out_OD| GPIO_Mode_Out_PP;MODE不等于函数里面的任何一个;编译会报错;
#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) !=(uint16_t)0x00))
PIN可以同时为多个GPIO_Pin_X;你可以同时选择GPIO_Pin_0和GPIO_Pin_1;甚至更多;
PIN=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_X(0~15+all)IN都符合函数得要求;即PIN!=0x00;且PIN&0x00==0x00;编译就不会有错;
我也是个新手;只是通过对函数逻辑的分析得出的结果;不知道对不对;你可以用KIEL分别试一试把MODE设置为GPIO_Mode_Out_OD| GPIO_Mode_Out_PP;看下是否有错误;再在把PIN设置为GPIO_Pin_0|GPIO_Pin_1;看一下结果;
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-5-22
在线时间
0 小时
 楼主| 发表于 2015-8-2 10:37:24 | 显示全部楼层
回复【4楼】hooey:
---------------------------------
我试了一下把MODE设置为GPIO_Mode_Out_OD| GPIO_Mode_Out_PP,编译会有warning,应该如你所说,谢谢,学习了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 21:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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