08. Arduino for Production!! How to Output to a Pin to Blink an LED on an ARM Microcontroller Part 3

08. Arduino für die Produktion!! Wie man einen Pin ausgibt, um eine LED auf einem ARM-Mikrocontroller blinken zu lassen Teil 3

Bevor wir zum Ein- und Ausschalten der LED kommen, möchte ich noch einmal auf das Modusregister zurückkommen. Dies kommt von einem Kommentar auf YouTube und besagt, dass das Register eine 0 und eine 1 enthalten muss, aber wir stellen nicht wirklich sicher, dass sich an der ersten Bitposition eine 0 befindet. Dies wollen wir sicherstellen, denn an anderer Stelle (vielleicht in einem Programm) haben wir das Register möglicherweise in einen analogen oder alternativen Funktionsmodus versetzt, wo es an der ersten Position eine 1 hat. Um sicherzustellen, dass sich an der ersten Stelle eine 0 befindet, müssen wir ein „und“ und ein „nicht“ auf das erste Bit anwenden. Werfen wir einen Blick auf die definierten Werte, die sie uns geben. Beim Aufruf der Deklaration sehen wir, dass es 3 gibt. Wir haben einen ohne 0 oder 1, einen mit 0 und einen mit 1. Halten wir dies im Programm als Referenz fest. Jetzt wissen wir, welche Modi mit 11, 01 und 10 zu verwenden sind. Wenn wir ein „und nicht“ mit der 10 machen, wird die erste Position zu einer 0, wodurch sichergestellt wird, dass die erste Position eine 0 ist. Wir ändern den MODER auf &= ~ auf dem Modus 1, um dies zu tun.

// Moder
GPIOC ->MODER |= GPIO_MODER_MODER6_0;
GPIOC &= ~(GPIO_MODER_MODE6_1);

Wir bestätigen, dass der Otyper nur ein einzelnes Bit ist, sodass wir uns darüber keine Sorgen machen müssen. Die Geschwindigkeit beträgt zwei Bit pro Pin. In diesem Fall ist es bei 11, sodass wir uns darüber keine Sorgen machen müssen. Der Pull-up-Pull-down ist ebenfalls 11, sodass er unverändert bleiben kann.

Jetzt sprechen wir über das Ein- und Ausschalten der LED. Schalten wir die LED mit dem BSRR-Register ein. Wir werden die gleiche GPIOC-Struktur verwenden. Es gibt ein BRR und ein BSRR, und wir werden zuerst das BSRR verwenden. Mit der bitweisen "oder"-Operation |= werden wir sehen, wo sich Port C befindet. Der Set befindet sich bei 6 und der Reset bei 22.



Es gibt verschiedene Möglichkeiten, dies zu tun. Wir können tatsächlich einfach GPIO eingeben, wie wir es zuvor getan haben, und da wir BSRR verwenden, würden Sie im Allgemeinen den Member aus dem GPIOC als nächste Anweisung nach dem Unterstrich verwenden. Wir werden hier das BSRR ausprobieren und zur Zahl 6 gehen. Sie können auch Dinge tun wie eine Verschiebung, 6 Positionen nach links, aber das müssen wir nicht wirklich tun, da es bereits für Sie angegeben ist (Hexadezimalzahl 40).

// Turn on the LED (BSRR)
GPIOC ->BSRR |= GPIO_BSRR_BS_6;

Jetzt schalten wir die LED aus. Wir werden das BRR, das Bit-Reset-Register, verwenden. Wir werden die bitweise "oder"-Operation und das Bit-Reset verwenden. Das BRR sollte nur das Bit-Reset haben, das die Nummer 6 ist.

// Turn off the LED (BRR)
GPIOC ->BRR |= GPIO_BRR_BR_6;

Nun müssen wir die Verzögerungen erstellen. Wir werden die erste Funktion erstellen, indem wir "void" und dann "WaitForAMoment" eingeben, wir werden hier dann einen Integer verwenden. Wir brauchen eine For-Schleife für eine Zeitverzögerung. Wir werden die Variablen vorher initialisieren, indem wir i = 0 verwenden. Wir werden das j erhöhen. Als Nächstes werden wir sicherstellen, dass es ein volatiles Integer ist. Solange i kleiner als der Moment ist, die Variable, die wir übergeben, wird es dies weiterhin tun. Wenn es dies nicht tut, wird es die For-Schleife verlassen und dem Programm ermöglichen, zum nächsten Befehl zu gehen.

// Create function to wait for a specified amount of time
void WaitForAMoment(int Moment)
{
volatile int i, j;

for (i=0; i < Moment; i++) {
j ++;
}
}

Wir werden "WaitForAMoment" mit einer Zahl von 200.000 einschließen. Die While-Schleife stellt sicher, dass es eine Endlosschleife ist.

// Wait
WaitForAMoment(200000);

Hier ist der Code bis zu diesem Punkt:

include "stm32f0xx.h"

