So verwenden Sie CMSIS zum Einrichten eines bidirektionalen Ports auf STM32F4

Ich möchte GPIO_TypeDef und GPIO_Init verwenden, um einen bidirektionalen Port auf dem STM32F407 zu erstellen, einige Eingangspins, einige Ausgangspins.

Führe ich GPIO_Init einfach zweimal aus, einmal für die Eingangspins und einmal für die Ausgangspins, nachdem ich die GPIO_Typedef-Struktur eingerichtet habe, oder macht der zweite Lauf alles rückgängig, was der erste Lauf getan hat?

Ich weiß (zumindest bin ich mir ziemlich sicher), dass dies problemlos auf Registerebene codiert werden kann, aber ich hätte gerne die CMSIS-Methode.

Antworten (1)

Solange Sie verschiedene Pins in der GPIO_Typedef-Struktur angeben, können Sie GPIO_Init so oft ausführen, wie Sie möchten, ohne die anderen Initialisierungen rückgängig zu machen. Sie können alle Eingänge (oder Ausgänge) zusammen gruppieren und die Pin-Bezeichnungen bitweise ODER (z. B. GPIO_Pin_0 | GPIO_Pin_1) oder alle separat ausführen, indem Sie GPIO_Init für jeden aufrufen.

Vergessen Sie nicht, die GPIO-AHB-Uhr zu aktivieren mit: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); bevor Sie die Pins konfigurieren.

@ScottSeidman ... Wenn Sie dies noch nicht getan haben, würde ich empfehlen, den Quellcode für die Standard Peripherals Library herunterzuladen. Sie können dann nicht nur sehen, wie Funktionen wie GPIO_Init() funktionieren, sondern enthalten (seltsamerweise) Anweisungen zum Einrichten und Verwenden der Peripheriegeräte in den Quelldateien. Es scheint mir, dass es besser wäre, wenn die Anweisungen in den Header-Dateien wären, aber nicht so.
Guter Rat. Ich habe mir den Abschnitt "Verwendung dieses Treibers" angesehen, aber das war bei dieser Frage nicht klar. Wenn Sie etwas tiefer graben, wird klar, dass GPIO_Init die im GPIO_Pin-Feld angegebenen Bits durchläuft und nichts anderes berührt. Ich denke, ich muss mit der GPIO_InitStruct-Verwaltung akribisch umgehen, wenn ich nicht versehentlich Dinge tun möchte (oder einfach zwei separate Funktionsaufrufe verwenden, um sie einzurichten). Gibt es eine gute Möglichkeit, diese Struktur zu löschen?
@ScottSeidman ... Ich kenne keinen guten Weg, um die Struktur zu löschen. Sie stellen GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) bereit, aber das füllt die Struktur nur mit Standardwerten aus, sodass Sie immer noch alles ausfüllen müssen, was anders ist, und der Standard für GPIO_Pin ist GPIO_Pin_All, also müssen Sie damit vorsichtig sein. Ich ziehe es vor, alle Strukturwerte unmittelbar vor jedem Aufruf von GPIO_Init() explizit einzurichten.
@ScottSeidman ... Das kann natürlich etwas mühsam sein, wenn Sie die Ports mehr als einmal ändern, z. B. das Ändern von Eingängen zu Ausgängen und wieder zurück. In diesem Fall würde ich wahrscheinlich vorinstallierte Strukturen verwenden.