Schau dir die Code Beispiele auf http://stefanfrings.de/stm32/stm32f1.html an, insbesondere das MODIFY_REG Makro von ST. Aber auch ohne diese Makros sollte man die Bits mit ihren CMSIS Namen (nicht numerisch) setzen.
(1:1 kopieren wird wohl nicht gehen, weil die F1 Serie nicht F4 ist)
Offensichtlich möchte Timbo seinen Mikrocontroller ohne HAL und ohne LL programmieren. Ich glaube, dass Tipps bezüglich dieser Bibliotheken ihm dabei wenig helfen.
Offensichtlich möchte Timbo seinen Mikrocontroller ohne HAL und ohne LL
programmieren. Ich glaube, dass Tipps bezüglich dieser Bibliotheken ihm
dabei wenig helfen.
Nach dem was sein gepostetes Bild stark vermuten lässt hat
er ja noch einiges vor, nicht nur ein paar Zeichen auf UART
ausgeben. Da wird er mit Bare Metal Programmierung nicht
weit kommen bzw. sich sehr bald im Dschungel wiederfinden.
Früher oder später wird die Erkenntnis einkehren. Aber:
wie sagt der Engländer so schön: chacun à son goût.
Da wird er mit Bare Metal Programmierung nicht
weit kommen bzw. sich sehr bald im Dschungel wiederfinden.
Das mag sein. Für das Verständnis hilft es aber am Anfang, den Mikrocontroller mit möglichst wenig Abstraktion kennen zu lernen. Die LL ist da freilich viel näher dran, als HAL.
Offensichtlich möchte Timbo seinen Mikrocontroller ohne HAL und ohne LL
programmieren. Ich glaube, dass Tipps bezüglich dieser Bibliotheken ihm
dabei wenig helfen.
Dann macht man es z. B. so (ist jetzt für einen G0xx, aber...):
Heißt: PA8 wird als Timer1-Ausgang, Push/Pull usw. konfiguriert. Alles in einem Rutsch in einer Zeile ...
Die #defines von AF2_TIM1, GPIO_SPEED_FREQ_LOW, GPIO_NOPULL etc. finden sich in den Headern von ST, die man einfach vorher inkludiert.
Der Punkt, wo wir uns alle sicher einig sind ist, dass er keine magischen Zahlen benutzen soll, sondern die Bit-Namen aus den Include Dateien. Darauf basierend führen viele Wege zum Ziel.
Man könnte als konzeptionellen Gegenentwurf auch auf die Verwendung von Registernamen verzichten und stattdessen direkt deren Adressen verwenden. Das hat den großen Vorteil, daß man keine Headerdatei mit diesen Registernamen einbinden muss ...
Das wäre jedenfalls konsequent.
1
voidUSART1_Init(void)
2
{
3
*(0xdeadbeef)|=(1<<4);
4
*(0xdeadfeed)|=(1<<0);
5
*(0xfeedc0de)|=(1U<<8);
6
*(0xfeedc0de)|=(1U<<9);
7
*(0xfeedc0de)|=(1U<<10);
8
*(0xfeedc0de)&=~(1U<<11);
9
*(0xbeefbeef)|=(1<<19);
10
*(0xdeafbeef)=0x0683;// 9600 at 16MHz
11
*(0xfeedbeef)=(1<<3);
12
*(0xfeedbeef)|=(1<<13);
13
}
Das ist knapp, hübsch und übersichtlich, meint Ihr nicht auch?
(Der interessanten Frage, warum teilweise eine vorzeichenlose und andererseits eine vorzeichenbehaftete 1 verschoben wird, der stellen wir uns ein andernmal)
Das Registergewusel läuft auf einer anderen Ebene ab, die Anwendung soll nur Anwendungscode enthalten.
Alles andere ist im System und lässt sich besser testen und kann damit leicht für andere Targets verwendet werden. Ohne Codegenerator.
Ja, hast Recht das Semikolon hinter dem while ist überflüssig.
Das war aus dem Kopf geschrieben, das kann ich mir immerhin merken. Aber schreibe mal den Code des TO auswendig…
ist entweder mit Assembler in den 70ern großgeworden
Den kann ich nicht leugnen…
Jeder andere hält 020010 für eine Hexadezimalzahl mit Bit4|Bit17 gesetzt. Darum sollte der Compiler warnen, wenn jemand Bit3|Bit13 (= 0x2008) als 020010 schreibt.
Die Grundlagen der verwendeten Programmiersprache sollte man schon kennen, und so obskur sie auch sein mögen, Oktalzahlen sind nach wie vor nicht nur Sprachstandard, sondern sogar auf manchen Betriebssystemen elementar bei bestimmten Operationen.
Man betrachte nur mal den numerischen Wert, der auf *nixoiden Betriebssystemen für /chmod/ verwendet wird ...
Und nicht nur die kennen oktale Zahlen, o nein, das tut sogar Windows:
1
C:\>ping 010.010.010.010
2
3
Ping wird ausgeführt für 8.8.8.8 mit 32 Bytes Daten:
4
Antwort von 8.8.8.8: Bytes=32 Zeit=12ms TTL=60
5
Antwort von 8.8.8.8: Bytes=32 Zeit=19ms TTL=60
Aber nicht nur das:
1
% ping 010.010.010.010
2
PING 010.010.010.010 (8.8.8.8): 56 data bytes
3
64 bytes from 8.8.8.8: icmp_seq=0 ttl=60 time=13.936 ms
4
64 bytes from 8.8.8.8: icmp_seq=1 ttl=60 time=17.907 ms
Oktalzahlen sind nach wie vor nicht nur Sprachstandard
Das werden sie aller Voraussicht auch bleiben, da es ja durchaus verbreitet war, z.B. bei Strings.
Heute kennt das kaum jemand. Und es ist meist (wie hier) unmöglich zu raten, ob es ein Versehen oder Expertise war. Darum war (ist?) es bei Misra eine "required" rule, Oktalzahlen nicht zu verwenden (außer 0 natürlich). Praktisch mit der Notwendigkeit, dass Compiler oder ein anderer statischer Regelchecker das prüft und warnt/Fehler wirft.
Darum war (ist?) es bei
Misra eine "required" rule, Oktalzahlen nicht zu verwenden
Ich finde es erschütternd, dass man schon völlig normale Dinge verbieten muss, nur weil sich der Kenntnisstand anscheinend immer weiter in südlicher Richtung bewegt und demnächst – nach Einführung und Benutzung von AI – wohl schon ein erster Erdaushub für's Niveau fällig wird.
Hmm. Interessante Frage, ist eine alleinstehende 0 eine Oktalzahl? Eine alleinstehende 1 ist keine, weil die führende Null fehlt, das könnte man der alleinstehenden 0 also auch nachsagen.
Hmm. Interessante Frage, ist eine alleinstehende 0 eine Oktalzahl? Eine
alleinstehende 1 ist keine, weil die führende Null fehlt, das könnte man
der alleinstehenden 0 also auch nachsagen.
Eine oktale Zahl wird in /C/ durch eine führende 0 dargestellt, braucht also mindestens zwei Ziffern. Per Definition kann demnach eine einzelne 0 keine oktale Zahl sein. Nähme man die führende 0 weg, bliebe nichts mehr zur Auswertung übrig.
In Python ist man da etwas klarer:
1
#!python
2
print(0b11111111,0o377,255,0xff)
3
255255255255
Hier haben wir – zur Unterscheidung von einer dezimalen Zahl – jeweils ein 0b,0o,0x voran gestellt.
Mittlerweile bereue ich alles was ich zu diesem Thread
gegeben habe. Vielleicht ergeht es manchem von euch auch
so, wenn ihr diesen Thread gelesen habt:
Auch lässt sich erkennen - falls der TO kein Berufs-Troll
ist - dass er aus früheren Postings keinerlei Lernfähigkeit
zeigt was die Programmierung / Programmier-Stil betrifft.
Übliches Troll-Verhalten ist ja auch, dass man - ausser dem
Eröffnungs-Beitrag - wenig bis gar nichts mehr hört.
Ich finde es erschütternd, dass man schon völlig normale Dinge verbieten
muss, nur weil sich der Kenntnisstand anscheinend immer weiter in
südlicher Richtung bewegt und demnächst – nach Einführung und Benutzung
von AI – wohl schon ein erster Erdaushub für's Niveau fällig wird.
Oktalzahlen sind halt aus der Zeit gefallen und (ab 8 Bit) durch Hex verdrängt. In der Praxis entstehen sie oft bei der Überarbeitung von Zahlen im Blocksatz. So wie Trigraphen ja meist auch nicht mehr benutzt werden sondern irrtümlich in Text auftauchen. Ganz ehrlich: Ich kenne nicht mal alle Trigraphen auswendig.
Oktalzahlen sind halt aus der Zeit gefallen und (ab 8 Bit) durch Hex
verdrängt.
Ich will dir ja nicht zu nahe treten, aber das ist Realsatire, richtig?
Schon mal mit einem unixoiden Betriebssystem gearbeitet?
Ich stelle mir gerade vor was passieren würde, wenn jemand verkündete:
Oktal ist soooo 20. Jahrhundert, ab jetzt arbeiten zB. ›chmod‹ und Konsorten in nur noch in Hex.
Schon mal mit einem unixoiden Betriebssystem gearbeitet?
Wie viele andere Anwendungen gibt es denn sonst noch mit Oktalzahlen?
Laut https://wiki.ubuntuusers.de/chmod/ entfällt im Oktalmodus von chmod auch die führende "0".
Schon mal mit einem unixoiden Betriebssystem gearbeitet?
Wie viele andere Anwendungen gibt es denn sonst noch mit Oktalzahlen?
Laut https://wiki.ubuntuusers.de/chmod/ entfällt im Oktalmodus von chmod
auch die führende "0".
›tr‹ um nur mal ein Beispiel zu nennen. Ausschließlich Oktal übrigens.