如何将前面的宏定义作为后面的宏定义的参数
本帖最后由 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:14 编辑
http://www.cnblogs.com/3me-linux/p/5825940.html
试下这个连接符,不知道行不行。
理论是可以的,比如用一个计算公式取地址。如下代码:
#define gpiox(x) ((GPIOB_BASE-GPIOA_BASE)*(X-0X0A)+GPIOA_BASE)
或者如下:
#define gpiox(x)GPIO##x
这些都是想法,楼主可以根据实际情况来选择使用。 联接符满足你要求 你可以参考一下芯片定义的头文件。。。。 简单一点,一般我再定义一个SDA引脚,为了和GPIO_PIN_9区别,我一般这样做
.....
#define PIN9 9
.....
#define pinSDA PIN9
.....
#define SDA0_OUT PORTB_Out(pinSDA)
#define SDA0_IN PORTB_In(pinSDA)
安 发表于 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
会报错 安 发表于 2017-7-7 19:34
理论是可以的,比如用一个计算公式取地址。如下代码:
#define gpiox(x) ((GPIOB_BASE-GPIOA_BASE)*(X-0X0A ...
#define gpiox(x)GPIO##x
这个测试了,x不能是另一个宏,这样没有变得简便 C要定义为0x0C,我是举例大概这样使用,具体要根据实际情况进行改变。 我使用如下代码,没有问题:
#define STD_GPIOx(x) (GPIOA_BASE + (GPIOB_BASE - GPIOA_BASE)*(x))
页:
[1]