矩阵宏,一次定义大量常数

如果要定义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, \
};
发布了39 篇原创文章 · 获赞 6 · 访问量 5076

猜你喜欢

转载自blog.csdn.net/ScilogyHunter/article/details/100778055