Я работаю над STM8 MCU и, в отличие от STM32, константы MCU определены как enum, а не как # define.
На самом деле мне нужно знать, существует ли значение enum для условной компиляции. Для константы #define это не сложно, как вы можете видеть из моего кода STM32:
// code 1
SPCMD_arguments_T const all_mode_a[] =
{
{"GPIO Mode", 0, NULL, NULL, NULL, NULL},
#ifdef GPIO_MODE_INPUT
{ "in", GPIO_MODE_INPUT, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_OUTPUT_PP
{ "opp", GPIO_MODE_OUTPUT_PP, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_OUTPUT_OD
{ "ood", GPIO_MODE_OUTPUT_OD, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_AF_PP
{ "afpp", GPIO_MODE_AF_PP, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_AF_OD
{ "afod", GPIO_MODE_AF_OD, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_ANALOG
{ "an", GPIO_MODE_ANALOG, NULL, NULL, NULL, NULL},
#endif
#ifdef GPIO_MODE_IT_RISING
{ "it_rising", GPIO_MODE_IT_RISING, NULL, NULL, NULL, NULL},
#endif
{ NULL, 0, NULL, NULL, NULL, NULL }
};
Но для STM8 все режимы определены как enum:
// code 2
typedef enum
{
GPIO_Pin_0 = ((uint8_t)0x01), /*!< Pin 0 selected */
GPIO_Pin_1 = ((uint8_t)0x02), /*!< Pin 1 selected */
GPIO_Pin_2 = ((uint8_t)0x04), /*!< Pin 2 selected */
GPIO_Pin_3 = ((uint8_t)0x08), /*!< Pin 3 selected */
GPIO_Pin_4 = ((uint8_t)0x10), /*!< Pin 4 selected */
GPIO_Pin_5 = ((uint8_t)0x20), /*!< Pin 5 selected */
GPIO_Pin_6 = ((uint8_t)0x40), /*!< Pin 6 selected */
GPIO_Pin_7 = ((uint8_t)0x80), /*!< Pin 7 selected */
GPIO_Pin_LNib = ((uint8_t)0x0F), /*!< Low nibble pins selected */
GPIO_Pin_HNib = ((uint8_t)0xF0), /*!< High nibble pins selected */
GPIO_Pin_All = ((uint8_t)0xFF) /*!< All pins selected */
} GPIO_Pin_TypeDef;
Итак, код 1 не работает в этом случае. Как я могу проверить, определены ли константы enum, и сделать мой код переносимым на другие микроконтроллеры STM8?