06. Arduino für die Produktion!! Wie man einen Pin ausgibt, um eine LED auf dem ARM Mikrocontroller blinken zu lassen Teil 1
Teilen
Der Zweck dieses Videos ist es, einfach die Ausgabe eines Signals an einem Pin an eine LED zu zeigen, wobei die LED ein- und ausgeschaltet wird. Wir werden also ein High-Signal an den Pin und ein Low-Signal an den Pin legen.
Das Ausgeben eines Signals an einem Pin ist das allgemeine Thema von GPIO (General Purpose Input and Output). Wir befassen uns an dieser Stelle nur mit der Ausgabe. Die Funktionen, Modi und die Steuerung allein der Ausgabe an einem Pin sind sehr umfangreich.
Es gibt zwei Hauptmodi, wenn man an einem Pin eines Mikrocontrollers ausgibt: Open Drain und Push-Pull. Es gibt drei Zustände für jeden Modus: Pull-Up, Pull-Down und None. Dies alles wird über Register gesteuert. Sie tun dies nicht tatsächlich extern, es geschieht intern im Mikrocontroller.
In einem Pull-Up-Szenario mit Open Drain gibt es einen Widerstand, der mit der positiven Stromquelle verbunden ist. Bei einem Open-Drain-Szenario haben Sie den Eingang, der von einem Pin des Mikrocontrollers kommt, dann haben Sie einen Transistor (auch Open Collector genannt). Sie haben das Signal, das vom Pin kommt, und dann haben Sie den Basiseingang, der im Wesentlichen den Transistor ein- oder ausschaltet. Im Ausgang haben Sie einen Pull-Up-Widerstand an der Leitung und Sie haben auch die Möglichkeit, Pull-Down zu betreiben. Abhängig von dem Signal, das Sie am Basiseingang haben, das vom Mikrocontroller kommt, wird dies das Ausgangssignal bestimmen, ob Sie einen Pull-Up- oder Pull-Down-Widerstand an dieser Leitung haben.
Es ist auch wichtig zu beachten, dass, wenn Sie mehrere Signale an einem einzigen Ausgang haben werden – zum Beispiel: Sie haben mehrere Mikrocontroller oder mehrere Pins von einem Mikrocontroller, die auf derselben Leitung zur Kommunikation gehen – es gut wäre, das Open-Drain- oder Open-Collector-Szenario zu verwenden.
Beim Arbeiten mit Open Drain ist es ziemlich wichtig, einen Pull-Up- oder Pull-Down-Widerstand zu verwenden, aber bei Push-Pull werden wir keinen Pull-Up- oder Pull-Down verwenden, wir werden den Zustand „none“ verwenden.
Für Ausgangs-Pins und den Push-Pull-Modus ist der Pull-Up- und Pull-Down-Widerstand nicht so wichtig wie bei einem Eingangs-Pin. Der Eingangs-Pin müsste einen Pull-Down- oder Pull-Up-Widerstand haben, damit der Pin nicht schwebt und Störungen empfängt. Um den PortC-Pin 6 in den richtigen Zustand für die Ausgabe zu versetzen, müssen wir vier verschiedene Register steuern, um ihn einzurichten. Das erste ist das Modusregister (ModeR), das zweite ist der Ausgangstyp (OtypeR), das dritte ist die Ausgangsgeschwindigkeit (OspeedR) und das letzte ist der Pull-Up-Pull-Down (PUPDR).
Das Modusregister (ModeR) steuert, ob Sie im Ausgabemodus, im Eingabemodus, mit der alternativen Funktion oder als Eingabe/Ausgabe-Analogtyp arbeiten. Wir werden den GP (General Purpose) verwenden. Der GP hat den Wert 01. Da es vier Arten von Modi gibt, benötigen Sie zwei Bits, um vier verschiedene Modi auszuwählen. Wir werden die drei Modi in zukünftigen Videos behandeln. Das Register für den Ausgabetyp (OtypeR) hat ein Bit, das entweder 0 oder 1 sein kann. Das bestimmt, ob es sich um Open Drain (OD) oder Push-Pull (PP) handelt.
In diesem Szenario wählen wir den PP. Der Typ ist gleich 0.
Das Ausgangsgeschwindigkeitsregister (OspeedR) hat drei verschiedene Geschwindigkeiten: niedrig, mittel und hoch. Wir werden uns diesmal mit der hohen Geschwindigkeit befassen, aber es spielt eigentlich keine Rolle, da wir nur eine LED auf langsame Weise ein- und ausschalten, so dass wir sie als Mensch wahrnehmen können. Die hohe Geschwindigkeit wird 11 sein. Die mittlere Geschwindigkeit ist 01 und die niedrige ist 10.
Nun kommen wir zum letzten Steuerregister, dem Pull-Up/Pull-Down-Register (PUPDR). Dies ist ein Zwei-Bit-Register, sodass Sie vier Optionen haben, aber eigentlich haben Sie nur drei Optionen: Pull-Up, Pull-Down und None. Die letzte Option ist reserviert. None oder No wird 00 sein. PU wird 01 sein. PD wird 10 sein. Wir werden None (00) verwenden.
Wir haben nur die Steuerregister zur Einstellung dieses Pins besprochen, wir haben noch nicht wirklich darüber gesprochen, wie man tatsächlich an den Pin ausgibt. Wir werden 01010101.... ausgeben. Wir lassen eine LED blinken, also werden wir nur diese Art von Stream mit Verzögerungen dazwischen ausgeben. Es gibt ein paar Möglichkeiten, dies zu tun. Die Methode, die wir in diesem Video verwenden werden, ist das Setzen von Bits im BSRR-Register. BSRR steht für Bit Set Reset Register.
Dieses Register hat 32 Bits; wie Sie wissen, haben die Ports nur 16 Pins, warum sollte das BSRR dann 32 Bits haben? Der Grund ist, dass das Setzen und Zurücksetzen getrennt sind, so dass Sie einen Pin setzen können, und dieser hat 16 Bits, und es gibt 16 Bits im Zurücksetzen. Sie weisen also nicht tatsächlich eine 0 einem Pin zu, um ihn auszuschalten, Sie weisen tatsächlich eine 1 dem Zurücksetzungsabschnitt der 32-Bit-Zahl zu. Schauen wir uns eine 32-Bit-Zahl an. Es gibt 16 Bits auf einer Zeile und 16 Bits auf einer anderen Bit. Die obere linke 0 ist das 32. Bit und die untere rechte 0 ist das 0. Bit. So nummerieren Sie auf der Tabelle die Pins von 0 bis 15, wie im Video gezeigt. Wenn wir also Pin Nummer 6 einschalten wollten, würde ich den Pin beeinflussen, indem ich eine 1 darin platziere. Wenn ich den Pin zurücksetzen oder den Pin nichts ausgeben lassen wollte, würde ich die 1 in die obere Spalte setzen. Das Setzen einer 1 im Zurücksetzungsabschnitt dieser 32-Bit-Zahl ist nicht sehr einfach, und wir müssten einige Verschiebungen und ähnliches verwenden, also werden wir das für ein späteres Video lassen. Stattdessen verwenden wir jetzt das BRR, das Bit Reset Register. Es verhält sich genau wie der 0-15-Abschnitt des Sets und ist ein 16-Bit-Register, so dass, wenn Sie Bit Nummer 6 auf einem nullbasierten Index im BRR setzen, Sie zurücksetzen würden, als ob Sie die andere Methode verwendet hätten.
Ich denke, wir wissen genug über die Steuerung der Register zur Steuerung der GPIO-Ausgangspins und genug darüber, wie man den Pin selbst steuert, also lasst uns mit der Programmierung beginnen.
Wir werden CoIDE starten und ein neues Projekt beginnen.
Klicken Sie auf dem Willkommensbildschirm auf den Link „Create a New Project“ (Neues Projekt erstellen).
Wir verwenden den Mikrocontroller STM32F030R8. Klicken Sie auf diesen Mikrocontroller-Link, und ein Informations- und Options-Bubble wird erscheinen.
Klicken Sie auf „new project“ und benennen Sie die Datei.
Wir nennen es LEDBlinkPortC6.
Nachdem Sie das Projekt benannt haben, müssen Sie nun die Bibliothek hinzufügen, die für dieses GPIO-Projekt verwendet wird. Da wir nur eine einfache Ausgabe an einen Pin vornehmen, muss die stm32f030x8_boot hinzugefügt werden, wodurch auch automatisch die cmsis-Bibliothek hinzugefügt wird.
Lasst uns in unsere main.c springen. Wir haben unseren Skelettcode.
{
{
}
Wir werden nun Pseudocode einfügen, damit wir den allgemeinen Aufbau des Programms festlegen können, ohne echten Code eingeben zu müssen. Innerhalb der Hauptroutine werden wir viel Kontrolle nach dem Codeblock für die Int-Main und vor der Never-Ending-Schleife der While ausüben. Im „While“ werden wir die LED einschalten, warten, die LED ausschalten und wieder warten. Die Wartefunktion kann außerhalb der Main erstellt werden, da dieser Code wiederholt wird. Die angegebene Zeitmenge kann tatsächlich etwas sein, das in diese Funktion eingebracht wird. Wie Sie aus den AVR-Videos wissen, können wir die Funktion oben erstellen und müssen keine Prototypfunktion einfügen, oder wir können die Funktion am Ende einfügen, wobei der Hauptteil oben steht, aber dann die Prototypen hier oben platziert werden.
int main(void)
{
while(1)
{
// Wait
// Turn off the LED
// Wait
Jetzt werden wir die Register einfügen, die wir verwenden werden. Die vier Register, die wir verwenden, sind Moder, OtypeR, Ospeedr, PUPDr. Unter dem „while“ werden wir das BSRR zum Einschalten und das BRR zum Ausschalten verwenden. Im nächsten Video werden wir den Pseudocode mit echtem Code bevölkern.
int main(void)
{
// Moder
// OTyper
// OSpeedr
// PUPDr
while(1)
{
// Wait
// Turn off the LED (BRR)
// Wait
[[TUTORIALMENU(tutorial-arm" frameborder="0" allowfullscreen>