- Hardware vorbereiten
- Grundlegendes zu GPIO-Pinbelegung auf STM8S103F
- Pinbelegung Beschreibung und Tipps für die STM8S103F GPIO-Auswahl
- Programmierung von STM8S für GPIO-Ein- und Ausgabe mit SPL
- Programm hochladen und testen
Für Mikrocontroller entspricht ein LED-Blinkprogramm dem Programm „Hallo Welt“. In unserem vorherigen Tutorial haben wir gelernt, wie Sie mit dem STM8S103F3 Development Board beginnen und wie Sie die IDE und den Compiler zum Programmieren unserer STM8S-Controller einrichten. Wir haben auch gelernt, wie man die Standard-Peripheriebibliotheken verwendet und wie man den Code kompiliert und in unseren Mikrocontroller hochlädt. Lassen Sie uns mit all den Grundlagen beginnen, Code zu schreiben. In diesem Tutorial erfahren Sie, wie Sie allgemeine GPIO-Funktionen auf STM8S-Controllern ausführen. Die Karte verfügt bereits über eine integrierte LED, die an Pin 5 von Port B angeschlossen ist. Wir werden lernen, wie diese LED blinkt. Außerdem wird eine externe LED hinzugefügt und mit einem Druckknopf gesteuert. Wenn Sie völlig neu sind, wird dringend empfohlen, das vorherige Lernprogramm zu lesen, bevor Sie fortfahren.
Hardware vorbereiten
Bevor wir uns mit dem Programm befassen, sollten Sie die Hardwareverbindungen vorbereiten. Wie bereits erwähnt, werden hier zwei LEDs verwendet, eine ist eine integrierte LED, die kontinuierlich blinkt, und die andere ist eine externe LED, die mit einem Druckknopf umgeschaltet wird. Die Idee ist, alle GPIO-Funktionen in einer einfachen Einrichtung zu erlernen. Die integrierte LED ist bereits mit PB5 (Pin5 von PORTB) verbunden, daher habe ich gerade eine LED an PA3 und einen Druckknopf an PA2 angeschlossen, wie Sie in der folgenden Abbildung sehen können.
Aber von allen Ausgangsstiften, die auf unserer Steuerung verfügbar sind, warum habe ich PA3 für den Ausgang und PA2 für den Eingang ausgewählt? Die Fragen sind gültig und ich werde das später in diesem Artikel erklären. Meine Hardware-Einstellungen für dieses Tutorial sind unten aufgeführt. Wie Sie sehen können, habe ich meinen ST-Link-Programmierer auch an Programmierstifte angeschlossen, die nicht nur unser Board programmieren, sondern auch als Stromquelle dienen.
Grundlegendes zu GPIO-Pinbelegung auf STM8S103F
Kommen wir nun auf die Frage zurück, warum PA2 für die Eingabe und warum PA3 für die Ausgabe? Um dies zu verstehen, schauen wir uns die Pinbelegung des Mikrocontrollers genauer an, die unten gezeigt wird.
Gemäß dem Pinbelegungsdiagramm haben wir vier Ports an unserem Mikrocontroller, nämlich PORT A, B, C und D, die mit PA, PB, PC bzw. PD bezeichnet sind. Jeder GPIO-Pin ist auch mit einer anderen speziellen Funktionalität ausgestattet. Beispielsweise kann der PB5 (Pin 5 von PORT B) nicht nur als GPIO-Pin, sondern auch als SDA-Pin für die I2C-Kommunikation und als Timer 1-Ausgangspin fungieren. Wenn wir diesen Pin also für einfache GPIO-Zwecke wie das Anschließen einer LED verwenden, können wir I2C und die LED nicht gleichzeitig verwenden. Leider ist die integrierte LED an diesen Pin angeschlossen, sodass wir hier keine große Auswahl haben. In diesem Programm werden wir I2C nicht verwenden, daher ist dies kein großes Problem.
Pinbelegung Beschreibung und Tipps für die STM8S103F GPIO-Auswahl
Wirklich, es würde nicht schaden, PA1 als Eingangsstift zu verwenden, und es würde nur als Arbeitsstift funktionieren. Aber ich habe dies absichtlich angesprochen, um mir die Gelegenheit zu geben, Ihnen einige häufige Fallen zu zeigen, in die Sie möglicherweise geraten, wenn Sie GPIO-Pins auf einem neuen Mikrocontroller auswählen. Um die Fallen zu vermeiden, lesen Sie am besten die Pin-Details und die Pin-Beschreibung im Datenblatt STM8S103F3P6. Für die Beschreibung der Pin-Beschreibung des STM8S103F3P6-Mikrocontrollers sind die im Datenblatt genannten Details in den folgenden Abbildungen dargestellt.
Die Eingangsstifte unseres Mikrocontrollers können entweder schwebend oder schwach hochgezogen sein, und die Ausgangsstifte können entweder Open Drain oder Push-Pull sein. Der Unterschied zwischen Open Drain- und Push-Pull-Ausgangspins ist bereits besprochen, daher werden wir nicht näher darauf eingehen. Einfach ausgedrückt kann ein Open Drain-Ausgangsstift den Ausgang nur so niedrig und nicht so hoch machen, während ein Push-Pull-Ausgangsstift den Ausgang sowohl so hoch als auch hoch machen kann.
Abgesehen von der obigen Tabelle können Sie auch feststellen, dass ein Ausgangspin entweder ein schneller Ausgang (10 MHz) oder ein langsamer Ausgang (2 MHz) sein kann. Dies bestimmt die GPIO-Geschwindigkeit. Wenn Sie Ihre GPIO-Pins sehr schnell zwischen hoch und niedrig umschalten möchten, können wir die Option Schnelle Ausgabe wählen.
Einige GPIO-Pins auf unserem Controller unterstützen True Open Drain (T) und High Sink Current (HS), wie im obigen Bild erwähnt. Ein beträchtlicher Unterschied zwischen Open Drain und True Open Drain besteht darin, dass der an Open Drain angeschlossene Ausgang nicht höher als die Betriebsspannung des Mikrocontrollers (Vdd) gezogen werden kann, während ein echter Open-Drain-Ausgangspin höher als Vdd gezogen werden kann. Stifte mit hoher Sinkfähigkeit bedeuten, dass mehr Strom aufgenommen werden kann. Der Quellen- und Senkenstrom eines GPIO HS-Pins beträgt 20 mA, während die Stromleitung bis zu 100 mA verbrauchen kann.
Wenn Sie sich das obige Bild genauer ansehen, werden Sie feststellen, dass fast alle GPIO-Pins vom Typ High Sink Current (HS) sind, mit Ausnahme von PB4 und PB5, die vom Typ True Open Drain (T) sind. Dies bedeutet, dass diese Stifte nicht hoch gemacht werden können, sie können keine 3,3 V liefern, selbst wenn der Stift hoch gemacht wird. Aus diesem Grund wird die integrierte LED an eine 3,3-V-LED angeschlossen und über PB5 geerdet, anstatt sie direkt über den GPIO-Pin mit Strom zu versorgen.
Auf Seite 28 des Datenblattes finden Sie eine detaillierte Pin-Beschreibung. Wie im obigen Bild erwähnt, wird PA1 automatisch als schwacher Pull-up konfiguriert und es wird nicht empfohlen, ihn als Ausgangspin zu verwenden. Wie auch immer, es kann als Eingangspin zusammen mit einem Druckknopf verwendet werden, aber ich habe mich für PA2 entschieden, nur um zu versuchen, das Pull-up aus dem Programm zu aktivieren. Dies sind nur einige grundlegende Dinge, die nützlich sein werden, wenn wir viel kompliziertere Programme schreiben. Im Moment ist es in Ordnung, wenn viele Dinge von Ihrem Kopf abprallen. Wir werden uns in anderen Tutorials mit dieser Ebene befassen.
Programmierung von STM8S für GPIO-Ein- und Ausgabe mit SPL
Erstellen Sie einen Arbeitsbereich und ein neues Projekt, wie in unserem ersten Tutorial beschrieben. Sie können entweder alle Header- und Quelldateien oder nur die Dateien gpio, config und stm8s hinzufügen. Öffnen Sie die Datei main.c und schreiben Sie Ihr Programm.
Stellen Sie sicher, dass Sie die Header-Dateien wie in der Abbildung oben gezeigt aufgenommen haben. Öffnen Sie die Datei main.c und starten Sie den Code. Den vollständigen main.c-Code finden Sie unten auf dieser Seite. Von dort aus können Sie auch die Projektdatei herunterladen. Die Erklärung des Codes lautet wie folgt. Sie können sich auch auf das SPL-Benutzerhandbuch oder das unten auf dieser Seite verlinkte Video beziehen, wenn Sie sich über den Codierungsteil nicht sicher sind.
De-Initialisierung des erforderlichen Ports
Wir beginnen unser Programm mit der De-Initialisierung der erforderlichen Ports. Wie bereits erwähnt, sind jedem GPIO-Pin viele andere Funktionen zugeordnet, die nicht nur wie ein normaler Ein- und Ausgang funktionieren. Wenn diese Pins zuvor für einige andere Anwendungen verwendet wurden, sollte sie vor der Verwendung de-initialisiert werden. Es ist nicht obligatorisch, es ist jedoch eine gute Praxis. Die folgenden zwei Codezeilen werden zum De-Initialisieren von Port A und Port B verwendet. Verwenden Sie einfach die Syntax GPIO_DeInit (GPIOx). und erwähnen Sie den Portnamen anstelle von x.
GPIO_DeInit (GPIOA); // Port A für die Arbeit vorbereiten GPIO_DeInit (GPIOB); // Port B für die Arbeit vorbereiten
GPIO-Deklaration für Eingabe und Ausgabe
Als nächstes müssen wir deklarieren, welche Pins als Eingang und welche als Ausgang verwendet werden. In unserem Fall wird Pin PA2 als Eingang verwendet. Wir werden diesen Pin auch mit internem Pull-up deklarieren, damit wir keinen externen verwenden müssen. Die Syntax lautet GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . Dabei ist x der Portname, y die Pin-Nummer und z der GPIO-Pin-Modus.
// PA2 als Pull-Up-Pin für den Eingang deklarieren GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
Als nächstes müssen wir die Pins PA3 und PB5 als Ausgang deklarieren. Wieder sind viele Arten der Ausgabedeklaration möglich, aber wir werden "GPIO_MODE_OUT_PP_LOW_SLOW" verwenden, was bedeutet, dass wir es als einen Ausgabestift vom Typ Push-Pull mit langsamer Geschwindigkeit deklarieren werden. Standardmäßig ist der Wert niedrig. Die Syntax ist dieselbe.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // PB5 als Push-Pull-Ausgangspin GPIO_Init deklarieren (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
Der folgende Schnappschuss aus dem SPL-Benutzerhandbuch erwähnt alle möglichen GPIO-Modi (z).
Endlos while-Schleife
Nach der Pin-Deklaration müssen wir eine Endlosschleife erstellen, in der wir die LED für immer blinken lassen und den Status des Druckknopfs überwachen, um die LED umzuschalten. Die Endlosschleife kann entweder mit einer Weile (1) oder mit einem for (;;) erstellt werden . Hier habe ich während (1) verwendet.
während (1) {}
Überprüfen des Status des Eingangspins
Wir müssen den Status des Eingangs-Pins überprüfen. Die Syntax dafür lautet GPIO_ReadInputPin (GPIOx, GPIO_PIN_y). Dabei ist x der Portname und y die PIN-Nummer. Wenn der Pin hoch ist, erhalten wir '1' und wenn der Pin niedrig ist, erhalten wir eine '0'. Wir haben es gewohnt, in einer if-Schleife zu prüfen, ob der Pin hoch oder niedrig ist.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // wenn Taste gedrückt
Einen GPIO-Pin hoch oder niedrig machen
Um einen GPIO-Pin auf High oder Low zu setzen, können wir GPIO_WriteHigh (GPIOx, GPIO_PIN_y) verwenden. und GPIO_WriteLow (GPIOx, GPIO_PIN_y); beziehungsweise. Hier haben wir die LED eingeschaltet, wenn die Taste gedrückt wird, und ausgeschaltet, wenn die Taste nicht gedrückt wird.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // if-Taste gedrückt GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED EIN sonst GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED AUS
GPIO-Pin umschalten
Um einen GPIO-Pin umzuschalten, haben wir GPIO_WriteReverse (GPIOx, GPIO_PIN_y); Durch Aufrufen dieser Funktion wird der Status des Ausgangspins geändert. Wenn der Pin hoch ist, wird er auf niedrig geändert, und wenn er niedrig ist, wird er auf hoch geändert. Wir verwenden diese Funktion, um die integrierte LED auf PB5 zu blinken.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
Verzögerungsfunktion
Im Gegensatz zu Arduino verfügt der kosmische Compiler nicht über eine vordefinierte Verzögerungsfunktion. Also müssen wir eins selbst erstellen. Meine Verzögerungsfunktion ist unten angegeben. Der Wert doe the delay wird in der Variablen ms empfangen und wir verwenden zwei for-Schleifen zum Halten oder Programmieren der Ausführung. Wie _asm ("nop") ist eine Montageanweisung, die für keine Operation steht. Dies bedeutet, dass der Controller in die for-Schleife einläuft, ohne eine Operation auszuführen, wodurch eine Verzögerung erzeugt wird.
void delay (int ms) // Funktionsdefinition {int i = 0; int j = 0; für (i = 0; i <= ms; i ++) {für (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // Keine Operation ausführen // Assembler-Code}}
Programm hochladen und testen
Nachdem unser Programm fertig ist, können wir es hochladen und testen. Nach dem Hochladen funktionierte meine Hardware wie erwartet. Die integrierte rote LED blinkte alle 500 Millisekunden und die externe grüne LED leuchtete jedes Mal auf, wenn ich den Schalter drückte.
Die komplette Arbeit finden Sie im unten verlinkten Video. Sobald Sie diesen Punkt erreicht haben, können Sie versuchen, den Schalter und die LED an verschiedene Pins anzuschließen und den Code neu zu schreiben, um das Konzept zu verstehen. Sie können auch mit dem Verzögerungszeitpunkt spielen, um zu überprüfen, ob Sie die Konzepte klar verstanden haben.
Wenn Sie Fragen haben, lassen Sie diese bitte im Kommentarbereich unten und für andere technische Fragen können Sie unsere Foren nutzen. Vielen Dank, dass Sie uns folgen. Wir sehen uns im nächsten Tutorial.