// Create function to wait for a specified amount of time
void WaitForAMoment(int Moment)
{
volatile int i, j;

for (i=0; i < Moment; i++) {
j ++;
}
}

int main(void)
{
// Enable the GPIO Clock for Port C using the AHB and RCC
RCC ->AHBENR |= RCC_AHBENR_GPIOCEN;
// Set any Control Registers for PortC Pin 6
// Moder
GPIOC ->MODER |= GPIO_MODER_MODER6_0;
// OTyper
GPIOC ->OTYPER &= ~(GPIO_OTYPER_OT_6);
//OSpeedr
GPIO ->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR6;
// PUPDr
GPIOC ->PUPDR &= ~(GPIO_PUPDR_PUPDR6);

while(1)
{

// Turn on the LED (BSRR)
GPIOC ->BSRR |= GPIO_BSRR_BS_6;
// Wait
WaitForAMoment(200000);
// Turn off the LED (BRR)
GPIOC ->BRR |= GPIO_BRR_BR_6;
// Wait
WaitForAMoment(200000);

}

}

Nun sind wir bereit, unser Programm zu kompilieren (erstellen). Wir bemerken einige Fehler, also korrigieren wir diese zuerst. Wir gehen in den Boot-Ordner und suchen die Datei und verschieben sie in den richtigen Ordner. Der andere Fehler betrifft uns im Moment nicht, also sind wir bereit, den Mikrocontroller zu flashen. Wir schließen den ST-Link an und sehen, dass die LED blinkt.

Dies ist, wenn es an- und ausgeschaltet wird, das sind die 200.000 Iterationen für die for-Schleife. Ändern wir das und machen wir einen davon zu einem geringeren Wert. Wir wollen versuchen, dass es länger an ist, als es aus ist. Dazu gehen wir zurück ins Programm und ändern den Wert von 200.000 auf 100.000. Nehmen Sie die Änderung vor und erstellen Sie das Programm. Nun können wir die Änderungen sehen, die durch die Dauer des Blinkens der LED dargestellt werden.

Es gibt ein paar Dinge, die wir vor dem Ende dieses Videos ansprechen sollten. Wenn Sie Probleme beim Flashen des Mikrocontrollers haben, hilft Ihnen dies herauszufinden, was möglicherweise schiefgeht. Das erste Problem ist, wo Sie die Widerstände vom SWCLK und SWDIO haben, und diese entfernen, und wo sie an die Plus- und Minusschiene angeschlossen sind. Ich musste dies tun, als ich Windows 7 hatte, aber als ich auf Windows 10 aktualisierte, wurde dies zu einem Problem, obwohl es eine Reihe anderer Probleme hätte sein können. Ich verstehe, dass diese tatsächlich intern hochgezogen sind, sodass Sie diese Widerstände dort wirklich nicht benötigen. Das andere ist, dass Sie einen 510-Ohm-Widerstand, der mit Masse verbunden ist, an den Boot 0-Pin anschließen können, und der Boot 0-Pin ist Pin Nummer 60. Eine weitere Sache, die ich getan habe, war, die Masse und Plus vom ST Link-Interface so nah wie möglich an die Leiterplatte zu bringen, denn wenn Sie mit Steckplatinen arbeiten, können diese Störungen verursachen. Dies sind einige Korrekturen, die Sie untersuchen können, wenn Sie Probleme haben.

Nun sprechen wir darüber, was zu tun ist, wenn Sie den Mikrocontroller versehentlich "gebrickt" haben. Vielleicht gab es einen Fehler im Programm, durch den das Programm etwas Unerwartetes mit dem Mikrocontroller gemacht hat. Sie können auch den Boot 0 (Pin 60) hochziehen, indem Sie einen 10k-Widerstand an die positive Schiene anschließen. Während der Pin hochgezogen ist, führen Sie eine vollständige Speicherlöschung durch. Sie verwenden ein Programm namens ST-link utility. Suchen Sie es, laden Sie es herunter und installieren Sie es. Es ist sehr einfach. Sie können dieses Programm auch verwenden, um den Mikrocontroller zu programmieren, indem Sie die Datei laden und sie aus dem Debug- und der Binärdatei auswählen. Doppelklicken Sie darauf, und Sie haben das Programm. Es zeigt Ihnen auch den Gerätespeicher an, wenn es angeschlossen ist, sodass Sie auf "Connect to target" klicken können, und es zeigt Ihnen, was sich auf dem Mikrocontroller befindet. Die Einstellungen können über das im Video gezeigte Symbol aufgerufen werden. Der Modus sollte auf "normal" und "SWD" in den Verbindungseinstellungen eingestellt sein. Um einen vollständigen Chip-Löschvorgang durchzuführen, verwenden Sie das im Video gezeigte Symbol. Vielen Dank fürs Zuschauen.

[[TUTORIALMENU(tutorial-arm" frameborder="0" allowfullscreen>
Zurück zum Blog

Hinterlasse einen Kommentar