// GPIOA-> AFR[0] = (7<<8); // ? Angleichen an PA9
6
GPIOA->AFR[0]|=(1U<<8);
7
GPIOA->AFR[0]|=(1U<<9);
8
GPIOA->AFR[0]|=(1U<<10);
9
GPIOA->AFR[0]&=~(1U<<11);
10
11
GPIOA->MODER|=(1<<19);
12
13
USART1->BRR=0x0683;// 9600 at 16MHz
14
USART1->CR1|=(1<<3);
15
USART1->CR1|=(1<<13);
16
17
}
18
19
voidUSART1_Write(intch)
20
{
21
while(!(USART1->SR&(1<<7)));
22
USART1->DR=(ch&0xFF);
23
24
}
Dennoch erhalte ich kein Signal an TTL/USB-Adapter (Aufbau siehe Foto
unten).
Mache ich etwas bei der Zuweisung der Alternativfunktionen zu Port A
(PA9) falsch)?
Timbo schrieb:> Informationsgehalt?
Man sollte dem Konzept der bequemer weise bereits vordefinierten
Konstanten nicht allzu ablehnend gegenüber stehen.
Falls doch, ist es nicht kategorisch Verboten die Magic Numbers mit
Kommentaren zur allseitigen Erleuchtung zu versehen.
Timbo schrieb:> Mache ich etwas bei der Zuweisung der Alternativfunktionen zu Port A> (PA9) falsch)?
Fang bloss nicht an so mit Magic Numbers zu programmieren. Nimm
dir CubeMX vor und wähle dann Code-Generierung mit LL-Library.
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)
Timbo schrieb:> Jedoch gerne "Input" zum Anschalten der einzelnen Bits gewünscht ...
Wie bereits erwähnt, so bitte nicht. Bitte!
Anbei ein Grundgerüst zum Programmieren mit dem Blackpill
für das/die Cube IDE mit Verwendung der LL-Libraries.
- Grundlegende Initialisierung des UART1
- Testausgabe "Hello world..." (115200 Baud)
- HEX-Datei direkt ausführbar
- blinkende LED signalisiert Aktivität des Controllers
- durch anklicken des *.ioc-Files startet CubeMX und
kann das Ganze bequem erweitern und konfigurieren
ohne das schon Geschriebene zu verlieren.
Offensichtlich möchte Timbo seinen Mikrocontroller ohne HAL und ohne LL
programmieren. Ich glaube, dass Tipps bezüglich dieser Bibliotheken ihm
dabei wenig helfen.
Sherlock 🕵🏽♂️ schrieb:> 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.
Wastl schrieb:> 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.
Sherlock 🕵🏽♂️ schrieb:> 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.
Andreas B. schrieb:> Dann macht man es z. B. so
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)
Harald K. schrieb:> Das ist knapp, hübsch und übersichtlich, meint Ihr nicht auch?
Das ist eine grossartige Idee. Warum bin ich noch nicht
darauf gekommen?
Harald K. schrieb:> Das ist knapp, hübsch und übersichtlich, meint Ihr nicht auch?
Mag ja sein, aber bei meiner Version gibt es den entscheidenen Hinweis:
'HAL'frei und vegan!
Harald K. schrieb:> Das ist knapp, hübsch und übersichtlich, meint Ihr nicht auch?
Ein wenig verschwenderisch. Mal exemplarisch, die letzten zwei ließen
sich prima kombinieren…
Norbert schrieb:> *(0xfeedbeef) |= 020010;
wer da keine fette Warnung bekommt ist entweder mit Assembler in den
70ern großgeworden oder hoffnungslos verloren ;-)
(8200 bzw. 0x2008)
Bruno V. schrieb:> ist entweder mit Assembler in den 70ern großgeworden
Den kann ich nicht leugnen…
…und einen kleinen zusätzlichen cast weiter kann man sich den Pointer
auch sparen…
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.
Mi N. schrieb:> Andreas B. schrieb:>> Dann macht man es z. B. so (ist jetzt für einen G0xx, aber...):>> Was ich erkennen kann: Das ist für die Tonne!
Tja, "Was der Bauer nicht kennt ...". Ohne jetzt etwas gehässiges über
Landwirte sagen zu wollen.
Norbert schrieb:> J. S. schrieb:>> Ich mag lieber so etwas:>> Ein wenig geschwätzig auf der Semikolon Ebene…
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…
Norbert schrieb:> Bruno V. schrieb:>> 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.
Bruno V. schrieb:> Jeder andere hält 020010 für eine Hexadezimalzahl
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
Harald K. schrieb:> 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.
Bruno V. schrieb:> 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.
Bruno V. schrieb:> (außer 0 natürlich).
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.
Aber spätestens die Klozahl 00 ist oktal.
Auch schön.
Harald K. schrieb:> 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.
Norbert schrieb:> 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.
Harald K. schrieb:> Interessante Frage, ist eine alleinstehende 0 eine Oktalzahl?
Ja.
> 6.4.4.1 Integer constants
Eine Oktalzahl beginnt mit einer 0 und kann danach "Octal digit"s haben.
Eine Dezimalzahl beginnt mit einer "nonzero digit" und kann danach
"digit"s haben.
Es ändert zwar nichts, aber die (notwendige) Definition ist so recht
einfach.
(Und die Ausnahme bei Misra darum nötig)
Bruno V. schrieb:> 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.
Nun muss ich schon selber lachen.
Norbert schrieb:> 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".
Rahul D. schrieb:> Norbert schrieb:>> 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.
Rahul D. schrieb:> Wie viele andere Anwendungen gibt es denn sonst noch mit Oktalzahlen?
Ich hab' weiter oben ping aufgeführt. Das kennt Oktalzahlen. Unter
Windows, macOS, FreeBSD und daher recht wahrscheinlich auch den üblichen
Linuxen.