Код
потому что каждый раз макросы разворачиваются до конца своей вложенности.
Вот. Это и есть ключ к ответу на мой вопрос
А насчет всех макросов, то вот:
Код
#define PERIPH_BASE 0x40000000
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define SPI1_BASE (APB2PERIPH_BASE + 0x3000)
#define SPI1 ((SPI_TypeDef *)SPI1_BASE)
#define GPIO_AF_SPI1 ((uint8_t)0x05)
Видимо действительно он раскручивает все макросы, которые может развернуть, до самого конца. А потом пытается склеить, получается каша.
Код
// HW_ADCBank1Init - функция инициализации периферии для работы с внешними АЦП.
// Параметры: нет.
// Возвращаемое значение: нет.
static void HW_ADCBank1Init(void)
{
#define LCD_SPI_MODULE SPI1
#define GPIO_AF_EXPAND_E(a, b) a##b
#define GPIO_AF_EXPAND(a, b) GPIO_AF_EXPAND_E(a, b)
GPIO_PinAFConfig(GPIO_ADC_SPI1_SCK.GPIO, GPIO_ADC_SPI1_SCK.PinSource, GPIO_AF_EXPAND(GPIO_AF_, LCD_SPI_MODULE));
GPIO_PinAFConfig(GPIO_ADC_SPI1_MISO.GPIO, GPIO_ADC_SPI1_MISO.PinSource, GPIO_AF_SPI1); // GPIO_AF_SPI1 я пытаюсь получить и в предыдущей строке
...
...
...
выдает в консоли:
Код
User\Hardware.c(449): warning: #223-D: function "GPIO_AF_" declared implicitly
Стоит переписать как
Код
#define #define LCD_SPI_MODULE _SPI1
...
GPIO_PinAFConfig(GPIO_ADC_SPI1_SCK.GPIO, GPIO_ADC_SPI1_SCK.PinSource, GPIO_AF_EXPAND(GPIO_AF, LCD_SPI_MODULE));
то все работает и преобразуется во что нужно.
Однако жутко неудобен этот "хвост" в виде нижнего подчеркивания... Ведь в коде хотелось бы иметь
Код
SPI_Cmd(LCD_SPI_MODULE, ENABLE);
а не
Код
SPI_Cmd(SPI1, ENABLE);
Есть конечно решение "в лоб", это сделать несколько определений:
Код
#define LCD_SPI_MODULE SPI1
#define _LCD_SPI_MODULE_ _SPI1
и использовать первый, где требуется именно имя SPI1, а второй - там где этот кусок текста слепляется с другими макросами, например, в имени GPIO_AF_SPI1.
P.S. Уважаемые, а можно ли в тегах [код] раскрашивать текст в разный цвет? А то хотелось бы акцентировать внимание на что-то, да не получается.