Neu hinzugefügte Artikel
22.11.2024:
Bereits im März 2023 hat mich der Leser Lukas Rumpel über seine von ihm entwickelte MCAL-Adaption für den STM32-F1xx-Familie informiert. Beim Durchlesen gesammelter Leser-Fragen zu meinem Buch bin ich erneut auf diese Email gestoßen. Da ich selbst bisher keinen STM32F1xx verwendet habe, habe ich sie selbst bisher nicht verwendet und kann ihre Qualität daher nicht bewerten. Für alle, die an dieser Bibliothek interessiert sind, veröffentliche ich hier den entsprechenden Link: https://github.com/lukasrumpel/SHALF1.
14.05.2024:
An dieser Stelle informiere ich Sie über einen wichtigen Hinweis, den ich aus China erhalten habe! Ich halte diesen Hinweis für derart wichtig, dass ich ihn in Fettschrift folgendermaßen zusammenfasse:
Eine mir völlig unbekannte Firma hat sich die Rechte an den Domänen ralf-jesse.cn, ralf-jesse.asia und weiteren asiatischen Domänen (.com.cn, .com.hk und .com.tw) gesichert. Ich weise ausdrücklich darauf hin, dass diese Domänen absolut nichts mit mir zu tun haben! Meine Vermutung geht in die Richtung, dass diese Firma mir die Rechte an diesen Domänen verkaufen möchte, was ich aber mit Sicherheit nicht tun werde.
01.04.2024:
Einmal mehr hat mich ein Leser auf einen Fehler im Beispiel Kap11-GPTIM-03-PWM-TIM2 (Abschnitt 11.2.2) aufmerksam gemacht, der aber erst in der zweiten Auflage des STM32-Buches auftritt, und für die erste Auflage nicht relevant ist: In der Bare-Metal-Version muss von den Parametern für das Auto-Reload- und das Prescaler-Register jeweils '1' subtrahiert werden. Die MCAL-Version führt diese Subtraktion bereits intern durch, im Bare-Metal-Teil von Listing 11.4 fehlt diese Korrektur allerdings.
12.12.2023:
In Abschnitt 9.2 meines Buches (8.2 in der ersten Auflage) finden Sie in der Hinweisbox die Aussage, dass es sich beim SysTick-Timer um einen 24-Bit-Timer handelt, der − wird er mit einer Frequenz von 1000 Hz entsprechend einer Periodendauer von 1 ms getaktet − nach etwa 4,66 Stunden überläuft und somit für einen Dauerbetrieb nicht gut geeignet ist. Diese Aussage ist und bleibt auch korrekt! Wenn Sie aber das Beispiel Kap09-SysTick-02 (bzw. Kap08-SysTick-02, 1. Auflage) genauer betrachten, so werden Sie erkennen, dass in der Interrupt-Service-Routine die Variable 'tick' inkrementiert wird, die vom Typ uint16_t ist: Der maximale Wert, den sie annehmen kann, ist 65535, sodass sie sogar bereits nach etwas mehr als 65 Sekunden überläuft. Wenn Sie die Aussage in dem erwähnten Hinweis gedanklich mit dem Beispiel verbinden, so könnte Sie dies also in die Irre führen!
Dass der SysTick-Timer also ein 24-Bit-Timer ist, spielt hier also gar keine Rolle. Das Problem eines Überlaufs hängt also nur vom Datentyp der tick-Variable ab. Dies heißt aber auch, dass die Verwendung einer uint32_t-Variablen ebenfalls keine gute Lösung darstellt: Sie verlagert das Problem (bei gleicher Tick-Frequenz) nur in den Bereich von etwa 49,7 Tagen.
Es handelt sich also nicht um einen Fehler im Buch, könnte beim oberflächlichen Lesen aber irritierend sein. Beachten Sie aber bitte auch, dass es sich um ein einführendes Beispiel handelt, von dem ich im Buch auch sage, dass die Lösung nicht optimal ist. Die weiteren Beispiele führen am Ende zu einem Lösungsansatz, der Sie von der Datenbreite der verwendeten Variable nahezu unabhängig macht. Wenn Sie beispielsweise eine weitere uint32_t-Variable so mit der tick-Variablen verbinden, dass die zweite Variable nur inkrementiert wird, wenn die erste Variable überläuft. Auf diese Weise könnten Sie einen Timer programmieren, der 232 mal inkrementiert wird, wenn die erste Variable bis 232 gezählt hat. Mit anderen Worten: Der Timer läuft dann erst nach 213.503.982.334 Tagen ab! Umgerechnet sind dies (bezogen auf 360 Tage pro Jahr) also etwas mehr als 593 Millionen Jahre: Die hierüber hinausgehenden 66617,6 Jahre kann man da sicherlich vernachlässigen: Für die meisten Anwendungen sollte dieser Ansatz mit Leichtigkeit völlig reichen ;).
15.09.2023:
Auf den Hinweis eines Besuchers meiner Webseite habe ich die Artikel Schalten kleinerer und größerer Ströme und Einfache Halbleiter, Dioden vollständig überarbeitet.
29.06.2023:
Ein anderer aufmerksamer Leser hat mich auf einen weiteren Fehler zum Thema "Alternative Funktionen" hingewiesen. Dieser Fehler hat keine praktischen Auswirkungen, da hier nur gezeigt werden sollte, dass nicht alle Definitionen der CMSIS perfekt sind (meine Meinung).
Ich hatte dort (Seite 137/138 in Auflage 1 bzw. Seite 171/172 in Auflage 2) beispielhaft Pin PA6, der als MISO von SPI1 genutzt werden soll, folgendermaßen konfiguriert:
GPIOA->AFR[0] = GPIO_AFRL_AFSEL_5_0 | GPIO_AFRL_AFSEL_5_2;
Die "5" bezeichnet aber den zu konfigurierenden Pin! Korrekterweise müsste dort also Folgendes stehen
GPIOA->AFR[0] = GPIO_AFRL_AFSEL_6_0 | GPIO_AFRL_AFSEL_6_2;
Die Bits 0 und 2, die hier gesetzt werden, ergeben den Wert 0b0101 (also 5). Und dies ist die Nummer der alternativen Funktion.
Meine MCAL-Bibliothek behandelt die Zuweisung einer alternativen Funktion an einen beliebigen Pin aber korrekt!
24.05.2023:
Ein aufmerksamer Leser hat mich zum Thema "Auswahl alternativer Funktionen" in Abschnitt 8.3 (die Kapitelnummer bezieht sich hier auf die zweite Auflage des Buches, in der ersten Auflage handelt es sich um Abschnitt 7.3) auf eine sehr schlechte und tatsächlich sogar falsche Formulierung aufmerksam gemacht!
Ich schrieb dort: "Mit dem Register GPIO_AFRL konfiguriert man somit die alternativen Funktionen AF0 bis AF7, und mit GPIO_AFRH entsprechend die alternativen Funktionen AF8 bis AF15." Das ist nicht korrekt!
Richtig ist: Mit GPIO_AFRL wird den GPIO-Pins 0 bis 7 des betreffenden GPIO-Ports eine von (theoretisch) 16 alternativen Funktionen zugewiesen, GPIO_AFRH wird entsprechend für die GPIO-Pins 8 bis 15 eingesetzt.
Die Beispiele im weiteren Verlauf des Buches funktionieren aber korrekt! Ich bitte Sie um Entschuldigung.
14.04.2023:
Da ist doch schon wieder mehr als ein halbes Jahr vergangen, wo ich keine Zeit fand, die MCAL-Bibliothek zu erweitern. Da ich aber bei meinem Arbeitgeber gerade heute ein neues Projekt mit dem STM32F446 begonnen habe, ist für den mcalSPI-Teil doch mal wieder eine neue Funktion "abgefallen"!
Konnte man den SPI-Controller bisher ausschließlich mit der Funktion spiInitSPI(...) mit ihren acht Parametern konfigurieren, ich aber eine einfachere Möglichkeit benötige, zwischen Master- und Slave-Betrieb wechseln zu können, habe ich kurzerhand die neue Funktion spiSetOpMode(SPI_Typedef *spi, SPI_OPMODE_t opMode) zur MCAL hinzugefügt. Wie gewohnt können Sie die aktualisierte MCAL-Bibliothek kostenlos unter https:\\gitlab.com\rjesse\mcal-stm herunterladen.
Da die MCAL bisher den SPI-Bus nur schreibend (der STM32F446 war bisher also ausschließlich als Master einsetzbar), das neue Projekt aber auch lesenden Zugriff benötigen wird, sind in Kürze weitere Funktionen zu erwarten.
18.09.2022:
Nach starker beruflicher Einspannung in ein Projekt bei meinem Arbeitgeber mit anschließender mehrwöchiger Nichtverfügbarkeit meines Internetzugangs aufgrund von Wartungsarbeiten meines Internet-Providers finde ich nun endlich die Zeit, ein kleines Versäumnis meinerseits zu beheben! Ich war der festen Überzeugung, dass ich die Beschreibung zur Erstellung von Projekten (Bibliotheken und ausführbare Dateien) in der zweiten Auflage meines Buches vollständig überarbeitet hatte. Nun haben mich Leser darauf aufmerksam gemacht, dass ein Bestandteil in dieser Anleitung fehlt, der sie etwas verwirrt hatte:
Der allererste Schritt bei der Erstellung eines neuen Projekts, den ich zu beschreiben vergaß, besteht darin, dass STM32CubeIDE, sobald Sie mit "File --> New STM32 Project" ein neues Projekt beginnen, den sogenannten Target Selector anzeigt. Er sorgt dafür, dass zunächst die Ziel-MCU aus einem komfortabel gestalteten Dialog ausgewählt werden kann. Das ist bereits alles. Alle weiteren Schritte erfolgen auf die gleiche Weise, wie ich sie im Buch beschrieben habe. Die korrigierte Version der Datei CMSIS-erstellen.pdf finden Sie zum Download unter 08 - CMSIS erstellen (neue Version).
09.07.2022:
Herr Klingner hat mich als aufmerksamer Leser auf einen Fehler in der Datei MCAL/SRC/mcalTimer/verification.c hingewiesen. In der Funktion bool timerVerifyTimerMSM(TIMER_MSM_MODE_t msm) hatte ich bei der Verifizierung der MSM_ENCODER zweimal MSM_ENCODER_2_MODE getippt, korrekt wäre bei der zweiten Verwendung aber MSM_ENCODER_3_MODE gewesen. Die vollständige Funktion muss korrekt also folgendermaßen lauten:
bool timerVerifyTimerMSM(TIMER_MSM_MODE_t msm)
{
if ((MSM_DISABLED_MODE != msm) && (MSM_ENCODER_1_MODE !=msm) &&
(MSM_ENCODER_2_MODE != msm) && (MSM_ENCODER_3_MODE != msm) &&
(MSM_RESET_MODE != msm) && (MSM_GATED_MODE != msm) &&
(MSM_TRIGGER_MODE != msm) && (MSM_EXT_CLK_MODE != msm))
{
return false;
}
return true;
}
Ich habe diesen Fehler in der MCAL bereits korrigiert, sodass Sie die aktuelle Version ab sofort von meinem GitLab-Account (https://gitlab.com/rjesse/mcal-stm) herunterladen können.
20.05.2022:
Vor etwa einer Woche wurde die zweite Auflage meines Buches "STM32 ARM-Mikrocontroller programmieren für Embedded Systeme" veröffentlicht. Unterschiede zur ersten Auflage, die nach nur einem Jahr nahezu ausverkauft war, beziehen sich im Wesentlichen auf die erhebliche Erweiterung der MCAL-STM-Bibliothek, mit deren Entwicklung ich beim Schreiben der ersten Auflage begonnen hatte. Nun könnten Leser sich berechtigterweise ärgern, die sich erst kürzlich noch die erste Auflage gekauft haben, weil sie – hätten sie nur einen Monat gewartet – "automatisch" die zweite Auflage erhalten hätten. Daher erneuere ich gegenüber allen Käufern der ersten Auflage (und natürlich auch den Käufern der zweiten Auflage) mein Angebot, sie weiterhin unter der im Buch genannten Email-Adresse bei der Lösung von Schwierigkeiten zu helfen. Antworten auf Fragen, die für die Allgemeinheit von Interesse sind, veröffentliche ich daher regelmäßig auf dieser Webseite. Hier werden Sie auch die wichtigsten Informationen zum Einstellen der Systemtaktfrequenz SYSCLK finden, die in der zweiten Auflage als völlig neu geschriebenes Kapitel 5 hinzugekommen sind. Ein weiterer wichtiger Unterschied betrifft die Beispielprojekte: Inhaltlich und funktionell sind sie unverändert! Ich habe sie aber nun so erweitert, dass (nahezu) alle Projekte sowohl die MCAL-Version wie auch die unmittelbare Programmierung über die MCU-Register enthalten. Sie müssen zum Umschalten zwischen beiden Varianten nur die Quelltextzeile '#define MCAL' entweder mit Kommentarzeichen versehen oder diese eben entfernen. Um die Änderungen dann zu aktivieren, müssen Sie das Projekt nur noch kompilieren und linken, das ist alles!
Ich wünsche Ihnen viel Spaß und Erfolg mit der zweiten Auflage meines Buches.
27.03.2022:
Ich hatte total vergessen, die versprochenen PDF-Dateien mit Flussdiagrammen für den Schreib- und den Lesezugriff auf I²C-Komponenten auf meiner Webseite zur Verfügung zu stellen. Unter 09 - I2C zum Zweiten hole ich das Versäumte nach.
24.03.2022:
Kleine Korrekturen an den Inhalten einzelner Seiten durchgeführt. Inhaltlich hat sich nichts geändert!
01.03.2022:
Fehler im Artikel "Induktive Lasten" korrigiert.
19.02.2022:
Vereinzelt schrieben mich Leser an, die Schwierigkeiten beim Erstellen der CMSIS-Bibliothek hatten. Dies veranlasste mich bereits vor längerer Zeit zur Überarbeitung der Beschreibung. Unter 08 - CMSIS erstellen (neue Version) finden Sie die optimierte Beschreibung als PDF-Datei zum Download. Viel Erfolg damit.
01.01.2022:
Zunächst einmal wünsche ich allen Lesern ein gutes neues Jahr 2022!
Am 23.12.2021 habe ich Sie darüber informiert, dass die Beispielprojekte aus meinem Buch mit der aktuellen Version der Entwicklungsumgebung STM32CubeIDE (V1.8) nicht mehr funktionieren. Der Grund hierfür ist, dass der Linker die Datei system_stm32f4xx.c nicht mehr findet. Um das geschilderte Problem zu umgehen, habe ich Ihnen empfohlen, diese Datei manuell in die verschiedenen Projekte zu kopieren.
Um Sie von dieser Arbeit zu entlasten, habe ich die Beispiele noch einmal überarbeitet und diese Arbeit für Sie übernommen. Im Downloadbereich finden Sie daher nun drei Dateien mit den Beispielprojekten. Anwender der Versionen 1.7 und 1.8 (vermutlich gilt dies auch für zukünftige Versionen der IDE) finden die überarbeiteten Beispiele hier unter der Bezeichnung Buchbeispiele-für-STM32CubeIDE-V1-8.zip.
25.12.2021:
Wenn Sie sich das Beispiel Kap13-Einfaches-DAC-Projekt genauer anschauen, wird Ihnen vielleicht ein Fehler auffallen, der sich hier zwar nicht kritisch auswirkt, in aufwendigeren Projekten aber sehr unangenehme Seiteneffekte verursachen kann. In den Zeilen 35 und 36 habe ich die Variablen dac1Data und dac2Data als uint16_t-Typen festgelegt. In Zeile 97 können Sie aber erkennen, dass ich bei der Auswertung der Variablen dac2Data auf '<= 0' teste. Nur: Eine uint16_t-Variable kann nicht kleiner als 0 werden! Ändern Sie bitte daher in den Zeilen 35/36 die Datentypen bitte von uint16_t in int16_t.
Der Fehler wirkt sich hier nicht aus, da auch die Gleichheit mit 0 die Richtungsumkehr des Signals auslöst. Hätte ich hier aber auf '< 0' getestet, wäre diese Bedingung niemals erfüllt worden. Es ist also ein böser Fehler, der mir da unterlaufen ist.
23.12.2021:
Möglicherweise haben Sie selbst bereits bemerkt, dass in der Zwischenzeit die Version 1.8 der STM32CubeIDE veröffentlicht wurde. Hier tritt aber ein Problem auf, wenn Sie beispielsweise den SysTick-Timer mit der noch unter der Version 1.6.1 entwickelten MCAL verwenden wollen:
Die neue STM32CubeIDE-Version (das Problem tritt übrigens auch mit der Vorgängerversion 1.7 auf) fügt die Datei system_stm32f4xx.c nicht mehr standardmäßig zu neu erstellten Projekten hinzu. Diese Datei enthält aber die CMSIS-Funktionen SystemCoreClockUpdate() und SysTick_Config(), die der Linker dann natürlich nicht mehr findet und daher keine ausführbare Binärdatei erstellt.
Einfachste Form der Abhilfe: Fügen Sie die Datei system_stm32f4xx.c durch einfaches Kopieren manuell zu Ihren Projekten hinzu. Die Datei finden Sie im Verzeichnis CMSIS\Device\ST\STM32F4xx\Source\Templates.
Jetzt bleibt mir nur noch übrig, allen Lesern und Besuchern dieser Webseite ein schönes Weihnachtsfest und alles Gute für das neue Jahr zu wünschen.
18.12.2021:
Ich wurde von Lesern angeschrieben, die Schwierigkeiten mit der Umsetzung eines Mikrosekunden-Delays hatten. Das war für mich Grund genug, mich selbst noch einmal mit dieser Thematik zu befassen. Unter 07 - 1-Mikrosekunden-Timer finden Sie eine Beschreibung für die Lösung, die ich mit der MCAL entwickelt habe. Die Lösung finden Sie dort und zusätzlich auch noch einmal im Downloadbereich.
01.11.2021:
Ich hatte zuletzt nicht viel Zeit, mich um meine Webseite (und die Weiterentwicklung der MCAL-Bibliothek) zu kümmern. Heute ist es aber wieder einmal so weit.
Im Abschnitt Mikrocontroller unter 01 - Takteinstellung mit der MCAL-Bibliothek sind mir zwei Dinge aufgefallen:
- Ursprünglich enthielt die MCAL-Bibliothek das Modul mcalSystem.h/mcalSystem.c. Es enthielt Funktionen, die zur Einstellung des Systemtakts entwickelt wurden. Da die MCAL aber eine Bibliothek ist, die sich an den Peripheriekomponenten des STM32F446 orientiert und dieser keine Komponente mit der Bezeichnung System enthält, habe ich zwei neue Module mit den Bezeichnungen mcalFlash.h/mcalFlash.c und mcalRCC.h/mcalRCC.c entwickelt. mcalFlash dient zur Konfiguration der Flash-Waitstates, die vom gewünschten Systemtakt abhängig sind, und mcalRCC enthält alle anderen benötigten Funktionen. Es handelt sich hierbei um 1:1-Kopien der Funktionen, die früher in mcalSystem enthalten waren. Der Unterschied: Die Funktionsnamen beginnen nun nicht mehr mit sys, sondern mit flash bzw. rcc. Aus sysConfigWaitStates() wurde somit also flashConfigWaitStates() und aus sysEnableHSI() wurde entsprechend rccEnableHSI().
- Beim Upload des Beispielprojekts, das ich als Demo zur Einstellung des Systemtakts entwickelt hatte, ist ein Fehler aufgetreten, den ich erst heute bemerkt habe: Das Projekt war genau 0,0 Byte groß. Diesen Fehler habe ich behoben.
Die bereinigte Version der MCAL-Bibliothek steht ab sofort auf https://gitlab.com/rjesse/mcal-stm.git zum Download bereit. Die Versionsnummer wurde von 0.4 nach 0.5 geändert.
03.09.2021:
Die Beispielprojekte zum STM32F4xx-Buch liegen nun in zwei Versionen vor, die Sie im Download-Bereich finden:
- Beispielprojekte-Buchversion.zip: Verwenden Sie diese Beispielprojekte, wenn Sie die MCAL-Bibliothek verwenden, wie sie im Buch beschrieben ist.
- Beispielprojekte-Aktuelle-MCAL.zip: Verwenden Sie diese Beispielprojekte, wenn Sie die MCAL-Bibliothek in ihrer aktuellen Version einsetzen.
Wie bereits mehrfach hier im News-Block erwähnt, hat sich die MCAL-Bibliothek gegenüber dem Zeitpunkt, als das Buch erschien (28.02.2021), erheblich geändert. Es sind nicht nur viele neue Funktionen hinzugekommen, teilweise wurden auch Funktionen und ihre Anwendung stark modifiziert.
Die Versionen Beispielprojekte-Buchversion.zip und Beispielprojekte-Aktuelle-MCAL.zip sind NICHT kompatibel zueinander!
11.08.2021:
Ich habe die Zeit genutzt, den I2C-Teil der MCAL-Bibliothek um neue Funktionen zu erweitern. Die neuen Funktionen sind allerdings noch nicht vollständig getestet, sodass hier Änderungen derzeit nicht ausgeschlossen sind. Ich bemühe mich allerdings, die (möglicherweise) erforderlichen Anpassungen und Korrekturen intern so zu gestalten, dass sie transparent sind: Es wird angestrebt, dass bestehende bzw. neuentwickelte Anwendungen der Leser nicht angepasst werden müssen!
Nähere Information finden Sie unter 06 - I2C: Wichtige Information.
26.07.2021:
Die MCAL wurde um die ADC-Funktion adcSetChannelSequence(ADC_TypeDef *adc, ADC_CHANNEL_t *chnList, size_t seqLen) erweitert. Wenn Sie in einem Projekt mehrere analoge Sensoren (max. 16 Sensoren) nacheinander abfragen müssen, so können Sie mit ihrer Hilfe die Kanäle in beliebiger Reihenfolge in einem Array vom Typ ADC_CHANNEL_t in einer Sequenz (siehe Abschnitt 13.2 im STM32-Buch) festlegen. Einzelne Kanäle können auch mehrfach angegeben werden. Die Funktion gibt einen Fehlercode zurück, wenn die Anzahl der Kanäle > 16 ist.
Mit adcStartConversion(ADC_TypeDef *adc) und adcIsConversionFinished(ADC_TypeDef *adc) verfügt die MCAL nun über zwei weitere ADC-Funktionen. Die Funktion adcGetConversionResult(ADC_TypeDef *adc) habe ich jetzt so modifiziert, dass sie das Ergebnis unmittelbar als uint16_t-Wert zurückgibt.
In der Zwischenzeit habe ich viele der Beispiel-Projekte aus meinem STM32-Buch an die aktuelle Version der MCAL angepasst. Nähere Informationen finden Sie im letzten Abschnitt auf der Download-Seite zum Buch.
24.07.2021:
Die MCAL enthält zwei neue Timer-Funktionen, die die Funktionalität der Advanced Control Timer erweitern.
Mit timerSetCaptureCompareClockRatio(TIM_TypeDef *tim, TIMER_CHANNEL_NUM_t chn, TIMER_RATIO_t ckd) kann das Verhältnis zwischen Timer-Takt und Sampling-Rate für jeden Timer-Kanal eingestellt werden.
Die zweite neue Funktion ermöglicht die Einstellung der Totzeit (Dead time) bei den Advanced Control Timern TIM1 und TIM8. Sie heißt timerSetBreakAndDeadTime(TIM_TypeDef *tim, uint8_t deadTime) und konfiguriert den Totzeit-Generator.
18.07.2021:
Bei der Überarbeitung eines EXTI-Beispiels ist mir ein böser Fehler in der Datei stm32f446.h aufgefallen! Hierfür wollte ich Pin 8 von GPIOB verwenden. Während die MCAL-Version auf Anhieb funktionierte, hat dies mit der Bare-Metal-Version (unter Verwendung der CMSIS-Definitionen von STM) nicht geklappt. Bei der Untersuchung des Problems fiel mir auf, dass der Wert GPIO_MODER_MODE8_Msk fälschlicherweise zu GPIO_MODER_MODER2_Msk definiert wurde. Korrekt wäre aber GPIO_MODER_MODER8_Msk! Nach der Korrektur funktionierte dann auch die Bare-Metal-Version.
Der gleiche Fehler ist auch in der Headerdateien der anderen STM32F4xx-Mikrocontroller enthalten!
23.06.2021:
Die Dokumentation der MCAL-STM wurde um alle Definitionen und Enumerationen erweitert. Der Download erfolgt wie gewohnt von https://gitlab.com/rjesse/mcal-stm.git.
16.06.2021:
Die MCAL wurde in drei Bereichen aktualisiert:
- mcalSysTick: Die Verwendung der Funktionen systickSetMillis() und systickSetMicros() wird nicht mehr empfohlen. Verwenden Sie stattdessen die neue Funktion systickSetTicktime(). Funktional ist die neue Funktion absolut identisch zu den beiden vorgenannten.
- mcalSystem: Die Funktion sysSetAPBPrescaler() soll nicht mehr verwendet werden. Hier wurde die APB1-Taktfrequenz unmittelbar von der APB2-Taktrate abgeleitet. Mit den neuen Funktionen sysSetAPB1Prescaler() und sysSetAPB2Prescaler() lässt sich der APB1- bzw. APB2-Takt unabhängig voneinander einstellen.
- CMSIS: Am 20.05.2021 hatte ich darüber informiert, dass der Wert HSE_VALUE in der Datei system_stm32f4xx.c, die Bestandteil der CMSIS-Bibliothek ist, herstellerseitig auf 25MHz eingestellt ist. Da ich als externe Taktquelle den auf dem NUCLEO-Board verwendeten 8MHz-Quarz verwende, habe ich HSE_VALUE in der genannten Datei auf den Wert ((uint32_t)8000000) eingestellt. Beachten Sie hier unbedingt noch einmal den Abschnitt !!!ACHTUNG!!! in Artikel 01 - Takteinstellung beim STM32F446 mit der MCAL-Bibliothek.
Die neue Version der MCAL-Bibliothek ist bereits auf https://gitlab.com/rjesse/mcal-stm.git verfügbar!
07.06.2021:
Die MCAL-Bibliothek ist seit Erscheinen des STM32-Buches erheblich gewachsen. Wie ich bereits früher erwähnte, ließ es sich nicht vermeiden, einige Funktionen umzubenennen oder, wie es z.B. im mcalTimer-Teil geschah, komplett umzustrukturieren. Dies hat zur Folge, dass viele MCAL-Beispiele, die im Buch gezeigt werden, auf die neue MCAL-Version portiert werden müssen. Damit Sie als Leser/Anwender der MCAL diese Änderungen der MCAL in eigenen Projekten berücksichtigen können, habe ich sämtliche Beispiele bis einschließlich Kapitel 11 neu entwickelt und an die neue MCAL angepasst. Sie können die aktualisierten Beispiele im Downloadbereich herunterladen.
Natürlich müssen Sie dann auch die aktuelle Version der MCAL von https://gitlab.com/rjesse/mcal-stm.git verwenden.
02.06.2021:
Ich habe in mcalGPIO drei neue Funktionen hinzugefügt, die wahlweise die Bits 0...7, 8...15 oder 0...15 auf den angegebenen Wert setzen. Die Funktionen heißen entsprechend gpioSetLowerByte(GPIO_TypeDef *port, uint8_t byte), gpioSetUpperByte(GPIO_TypeDef *port, uint8_t byte) und gpioSetWord(GPIO_TypeDef *port, uint16_t word).
Diese Funktionen sind nicht thread-safe!
31.05.2021:
Auf Anregung einer Leserin meines STM32-Buches habe ich die Header-Dateien der MCAL für den Einsatz unter C++ so erweitert, dass sie jetzt auch mit der Programmiersprache C++ einsetzbar ist. Dies betrifft allerdings nur die Nutzbarkeit unter C++: Objektorientiert wird sie hierdurch nicht! Den Download der aktuellen Version finden Sie wie gewohnt unter https://gitlab.com/rjesse/mcal-stm.git.
20.05.2021:
Wichtige Information: Wenn Sie die MCAL-Funktion setupSystemClock() zur Einstellung der System-Taktfrequenz verwenden, beachten Sie unbedingt den mit !!!ACHTUNG!!! hervorgehobenen Hinweis im Artikel 01 - Takteinstellung beim STM32F446 mit der MCAL-Bibliothek!
19.05.2021:
Nun hat es mich erwischt! Nein, nicht Corona, sondern eine schlechte Rezension meines Buches bei Amazon! Da hat sich der Rezensent erlaubt, "Halbwissen" bei mir nicht auszuschließen, obwohl ich mehr als 30 Jahre Berufserfahrung im Bereich der Programmierung von Mikrocontrollern habe. In der Tat: Der Rezensent läge richtig (Achtung: Konjuktiv!), wenn er mein Beispiel (siehe Listing 5.2) als nicht sonderlich glücklich bezeichnet hätte, denn ein "|="- bzw. "&="-Zugriff auf ein Register hat tatsächlich normalerweise einen Read-Modify-Write-Zugriff zur Folge: Insofern hätte ich tatsächlich besser einfache "="-Zuweisungen der Werte verwendet. Allerdings habe ich auf genau diesen Umstand auf den Seiten 97 bis 99 meines Buches (Abschnitt 5.2) ausdrücklich hingewiesen! Das einzige, was ich mir selbst hier vorwerfen kann, ist die etwas "schlampige" Realisierung des Beispiels.
Nun aber zum "Halbwissen": Offensichtlich sieht sich der Rezensent selber als absolute Koryphäe, denn sonst würde er sich nicht so abwertend über andere Menschen äußern (die er zudem nicht persönlich kennt!), wie er dies in seiner Rezension getan hat. Wenn er denn aber tatsächlich die absolute Koryphäe wäre, hätte er sicher bemerkt, dass das genannte BSRR-Register ein reines Write-Only-Register ist. Nun sollte er sich auch dazu äußern, wie man zuverlässig lesend auf ein Write-Only-Register zugreifen kann. Aber vermutlich ist dies ein unter allen Umständen zu wahrendes Geheimnis eben solcher Koryphäen.
Zum Thema "Separates Herunterladen der CMSIS":
Sicher, die CMSIS ist in den Firmware-Paketen enthalten (sonst wäre es ja auch keine Firmware!), und wie die Pfade gesetzt werden, habe ich ebenfalls beschrieben. Da besteht also überhaupt kein Unterschied zu der von diesem Rezensenten offensichtlich bevorzugten Vorgehensweise. Ich bevorzuge aber — begründet auf langjähriger Erfahrung — einen etwas anderen Weg. Wenn man in großen Teams arbeitet — bei der Softwareentwicklung im Automotive- oder Luftfahrtumfeld kommen hier sehr schnell Teamgrößen von 50, 60 100 und mehr Entwicklern zusammen, die sich geografisch sehr oft über den ganzen Erdball verteilen — wird man schnell feststellen, dass gemeinsam verwendete Bibliotheken zentral verwaltet und die einzelnen Entwickler keine Möglichkeit haben, die vorhandenen Bibliotheken zu verändern: Was bei einer solchen möglichen Änderung bei einem einzelnen Entwickler funktioniert, wird dann bei allen anderen vermutlich zu unerklärbarem Verhalten ihrer Software-Bestandteile führen! Die CMSIS wird sicherlich niemand ändern, ausgeschlossen ist dies aber nicht. Da ich aber im Verlauf des Buches zusätzlich die MCAL entwickele, die unmittelbar von der CMSIS abhängt, halte ich es für absolut sinnvoll, CMSIS und MCAL separat zu betrachten.
18.05.2021:
Die Initialisierung einer Hardware-Komponente ist häufig zeitkritisch, was im Datenblatt folgendermaßen beschrieben sein könnte: Nach einem Reset muss >= 5ms gewartet werden, bevor das nächste Kommando gesendet werden darf. Zu diesem Zweck habe ich den mcalSysTick-Teil der MCAL um die blockierende Delay-Funktion systickDelay() erweitert. Die Beschreibung der Funktion finden Sie im Abschnitt 04 - Systick-Timer (blockierend), die vollständige aktualisierte MCAL-Bibliothek unter https://gitlab.com/rjesse/mcal-stm.git.
29.04.2021:
Vereinzelt wurde ich von Lesern kontaktiert, die Schwierigkeiten beim Kompilieren der CMSIS-Bibliothek hatten und mit vielen Fehlermeldungen "bombardiert" wurden. Unter 00 - Wichtige Information finden Sie Hinweise, wie die Fehlermeldungen vermieden werden können.
22.04.2021:
MCAL-STM: Kein großes Projekt ohne Tippfehler! In der Datei mcalI2C.c hatte ich in den Zeilen 287/288 versehentlich I2C1->TRISE = 0x0011; bzw. I2C1->CR1 |= I2C_CR1_PE; geschrieben. Korrekterweise muss es natürlich i2c->TRISE = 0x11; und i2c->CR1 |= I2C_CR1_PE; heißen. Der Fehler ist bereits korrigiert, die korrigierte Version der MCAL-STM ist bereits auf https://gitlab.com/rjesse/mcal-stm.git verfügbar.
21.04.2021:
Heute teile ich Ihnen die Lösungen für die beiden Probleme mit, die ich in den Hinweistexten zu den jeweiligen Kapiteln bereits zugesagt habe.
- Unter dem Link 02 - Serielle Datenübertragung mit USART2 finden Sie die versprochene korrigierte Version des USART-Demoprojekts.
- Unter dem Link 03 - DAC-Problem finden Sie zudem die Lösung für das DAC-Problem: Dort entsprach das reale Ausgangssignal von Kanal 2 nicht dem erwarteten Signal.
15.04.2021:
Bugfix in timerEnableOutputComparePreload() und timerDisableOutputComparePreload() durchgeführt. Wurde als Parameter TIMIO_CH4 angegeben, so wirkte sich dies aufgrund von Copy & Paste auf TIMIO_CH3 aus. Die neue Version der MCAL-STM finden Sie wieder unter https://gitlab.com/rjesse/mcal-stm.git.
10.04.2021:
Ich habe heute das GitLab-Repository offiziell freigeschaltet. Der Link lautet https://gitlab.com/rjesse/mcal-stm.git. Hinweis: Die Bibliothek MCAL-STM ist noch nicht final, und ich werde sie — mit Ihrer Unterstützung (?) — ständig erweitern und pflegen.
18.03.2021:
Seit der Abgabe des Manuskripts an den Verlag habe ich die MCAL-Bibliothek erheblich erweitert. Unter 01 - Takteinstellung beim STM32F446 mit der MCAL-Bibliothek finden Sie eine Anleitung, wie Sie die Taktfrequenz des Mikrocontrollers jetzt einstellen können. Diese Erweiterung ist erheblich einfacher als die Beschreibung, die ich im Buch verwendet habe.
15.03.2021:
Da die Datei mcalTimer.c inzwischen weit mehr als 50 Funktionen umfasst, erschien sie mir nicht mehr übersichtlich genug. Ich habe diesen Teil daher vollständig umstrukturiert. Eine kurze Beschreibung der Änderungen finden Sie auf der Download-Seite STM32F446 Beispielprojekte.
08.03.2021:
Zwei neue Funktionen in mcalTimer.c/mcalTimer.h aufgenommen. Es handelt sich hierbei um die Funktionen
- timerEnableOutputComparePreload(TIM_TypeDef *tim, TIMER_CHANNEL_NUM_t chn) und
- timerDisableOutputComparePreload(TIM_TypeDef *tim, TIMER_CHANNEL_NUM_t chn).
Sie aktivieren bzw. deaktivieren den Preload-Mechanismus im Output-Compare-Mode. STM32F446 Beispielprojekte
07.03.2021:
Kaum ist das Buch erschienen, hat mich ein aufmerksamer Leser bereits auf den ersten Fehler hingewiesen: In der MCAL-STM-Bibliothek war in der Funktion gpioGetPinState() ein 'Bug', den ich umgehend korrigiert habe. Die neue Version der MCAL-STM finden Sie unter dem folgenden Link: STM32F446 Beispielprojekte.
03.03.2021:
Inzwischen ist mein neues Buch „STM32: ARM-Mikrocontroller programmieren für Embedded Systems“ im Handel erhältlich. Getreu dem Untertitel „Das umfassende Praxisbuch“ habe ich besonders den praktischen Einsatz in den Fokus gerückt. Doch was bedeutet dies für Sie? Das wichtigste zuerst: In zahlreichen Beispielen werden — mit Ausnahme einiger Peripheriekomponenten, wie z.B. CAN, SAI oder das Kamera-Interface — nach und nach alle Komponenten eingeführt und anhand von Beispielen in Form von Miniprojekten erklärt. Die Beispielprojekte finden Sie unter dem folgenden Link: STM32F446 Beispielprojekte.
08.11.2020:
In Kürze erscheint mein neues Buch über den Mikrocontroller STM32F446. Für die Programmierung wurde ausschließlich CMSIS verwendet, auf den Einsatz herstellerspezifischer Bibliotheken, wie z.B. der HAL-Bibliothek von STM, wurde vollständig verzichtet. Stattdessen wird im Verlauf des Buches eine eigene Bibliothek entwickelt, der ich den Namen MCAL gegeben habe. MCAL dient als Abkürzung von Microcontroller Abstraction Layer. MCAL wird auch nach dem Erscheinen des Buches ständig weiterentwickelt. Die MCAL basiert vollständig auf den Bezeichnungen (Definitionen und Registernamen), die STM in den Referenzhandbüchern (hier: STM32F446) verwendet.
Den Sourcecode und die Dokumentation der Bibliothek können Sie kostenlos auch für kommerzielle Projekte verwenden! Ich bitte aber darum, Änderungen und Erweiterungen vor einer Weitergabe an Dritte mit mir abzusprechen.
Hinweis:
Obwohl es sich bei den STM32F4xx-Mikrocontrollern um Arm Cortex-M4-MCs handelt, ist dieses Buch ausdrücklich NICHT als ein Cortex-M4-Buch zu verstehen: Wenn Sie ein allgemeines Cortex-M4-Buch erwarten bzw. benötigen, sollten Sie auf ein anderes Buch zurückgreifen (z.B. von Joseph Yiu).
25.07.2018:
Geringfügige Erweiterungen im Abschnitt Elektronik-Grundlagen.
29.08.2017:
Änderung der Adresse im Impressum.
17.04.2017:
Im Beispiel chardev in Kapitel 9 hat sich ein Fehler eingeschlichen. Beachten Sie bitte den entsprechenden Hinweis auf der Errata-Seite.
07.02.2017:
In der Rubrik "Tipps" finden Sie einen Hinweis zu dem Script imagetool-uncompressed.py
, dessen Verwendung bisher optional war. Beim Raspberry Pi 3 führte die Verwendung dieses Scripts bei einem Leser sogar dazu, dass der Kernel nicht mehr kompilierbar war!
06.01.2017:
KDevelop 5.0.3 als AppImage verfügbar. Nähere Informationen finden Sie hier: KDevelop.
05.01.2017:
Änderung des Tastaturlayouts für die bash-Shell bei Raspbian-Versionen mit der neuen Benutzeroberfläche Pixel. Details finden Sie hier: Tipps.
04.01.2017:
Gelöst: Probleme beim Zugriff auf USB-Geräte aus dem Gastsystem unter VirtualBox 5.1.12. Siehe auch VirtualBox.
22.11.2016:
Ab sofort erfolgt der Zugriff auf diese Website verschlüsselt. Sollten Sie bisher über http://www.ralf-jesse.de auf diese Website zugegriffen haben, so erfolgt dies nun über https://www.ralf-jesse.de.
20.10.2016:
Neue Rubrik "Tipps" eingeführt.
Der erste Beitrag befasst sich mit dem Thema "Versorgungsspannung zu niedrig", was durch ein kleines buntes Quadrat (ähnlich dem Rainbow-Screen) in der rechten oberen Ecke des Bildschirms angezeigt wird.
25.09.2016:
Die Sektion "Errata --> Embedded Linux" wurde aufgrund eines Leserhinweises um eine Abgrenzung zwischen Mikrocontroller und SoC ergänzt.
21.08.2016:
Erweiterung der Errata-Sektion. Hier wird eine Komfortfunktion beschrieben, die die Verwendung der Shellscripte domake
und mktest
überflüssig macht.
11.08.2016:
Der Artikel Induktive Lasten wurde erweitert.
24.07.2016:
Abschnitt "Elektronik-Grundlagen": Schalten induktiver Lasten (Induktive Lasten)
23.07.2016:
Abschnitt Tools -> Entwicklungsumgebungen: KDevelop abgeschlossen.
22.07.2016:
Abschnitt Tools -> Entwicklungsumgebungen: KDevelop begonnen
21.07.2016:
Abschnitt "Elektronik-Grundlagen": Schalten kleinerer und größerer Ströme
19.07.2016:
Abschnitt "Elektronik-Grundlagen": Schalten kleinerer und größerer Ströme
15.06.2016:
Im Menü Tools wurde unter Entwicklungsumgebungen (IDEs) die (fast) vollständige Konfiguration von Code::Blocks hinzugefügt. Hier fehlt jetzt nur die Konfiguration des Cross-Debuggers, die aber im gleichen Menü unter Debugger verfügbar ist.
02.06.2016:
Im Menü "Tools" wurde der Eintrag "Debugging" freigeschaltet. Neben einer kurzen Beschreibung bietet die verlinkte Webseite Debugger die Möglichkeit zum kostenlosen Download eines Extrakapitels in zwei Teilen. Hiermit möchte ich zwei Ziele erreichen:
- Lesern der ersten Auflage des Buches möchte ich hiermit meinen Dank für den Kauf des Buches aussprechen: Sie sollen nicht Opfer meiner "Schlampigkeit" bzw. Vergesslichkeit sein ;-).
- Noch unentschlossenen Interessenten biete ich hiermit ein Probekapitel an, damit Sie meinen Schreibstil kennen lernen und damit besser bewerten können, ob sich ein Kauf des Gesamtwerks für sie lohnt.
29.05.2016:
Kurzbeschreibung von Code::Blocks hinzugefügt (Code::Blocks).
"Verbindung" herstellen zwischen Code::Blocks und der Cross-Toolchain.
19.05.2016:
Seite 115 im Buch "Embedded Linux". Dort wird der Download der Linaro-Cross-Toolchain von der Website http://gnutoolchains.com/raspberry empfohlen. Dieser Link ist anscheinend nicht mehr gültig. Der Download kann nun von https://github.com/raspberrypi/tools erfolgen. Der Download erfolgt mit dem Kommando
git clone https://github.com/raspberrypi/tools/* .
Der abschließende Punkt ist kein Satzzeichen! Er bestimmt das Verzeichnis, in dem das Kommando ausgeführt wird, als Zielverzeichnis für den Download.
Beachten Sie auch den entsprechenden Punkt in der Errata-Sektion.
-----
Download und Installation der Linaro-Toolchain beschrieben
-----
Neu aufgenommen --> Tools --> Toolchains
08.05.2016:
Layout modernisiert
15.04.2016:
Einfache Halbleiter, Dioden fortgesetzt und abgeschlossen
14.04.2016:
Einfache Halbleiter, Dioden angefangen
13.04.2016:
Arbeit, Leistung und Wirkungsgrad fertiggestellt
12.04.2016:
Arbeit, Leistung und Wirkungsgrad angefangen
Errata nochmals erweitert
11.04.2016:
Errata erweitert für Kapitel 5 und 6
29.03.2016:
28.03.2016:
26.03.2016:
Leitfähigkeit/Temperatureinfluss
24.03.2016:
Projekte/Downloads (Beispielprojekte zum Herunterladen)
23.03.2016: