Gast
#5007159
Moin, Präprozessoren sind kompliziert und doof, aber nützlich. Leider. Ich will für einen STM32F429 die SPI-Pins festlegen, dazu lebte ich bisher pro Pin ganz gut und praktisch mit 4 Parametern, also z.B. #define SPI3_MOSI_RCC RCC_AHB1Periph_GPIOD #define SPI3_MOSI_PORT GPIOD #define SPI3_MOSI_PIN GPIO_Pin_6 #define SPI3_MOSI_SRC GPIO_PinSource6 Die lege ich am Anfang des Projekts fest. Damit komme ich bei Verwendung der Standard-lib ganz gut zurecht, und habe für den STM32F407 einige Projekte damit laufen lassen. Die möchte ich jetzt nicht alle ändern/nachbessern. Zum Punkt: Der STM32F429 hat MOSI3 auf PORT B5,C12 und D6. Das Bösartige ist, daß für B5 und C12 die AF6 gilt, für D6 aber AF5. -> man braucht einen 5. Parameter, und definiert für jeden verflixten Pin auch noch die AF (doofe Lösung) ODER man läßt das den Präprozessor machen: #if (SPI3_MOSI_PORT==GPIOD) && (SPI3_MOSI_SRC==GPIO_PinSource6) GPIO_PinAFConfig(SPI3_MOSI_PORT, SPI3_MOSI_SRC, GPIO_AF_SPI2); #else GPIO_PinAFConfig(SPI3_MOSI_PORT, SPI3_MOSI_SRC, GPIO_AF_SPI3); #endif Problem: Der macht das nicht, weil GPIOD in der stm32f4xx.h als ((GPIO_TypeDef *) GPIOD_BASE) definiert ist, also keinen Zahlenwert hat oder nichts, womit der Präproz was anfangen kann. Schön und gut, dann macht man eben eine unsaubere Lösung und wählt den Pin selbst als Entscheidungskriterium (was problematisch wird, wenn ST einen Chip herausbringt, bei dem MOSI3 noch auf einem anderen Port x6 liegt): #if SPI3_MOSI_PIN==GPIO_Pin_6 GPIO_PinAFConfig(SPI3_MOSI_PORT, SPI3_MOSI_SRC, GPIO_AF_SPI2); #else GPIO_PinAFConfig(SPI3_MOSI_PORT, SPI3_MOSI_SRC, GPIO_AF_SPI3); #endif Aber jetzt die Unverschämtheit: Selbst das frißt er nicht. Auch nicht, wenn ich explizit den Pin mit Zahlenwert benenne, also: #if SPI3_MOSI_PIN==0x0040 ... Da komme ich jetzt an die Grenzen meiner Leistungsfähigkeit ;). Wieso macht der das nicht? Irgendwie komme ich da mit meinem Verständnis vom Präproz als Symbolprozessor ins Schleudern.Tatsache ist, es MUSS mit dem Präproz gehen, aber ich stehe gerade auf dem Schlauch, wie. (IDE ist CooCox, Compiler ist ARM-non-eabi)