qag 发表于 2017-7-7 16:52:22

如何将前面的宏定义作为后面的宏定义的参数

本帖最后由 qag 于 2017-7-7 16:55 编辑

比如在移植的时候,需要配置引脚,经常要改下面的代码
#define SDA0_PERIPHCLOCK      RCC_APB2Periph_GPIOB
#define SDA0_GPIO                     GPIOB#define SDA0_PIN            GPIO_Pin_9
#define SDA0_OUT             PORTB_Out(9)
#define SDA0_IN             PORTB_In(9)
想实现的是,只要改
#define SDA0                           B9
剩下的宏定义就能根据此自动对应地改变。

搜索了下预处理指令中好像没有相关的内容,请教大家该如何实现。

creep 发表于 2017-7-7 17:13:35

本帖最后由 creep 于 2017-7-7 17:14 编辑

http://www.cnblogs.com/3me-linux/p/5825940.html

试下这个连接符,不知道行不行。

发表于 2017-7-7 19:34:51

理论是可以的,比如用一个计算公式取地址。如下代码:
#define gpiox(x) ((GPIOB_BASE-GPIOA_BASE)*(X-0X0A)+GPIOA_BASE)
或者如下:
#define gpiox(x)GPIO##x

这些都是想法,楼主可以根据实际情况来选择使用。

eagle0754 发表于 2017-7-7 22:45:45

联接符满足你要求

MrJiu 发表于 2017-7-8 09:54:48

你可以参考一下芯片定义的头文件。。。。

zhao.zhao 发表于 2017-7-8 13:20:08

简单一点,一般我再定义一个SDA引脚,为了和GPIO_PIN_9区别,我一般这样做
.....
#define    PIN9   9
.....
#define   pinSDA   PIN9
.....
#define SDA0_OUT          PORTB_Out(pinSDA)
#define SDA0_IN             PORTB_In(pinSDA)

qag 发表于 2017-7-10 10:31:14

安 发表于 2017-7-7 19:34
理论是可以的,比如用一个计算公式取地址。如下代码:
#define gpiox(x) ((GPIOB_BASE-GPIOA_BASE)*(X-0X0A ...

好像编译器不支持把一个宏作为另一个宏的参数呀
.c
GPIO_Init(GPIOX(LED_PORT), &GPIO_InitStructure);

.h
#define LED_PIN         13
#define LED_PORT      C

#define GPIOX(x)      GPIO##x

会报错

qag 发表于 2017-7-10 11:02:09

安 发表于 2017-7-7 19:34
理论是可以的,比如用一个计算公式取地址。如下代码:
#define gpiox(x) ((GPIOB_BASE-GPIOA_BASE)*(X-0X0A ...

#define gpiox(x)GPIO##x

这个测试了,x不能是另一个宏,这样没有变得简便

发表于 2017-7-10 14:08:13

C要定义为0x0C,我是举例大概这样使用,具体要根据实际情况进行改变。

发表于 2017-7-11 14:45:12

我使用如下代码,没有问题:
#define STD_GPIOx(x)            (GPIOA_BASE + (GPIOB_BASE - GPIOA_BASE)*(x))
页: [1]
查看完整版本: 如何将前面的宏定义作为后面的宏定义的参数