Moin,
eigentlich ganz einfach: Ich möchte im Programm an mehreren Stellen Port
Bits einstellen für die jeweilige Hardware und zwar dort, wo die HW auch
verwendet wird und nicht einmal global und dann nie wieder.
GPIO_SetBits(GPIOE,SEG7_CS);// Glitch vermeiden CS = HIGH (DISABLE)
10
GPIO_InitStruct.GPIO_Pin=SEG7_CS;
11
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
12
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
13
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
14
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
15
GPIO_Init(GPIOE,&GPIO_InitStruct);
16
17
[.......]
Trotz Debuggen lässt sich nicht herausfinden, wie ich es vermeide, dass
ich eine alte Konfiguration auf PORTE überschreibe, die schon frueher
gemacht wurde wo zb Bit 3,8.9,.. definiert wurden.
Es gibt die Funktion
GPIO_StructInit (&GPIO_InitStructure);
die mir den Struct auf Default stellt. Gibt es auch eine Funktion, die
mir die bisherige Konfiguration einliest, dann schreibe ich etwas dazu
und update den Port nur?
Zum Vergleich: Beim AVR lese ich das "Data Diretion Register" ein, model
mein Bit dazu und schreibe es zurück.
Ich hoffe das war jetzt verständlich beschrieben :-)
Gruss,
Christian
Christian J. schrieb:> GPIO_InitTypeDef GPIO_InitStruct;
Das könntest du zur globalen Variablen machen, dann besser z.B. als
1
GPIO_InitTypeDefGPIOE_InitStruct;
Mit Ports habe ich das bisher nicht gebraucht, aber für z.B. Timer, die
ich On-the-fly umkonfigurieren möchte, klappt das gut.
So hast du die Konfiguration immer vorrätig.
Martin schrieb:> Die Structs Inits machen ein Read modify Write. Also einfach immer neu> befüllen und wieder aufrufen.
Hmmm.... ok. Ich probiere dann auch mal mit dem LOCK Bit aus, wie man
das alles dann sperren kann, wenn es einmal richtig steht. Ganz so
trivial sind die Ports ja nicht.
msx schrieb:> Oh doch, man muß es nur machen. Ein Beispiel:>> // Routinen zur Ausgabe auf LCD 2x16
Du benutzt aber Register, was ich konsequent nicht tue, um mich nicht an
der StdPeriphLib vorbei zu mogeln und weil ich das total unüberschaubar
finde. Die Zeiten erinnern mich noch an die Vor-Cortex Phase :-(
Inzwischen sehe ich da auch klarer, die Struct Funktionen ver-odern
alles
nur, nachdem die es ver-unded haben. Was einmal gesetzt wurde muss
explizit zurückgesetzt werden.
Da, erst wird das alte Bit gelöscht, dann das neue einmaskiert:
GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos *
2));
1
/**
2
* @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_InitStruct.
3
* @param GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F405xx/407xx and STM32F415xx/417xx devices
4
* x can be (A..I) to select the GPIO peripheral for STM32F42xxx/43xxx devices.
5
* x can be (A, B, C, D and H) to select the GPIO peripheral for STM32F401xx devices.
6
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
7
* the configuration information for the specified GPIO peripheral.
Was ich noch nicht ganz kapiere ist bei der SPI, die auch funktioniert
was der Unterschied zwischen
SPI_Direction_Tx
und
SPI_Direction_1ine_Tx
ist. Ich gebe nur an einen Max7219 aus, diese billigen ebay 7 Segment
Anzeigen vom Arduino, brauche keine MISO Leitung und schalte die auch
nicht auf AF Mode um. Beides funktioniert aber.
/* Die SPI1 einstellen */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_StructInit(&SPI_InitStruct);
SPI_InitStruct.SPI_Direction = SPI_Direction_Tx;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStruct);
Torsten C. schrieb:> Matthias S. schrieb:>> Das könntest du zur globalen Variablen machen>> Was soll das bringen?
Du hast die Konfiguration immer parat und kannst sie On-the-Fly ändern,
z.B. um im Betrieb mal einen Ausgang zum Eingang zu machen.
Da Christian jetzt aber von 'Lock' redet und sie anscheinend doch nicht
mehr
Christian J. schrieb:> an mehreren Stellen Port> Bits einstellen für die jeweilige Hardware und zwar dort, wo die HW auch> verwendet wird und nicht einmal global und dann nie wieder.
will, scheint sich das ja erledigt zu haben.
Ansonsten reicht es dann eben, wenn die Struct einmal fertig ist, sie
nur zu ändern und dann wieder die GPIOInit() aufzurufen.
Christian J. schrieb:> Du benutzt aber Register, was ich konsequent nicht tue, um mich nicht an> der StdPeriphLib vorbei zu mogeln und weil ich das total unüberschaubar> finde. Die Zeiten erinnern mich noch an die Vor-Cortex Phase :-(
Anstelle der StdPeriphLib nehme ich gezielt genaue Warteschleifen, wie
"warte_1us()"; ansonsten die ...Lib nur zur Initialisierung.
Nichts zeigt besser den Inhalt der PORT-Register an als diese selbst!