如果要定义GPIO_A_00 到 GPIO_Z_31 即所有的 GPIO 编号,且数值和宏名是有逻辑关系的如下:
GPIO_port_pin = port * 32 + pin
用传统的方法需要写 26 * 32 = 832 行宏定义,如下:
#define GPIO_A_00 (0)
#define GPIO_A_01 (1)
...
...
...
#define GPIO_Z_30 (830)
#define GPIO_Z_31 (831)
下面使用矩阵宏的方法,只定义2个宏和一个enum类型即可实现同样效果,但只需要 26 + 32 +3 = 61 行代码。
/*********************************************************************************************************
GPIO 引脚集合宏
*********************************************************************************************************/
#define GROUP_PIN(XX) XX##_00, \
XX##_01, \
XX##_02, \
XX##_03, \
XX##_04, \
XX##_05, \
XX##_06, \
XX##_07, \
XX##_08, \
XX##_09, \
XX##_10, \
XX##_11, \
XX##_12, \
XX##_13, \
XX##_14, \
XX##_15, \
XX##_16, \
XX##_17, \
XX##_18, \
XX##_19, \
XX##_20, \
XX##_21, \
XX##_22, \
XX##_23, \
XX##_24, \
XX##_25, \
XX##_26, \
XX##_27, \
XX##_28, \
XX##_29, \
XX##_30, \
XX##_31,
/*********************************************************************************************************
GPIO 端口集合宏
*********************************************************************************************************/
#define GROUP_PORT(YY) YY(GPIO_A) \
YY(GPIO_B) \
YY(GPIO_C) \
YY(GPIO_D) \
YY(GPIO_E) \
YY(GPIO_F) \
YY(GPIO_G) \
YY(GPIO_H) \
YY(GPIO_I) \
YY(GPIO_J) \
YY(GPIO_K) \
YY(GPIO_L) \
YY(GPIO_M) \
YY(GPIO_N) \
YY(GPIO_O) \
YY(GPIO_P) \
YY(GPIO_Q) \
YY(GPIO_R) \
YY(GPIO_S) \
YY(GPIO_T) \
YY(GPIO_U) \
YY(GPIO_V) \
YY(GPIO_W) \
YY(GPIO_X) \
YY(GPIO_Y) \
YY(GPIO_Z)
/*********************************************************************************************************
定义枚举值 GPIO_A_00 到 GPIO_Z_31, 即所有的 GPIO 编号,
*********************************************************************************************************/
enum __GPIOS {
GROUP_PORT(GROUP_PIN)
};
展开过程
enum __GPIOS {
GROUP_PORT(GROUP_PIN)
};
enum __GPIOS {
GROUP_PIN(GPIO_A) \
...
GROUP_PIN(GPIO_Z) \
};
enum __GPIOS {
GPIO_A_00, \
...
GPIO_A_31, \
...
...
...
GPIO_Z_00, \
...
GPIO_Z_31, \
};