野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12411|回复: 8

请教一个宏定义问题

[复制链接]
发表于 2022-8-20 22:46:57 | 显示全部楼层 |阅读模式
野火论坛202208202244599917..png

宏 名为什么要定义成 GPIO_Pin?
这些宏定义是啥意思?
谢谢
回复

使用道具 举报

 楼主| 发表于 2022-8-21 15:22:13 | 显示全部楼层
自己先顶一个
回复 支持 反对

使用道具 举报

发表于 2022-8-22 09:34:33 | 显示全部楼层
GPIO Pin x引脚寄存器相对于基地址的偏移,定义成GPIO_Pin_x是便于人类理解,相当于是约定成俗的习惯。你也可以自定义成P1、P2这种,只要你能理解的话,但是为了让别人也看懂,建议还是遵循现有的规范或者习惯。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 14:59:12 | 显示全部楼层
H781997429 发表于 2022-8-22 09:34
GPIO Pin x引脚寄存器相对于基地址的偏移,定义成GPIO_Pin_x是便于人类理解,相当于是约定成俗的习惯。你也 ...

不知道你在说什么
回复 支持 反对

使用道具 举报

发表于 2022-8-23 15:40:14 | 显示全部楼层
宏定义是C语言提供的三种预处理功能的其中一种,提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改,通俗来说是方便查看代码,规范代码
回复 支持 反对

使用道具 举报

发表于 2022-8-24 00:27:59 | 显示全部楼层
#define GPIO_Pin_0  ((uint16_t)0x0001)

C语言里的宏定义就是编译前把后边的字符串代替前面的字符串再编译。也就是凡是看到GPIO_Pin_0字符串的地方就用((uint16_t)0x0001)替换再编译。

用GPIO_Pin_0是便于理解,GPIO(英语:General-purpose input/output)Pin--引脚 0--第0个引脚,所以你要用P0 P1……也是可以的,只是为了程序的可读性好一点。

变量为GPIO_Pin是一个16位的无符号数,该数只有16位,每一位代表一个引脚,若要配置某一个端口的某一个引脚只需要把相应的位设置为1就可以了。在STM32的固件库中有如下引脚号定义:

#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_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */

#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */

#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */

#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */

#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */

#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */

#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */

#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */

#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 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 */

使用这些定义好的宏就方便多了,要配置某几个引脚只需要把相应的引脚相或就可以了。
回复 支持 反对

使用道具 举报

发表于 2022-9-1 10:44:57 | 显示全部楼层

哈哈,人家说的很清楚了啊...
回复 支持 反对

使用道具 举报

发表于 2022-9-1 18:39:15 | 显示全部楼层
是基于基地址做的位置偏移。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-19 19:13:35 | 显示全部楼层
野战排 发表于 2022-8-24 00:27
#define GPIO_Pin_0  ((uint16_t)0x0001)

C语言里的宏定义就是编译前把后边的字符串代替前面的字符串再编 ...

辛苦了,谢谢回复
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 06:48 , Processed in 0.047154 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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