Forum: Mikrocontroller und Digitale Elektronik STM32F2xx USART weigert sich


von Phantomix X. (phantomix)


Lesenswert?

Hallo!

Ich habe mir ein Evalboard mit dem STM32F207VGT6 zugelegt und bin dabei 
die Architektur kennenzulernen. GPIO... OK. PLL... OK.
Nun sitze ich allerdings seit > 2 Tagen am UART fest.

Hier etwas Code:
1
#include "stm32f2xx.h"
2
3
void configureUart()
4
{
5
  GPIO_InitTypeDef GPIO_InitStructure;
6
  USART_InitTypeDef USART_InitStructure;
7
8
  RCC_AHB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
9
10
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
11
12
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
13
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);
14
15
  GPIO_StructInit(&GPIO_InitStructure);
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
17
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
18
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5;
19
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
20
  GPIO_Init(GPIOD, &GPIO_InitStructure);
21
22
  GPIO_StructInit(&GPIO_InitStructure);
23
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
24
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
25
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
26
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
27
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
28
  GPIO_Init(GPIOD, &GPIO_InitStructure);
29
30
  USART_StructInit(&USART_InitStructure);
31
  USART_InitStructure.USART_BaudRate = 9600;
32
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //8 Bits
33
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
34
  USART_InitStructure.USART_Parity = USART_Parity_No;
35
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
36
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
37
  USART_Init(USART2, &USART_InitStructure);
38
39
  USART_Cmd(USART2, ENABLE);
40
41
42
  USART_SendData(USART2, (uint16_t) 0x49);
43
}

Das Ergebnis dieses Codes ist ... nichts. Die Pins kann ich manuell 
schalten, wenn ich statt "GPIO_Mode_AF" "GPIO_Mode_Out" verwende, d.h. 
es sind die richtigen Pins. Aber warum sendet die Uart nichts?

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Phantomix Ximotnahp schrieb:
> und bin dabei die Architektur kennenzulernen.

Hallo du Phantomas..

warum schreibst du bloß so einen aufgedunsenen Kram zusammen? Mein Rat: 
Schmeiß die ganze St-Treiberlib oder wie das Zeugs heißt weg und halte 
dich an das RefManual. Was dort nicht steht, brauchst du auch nicht! Ich 
hänge mal ne Konfigurations- und USART- Bedienung aus einem meiner 
Projekte an. Da kannst du sehen, wie man ohne diese ganze 
ST-Schaumschlägerei auskommt.

W.S.

von Phantomix X. (phantomix)


Lesenswert?

Danke, schau ich mir mal an

von Tom (Gast)


Lesenswert?

Phantomix Ximotnahp schrieb:
> Aber warum sendet die Uart nichts?

Ich glaube mich daran zu erinnern, dass man für die Alternate Function 
noch den Clock frei geben muss. Hab auf die schnelle folgenden Befehl 
gefunden, dann sollte es vielleicht gehen:
1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

W.S. schrieb:
> Da kannst du sehen, wie man ohne diese ganze
> ST-Schaumschlägerei auskommt.


Für Einsteiger ist sie schon hilfreich um in kurzer Zeit auch 
umfangreiche Schnittstellen wie CAN in Betrieb zu nehmen bzw. das 
Vorgehen zu sehen und damit eine eigene Bibo schreiben zu können.

von Phantomix X. (phantomix)


Angehängte Dateien:

Lesenswert?

W.S. schrieb:
> Mein Rat: Schmeiß die ganze St-Treiberlib oder wie das
> Zeugs heißt weg und halte dich an das RefManual

Ohne das Referenzmanual geht es nicht, jedoch ist das 14 MB groß :-)

Tom schrieb:
>
1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

Nein tut mir leid aber AFIO gibt es nicht, auch nichts ähnliches


> W.S. schrieb:
>> Da kannst du sehen, wie man ohne diese ganze
>> ST-Schaumschlägerei auskommt.
>
> Für Einsteiger ist sie schon hilfreich um in kurzer Zeit auch
> umfangreiche Schnittstellen wie CAN in Betrieb zu nehmen bzw. das
> Vorgehen zu sehen und damit eine eigene Bibo schreiben zu können.

So war der Plan. die PLL habe ich auf diese Weise halbwegs verstanden 
(im Prinzip könnt ich die benötigten Register da auch direkt setzen, an 
der Stelle ist die ST library recht dünn)

von Simon H. (simi)


Lesenswert?

W.S. schrieb:
> Da kannst du sehen, wie man ohne diese ganze
> ST-Schaumschlägerei auskommt.


Naja, das ist aber keine ST-Schaumschlägerei, sondern allenfalls eine 
ARM-Schaumschlägerei (namens CMSIS)

von holger (Gast)


Lesenswert?

>Nein tut mir leid aber AFIO gibt es nicht, auch nichts ähnliches

Ich kenn deinen STM32 jetzt nicht, aber du hast nicht zufällig
eine Remapped Pinkonfiguration ausgesucht?

von Simon H. (simi)


Lesenswert?

Was ich noch anfügen wollte:

Wie gut es mit der Umsetzung geklappt hat, entzieht sich meiner 
Kenntnis, aber die Idee von CMSIS ist nicht sooo schlecht. Wenn Du 
nämlich diese Schaumschlägerei verwendest, kannst Du Deinen Code später 
mit bloss sehr geringen Änderungen auf jeglichem ARM-Cortex-Derivat 
irgendeines Herstellers laufen lassen.

Theoretisch. Eben - wie gut es geklappt hat, weiss ich nicht. Ich hab 
irgendwann mal ganz flüchtig die Schaumschlägerei eines andern Vendors 
(weiss nicht mehr welcher es war) angeschaut. Das API sah sehr ähnlich - 
aber halt doch nicht ganz gleich aus.

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

> nämlich diese Schaumschlägerei verwendest, kannst Du Deinen Code später
> mit bloss sehr geringen Änderungen auf jeglichem ARM-Cortex-Derivat
> irgendeines Herstellers laufen lassen.

Träum weiter.

Für CMSIS trifft das zu. Aber nicht für die STlib. Die ist sowohl 
hersteller- wie auch familienspezifisch, ist also nicht einmal innerhalb 
von ST portabel (etwa STM32 - STR9 - STM8).

Portabel sind nur jene Teile, die in der STlib auch explizit unter CMSIS 
einsortiert sind. Nämlich die Interfaces für die Elemente des Cortex-Mx 
Prozessors, wie beispielsweise NVIC-Steuerung und Systick.

von Simon H. (simi)


Lesenswert?

Wie ich schon schrieb: Wie gut es geklappt hat, weiss ich nicht. Aber 
die Idee war definitiv, die Peripherie aller Derivate möglichst 
einheitlich abzubilden. Die STLib wurde eben deswegen komplett 
überarbeitet, damit sie CMSIS-konform wurde.

A. K. schrieb:
> (etwa STM32 - STR9 - STM8)

Das sind ja schliesslich auch keine Cortex.

Das hat nichts mit ST zu tun, das ist ein von ARM gepushtes API!

A. K. schrieb:
> Portabel sind nur jene Teile, die in der STlib auch explizit unter CMSIS
> einsortiert sind. Nämlich die Interfaces für die Elemente des Cortex-Mx
> Prozessors, wie beispielsweise NVIC-Steuerung und Systick.

Das mag die Praxis sein. Das Bestreben war (laut meinen Infos) definitiv 
anders.

von (prx) A. K. (prx)


Lesenswert?

Ich halte es für ausgeschlossen, dass man mit Aussicht auf Erfolg 
Peripherie-Libraries bauen kann, mit denen sich bespielsweise die sehr 
unterschiedlichen Timer von STM32, LPC1000 und anderen Cortex-M 
Implementierungen unter einen Hut bekommen lassen, ohne dabei 80% der 
Funktionalität der jeweiligen Peripherie zu verlieren.

Wenn ST hier etwas mit CMSIS koordiniert hat, dann wohl gewisse 
Bezeichnungskonentionen und Zeugs rund um Interrupts und Startup-Code. 
Das lief anfangs etwas auseinander.

von W.S. (Gast)


Lesenswert?

Simon Huwyler schrieb:
> Naja, das ist aber keine ST-Schaumschlägerei,

Das ist eigentlich egal, wer von all den Beteiligten diesen 
aufgedunsenen Mist verzapft hat. Die ST-Lib macht hunderte von 
überflüssigen Identifiern auf und die verschiedenen Teile der Lib 
schieben sich gegenseitig überflüssige Parameter-Struct's zu, die sie 
dann auch noch akribisch prüfen - aber die wirkliche praktische 
Funktionalität fehlt.

Eine wirkliche Erleichterung für den Programmierer oder gar anwendbarer 
Code ist das alles nicht. Es ist Bockmist (auf hohem Niveau - 
sozusagen). Ich hatte das Ganze mal wegen der SDIO-Bedienung 
durchgeackert und dabei rund die Hälfte des Codes ausgemistet. Ja, läuft 
jetzt mit ChaN's FAT, aber zu Ende bin ich mit dem Aufräumen im 
SDIO-Code noch lange nicht. Eigentlich hätte ich von ST einen wirklich 
optimal geschriebenen Treiber ohne all den Schwulst erwartet, aber wie 
heißt das doch: Neese!

Letztendlich ist man entweder ein Pfuscher&Dünnbrettbohrer ode man ist 
Robinson, der sich alles selber machen muß.

W.S.

von Simon H. (simi)


Lesenswert?

Schau doch mal hier rein:

http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php


Warum soll das so unrealistisch sein? Linux läuft schliesslich auch auf 
123923 verschiedenen Graphikkarten und 213834928374987 verschiedenen 
Harddisks etc.... Ok, das ist ein massiv anderer scale, aber 
schliesslich handelt es sich um einen simplen HAL.

Wenn Du ein spezielles Feature eines ST brauchst, wirst Du das nie und 
nimmer so mit einem ATMEL hinkriegen. Klar. Zaubern kann CMSIS nicht.
Wenn Du aber bloss ein bisschen ADC pollen willst, dann macht es doch 
Sinn, dass ARM sagt: Hey, Leute, stellt doch allen Euren Kunden ein 
einheitliches API zur Verfügung, die das macht. So die allgemeinen 
Sachen.

Und das ist CMSIS. Wenn es nur um die Core-Peripherals ginge, wäre das 
ja nicht mal erwähnenswert. Eine Einheitliche Hardware einheitlich 
abbilden, dazu braucht es keinen grossen Effort! :-)

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

> Das mag die Praxis sein. Das Bestreben war (laut meinen Infos) definitiv
> anders.

Versuch dir einfach mal vorzustellen wie das laufen könnte. Die Chips 
existieren ja schon. Nun müssten sich also Vertreter von ST, NXP, TI und 
ein paar anderen Firmen zusammensetzen und einen API definieren, der 
sich dem Anwender hin als von der Implementierung unabhängiges Interface 
darstellt, das innerhalb der Lib dann auf die Hardware abgebildet wird.

Die würden selbstverständlich höchst eifersüchtig darauf achten, das 
möglichst ihre eigene Struktur bestens abgebildet wird und den Kollegen 
(=Konkurrenten) wo es nur geht Knüppel zwischen die Beine werfen.

Wenn trotzdem wider allen Erwartens alles gut geht, dann sind sie nach 
etlichen Jahren mit dem ersten Entwurf fertig. Grad rechtzeitig, um ihn 
dann mangels irgendeiner Bedeutung in allen Ehren zu beerdigen.

Es gibt genau ein Szenatio, wie sowas funktionieren kann: Eine neutrale 
Partei hat den Hut auf und schreibt mindestens in groben Zügen vor, wie 
die Peripherie auszusehen hat. Da ARM sich diesen Hut nicht aufzieht 
kann das nichts werden.

Nope, sowas gibts in Form von Betriebssystemen. Ohne OS, also 
hardwarenah, ist das faktisch ausgeschlossen.

von holger (Gast)


Lesenswert?

>Zaubern kann CMSIS nicht.
>Wenn Du aber bloss ein bisschen ADC pollen willst, dann macht es doch
>Sinn, dass ARM sagt: Hey, Leute, stellt doch allen Euren Kunden ein
>einheitliches API zur Verfügung, die das macht.

Dummerweise kommen die ADCs nicht von ARM.
Die fügt der jeweilige Hersteller in eigener Hardware dazu.
Schlechtes Beispiel;)

von Simon H. (simi)


Lesenswert?

A. K. schrieb:
> Da ARM sich diesen Hut nicht aufzieht
> kann das nichts werden.

Wie kommst Du darauf? (ehrliche Frage, nicht rhetorisch, es interessiert 
mich)

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

> Warum soll das so unrealistisch sein? Linux läuft schliesslich auch auf
> 123923 verschiedenen Graphikkarten und 213834928374987 verschiedenen
> Harddisks etc.... Ok, das ist ein massiv anderer scale, aber
> schliesslich handelt es sich um einen simplen HAL.

Ja, in dieser Dimension funktioniert das. Aber in dieser Grössenordnung 
kriegst du keinen komplexen Timer vereinheitlicht, oder aber nur so, 
dass 50% der Anwender es aufgrund des immensen Overheads bei der 
Umsetzung eines herstellerneutralen APIs nicht nutzen können, weil zu 
langsam.

von Simon H. (simi)


Lesenswert?

holger schrieb:
> Dummerweise kommen die ADCs nicht von ARM.
> Die fügt der jeweilige Hersteller in eigener Hardware dazu.
> Schlechtes Beispiel;)

Nö, kein schlechtes Beispiel. Du hast es nur nicht verstanden :-) Das 
ist nämlich genau der Punkt. Klick auf den Link oben und lies, wie ARM 
das meint.

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

>> Da ARM sich diesen Hut nicht aufzieht kann das nichts werden.
>
> Wie kommst Du darauf? (ehrliche Frage, nicht rhetorisch, es interessiert
> mich)

ARM hätte es tun können. Hätte also den Lizenznehmern vorschreiben 
können, wie deren UART, Timer, ADCs, CAN usw. ungefähr auszusehen 
hätten.

Die Folge davon wäre gewesen, dass wir heute über den Traum eines CMSIS 
für MIPS32 nachdenken würden und ARM längst Geschichte wäre. ;-)

Es liegt nämlich im ureigenen Interesse der Lizenznehmer, dass Kunden 
nicht schon wegen einer 10c billigeren Konkurrenzchips abwandern, 
weshalb allzu grosse Ähnlichkeit eher stört als hilft.

von Simon H. (simi)


Lesenswert?

Wisst Ihr - ich habe mich auch schon mit dieser Schaumschlägerei 
rumgeplagt und mich gefragt, warum die das denn so kompliziert machen. 
Und ich schimpfte auch über ST. Bis ich mal von einem anderen Vendor 
(ich glaube, es war NXP) etwas gesehen habe, das verflucht ähnlich 
aussah. Und mich dann mal ein bisschen mit CMSIS beschäftigt habe.

Ich sehe das so: Es gibt sehr oft Gründe, die HW direkt anzusprechen. 
Aber es gibt auch sehr oft (m.E. auch im Bare-Metal-Bereich viiiiel 
öfter) Situationen, bei denen man gut damit leben kann, es halt über 
einen Umweg zu machen. Sagen wir mal: 70% der HW-Zugriffe über CMSIS, 
30% direkt auf die HW.

Ich denke, DAS ist die Existenzberechtigung von CMSIS. Diese 30% müssen 
bei einem Proziwechsel neu geschrieben werden. Die 70% bleiben exakt 
gleich.

Das ist realistisch! Man KANN über CMSIS auf die HW zugreifen! Das 
funktioniert prima, auch wenn es ein bisschen umständlich ist.

A. K. schrieb:
> Es liegt nämlich im ureigenen Interesse der Lizenznehmer, dass Kunden
> nicht schon wegen einer 10c billigeren Konkurrenzchips abwandern,
> weshalb allzu grosse Ähnlichkeit eher stört als hilft.

Guter Punkt. Aber wenn die einzige Diversifizierung in der Art besteht, 
mit der Standardzugriffe (z.B. einzelner ADC-Wert einlesen), dann kann 
das ja auch nicht der Sinn der Sache sein?)

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

> Klick auf den Link oben und lies, wie ARM das meint.

In der dort beschriebenen CMSIS 2.0 werden m.W. ausschliesslich die 
"Core Peripherals" über Funktionen bedient, und periphierieunabhängiger 
Kram wie DSP. Diese Core Periperals sind jene eben Teile wie NVIC und 
Systick, die als Bestandteil des Cortex-M Cores automatisch integriert 
sind.

Der übrige herstellerspezifische Kram kommt effektiv nur als XML-File 
vor, vermutlich um Debuggern das Leben zu erleichtern.

von Simon H. (simi)


Lesenswert?

Dann schau doch mal das blaue Kästchen unten rechts an!


"The CMSIS has been developed in close partnership with several key 
silicon and software vendors. This collaboration, together with feedback 
from previous solutions, has resulted in an easy-to-use and 
easy-to-learn programming interface for Cortex processor-based devices. 
Current CMSIS Partners include:"

Dann kommen viele Labels von Vendors.

Glaubst Du, die haben alle über die Core-Peripherals geplaudert, die von 
ARM eh vorgegeben ist?

von Simon H. (simi)


Lesenswert?

Simon Huwyler schrieb:
> Die 70% bleiben exakt
> gleich.

Aber eben, wie gesagt, hier ist der Punkt, bei dem ich gestehen muss, 
dass ich NICHT weiss, ob das tatsächlich so ist. Resp. ich habe bei der 
(ich glaube es war) NXP-Library wiederum geringfügige Unterschiede zur 
ST-Lib gesehen. Die waren so klein, dass mir klar war, dass die APIs der 
gleichen Idee entstammten. Aber solche kleine fiese Unterschiede machen 
das ganze Konstrukt natürlich zunichte.

Aber eben: Ich kenne im ARM-Cortex-M Segment nur ST.

von Max (Gast)


Lesenswert?

Ich verwende folgende Configuration, aber sie ist für STM32F10X_MD_VL. 
Ich denke die Clocks sind bei mir anders.


void Init_USART(void)
{
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* USARTx configuration 
-----------------------------------------------------*/
  USART_InitStructure.USART_BaudRate     = 115200 ;
  USART_InitStructure.USART_WordLength   = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits     = USART_StopBits_1;
  USART_InitStructure.USART_Parity     = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = 
USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;

  /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, 
ENABLE);
  /* Enable UART clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  /* Configure USART Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Mode =   GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_8;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* USART configuration */
  USART_Init(USART1, &USART_InitStructure);

  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
}

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

> Dann schau doch mal das blaue Kästchen unten rechts an!

Blaue Kästchen male ich dir gerne im Dutzend. Von mir aus auch verziert 
mit süssen Träumen über eine Universalprogrammschnittstelle für alles 
zwischen 8051 und AMD64. Schau lieber mal in die reale CMSIS 2.1 
Spezifikation rein. Kann man dort runterladen. Über die 
Uncore-Peripherie findest du dort exakt nichts.

von Roland H. (batchman)


Lesenswert?

Wenn ich es richtig sehe, ist PD6 RX und PD5 TX.

Also (Dein Code):
1
  // PD5 TX
2
  GPIO_StructInit(&GPIO_InitStructure);
3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
4
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
5
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5;
6
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
7
  GPIO_Init(GPIOD, &GPIO_InitStructure);
8
9
  // PD6 RX
10
  GPIO_StructInit(&GPIO_InitStructure);
11
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
12
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
13
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
14
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
15
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
16
  GPIO_Init(GPIOD, &GPIO_InitStructure);

Zum Vergleich mit meinem stm32f4xx-Code (funktionert, aber andere Pins):
1
      /* Configure USART2 TX (PA2) */
2
      GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
3
 
4
      GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
5
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6
      GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
7
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
8
      GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
9
      GPIO_Init(GPIOA, &GPIO_InitStructure);
10
11
      /* Configure USART2 RX (PA3) */
12
      GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
13
 
14
      GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;
15
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
16
      GPIO_Init(GPIOA, &GPIO_InitStructure);

Dann müsste oben die GPIO-Initialisierung "getauscht" werden, vermutlich 
ist der Pull-Up "an der falschen Stelle".

Schon mal gemessen, was am TX Pin bei einer Ausgabe anliegt?

Außerdem würde um das USART_SendData "herum" das Abfragen/Prüfen mittels 
USART_GetFlagStatus() nicht schaden.

von Roland H. (batchman)


Lesenswert?

Max schrieb:
> Ich verwende folgende Configuration, aber sie ist für STM32F10X_MD_VL.

Leider unterscheidet sich die Programmierung der stm32f1xx und 
stm32f2xx/stm32f4xx in vielen kleinen Dingen, wenn man die Library 
einsetzt. USART ist in diesem Fall sogar ziemlich ähnlich/gleich, aber 
GPIO ist ganz anders.

Das ist ja auch einer der berechtigten Kritikpunkte an der Library: Die 
Abstraktion ist immer noch zu konkret :-)

von Simon H. (simi)


Lesenswert?

A. K. schrieb:
> Schau lieber mal in die reale CMSIS 2.1
> Spezifikation rein. Kann man dort runterladen. Über die
> Uncore-Peripherie findest du dort exakt nichts.

Hab ich gerade - und tatsächlich nichts gefunden. :-) Muss ich mal 
genauer anschauen. Lustig ist einfach, dass a)jemand an einer Konferenz 
in einem Vortrag über CMSIS das genau so beschrieben hat - und meine 
Rückfrage, ob das wirklich so sei, dass Vendorunabhängig - und 
unabhängig von den genauen Features einer Peripherie deren API 
standardisiert werden soll, bejahte, dass b) andere Vendors wirklich 
sehr sehr ähnliche APIs in ihren Libraries haben, und dass c) für sowas 
soooo viele Kunden von ARM mitreden sollen.

von Phantomix X. (phantomix)


Lesenswert?

Roland H: PD5 ist TX und PD6 ist RX. Das sagen mir zumindest

- das Datenblatt Seite 45
- der STM MicroXplorer
- der Schaltplan vom evalboard
- mein Oszi
- An der UART hängt eine USB-to-UART-bridge die funktioniert und an PD6 
kommen von aussen Daten an

glaubs mir, das hab ich 10x geprüft, leider

Der Code von dir und von Max ist auch recht nützlich

Zum Thema AFIO: scheint so als gibt es das nur in der stm32f1xx-Serie, 
nicht mehr bei der 2xx-Serie.

von holger (Gast)


Lesenswert?

@ W.S.

>Ich hatte das Ganze mal wegen der SDIO-Bedienung
>durchgeackert und dabei rund die Hälfte des Codes ausgemistet. Ja, läuft
>jetzt mit ChaN's FAT, aber zu Ende bin ich mit dem Aufräumen im
>SDIO-Code noch lange nicht.

Die >4GB Falle in der SDIO Lib schon gefunden;)

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

>> (etwa STM32 - STR9 - STM8)
>
> Das sind ja schliesslich auch keine Cortex.

Als ob es bei einem API für den Uncore ausgerechnet auf den Befehlssatz 
oder den konkreten Core ankäme. Das wär bei diesem Thema der 
unwichtigste Teil überhaupt.

Aber das es nicht einmal innerhalb der STM32 Familie funktioniert zeigt:

Roland H. schrieb:

> Leider unterscheidet sich die Programmierung der stm32f1xx und
> stm32f2xx/stm32f4xx in vielen kleinen Dingen, wenn man die Library
> einsetzt.

von Phantomix X. (phantomix)


Lesenswert?

Ups, überlesenhab:

> Schon mal gemessen, was am TX Pin bei einer Ausgabe anliegt?

Da liegt konstant ein HIGH-Pegel, und das auch erst seitdem ich
1
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
drin hab, vorher war es ein Low-Pegel

Es tut also schon irgendwas, nur senden tuts nicht...

von Simon H. (simi)


Lesenswert?

A. K. schrieb:
>>> (etwa STM32 - STR9 - STM8)
>>
>> Das sind ja schliesslich auch keine Cortex.
>
> Als ob es bei einem API für den Uncore ausgerechnet auf den Befehlssatz
> oder den konkreten Core ankäme. Das wär bei diesem Thema der
> unwichtigste Teil überhaupt.

Da hast Du recht. Aber lies nochmal, warum ich das schrieb. Oder: Was 
hat ARM mit dem STM8 zu tun?? ;-)

von Roland H. (batchman)


Lesenswert?

Simon Huwyler schrieb:
> Aber eben, wie gesagt, hier ist der Punkt, bei dem ich gestehen muss,
> dass ich NICHT weiss, ob das tatsächlich so ist. Resp. ich habe bei der
> (ich glaube es war) NXP-Library wiederum geringfügige Unterschiede zur
> ST-Lib gesehen. Die waren so klein, dass mir klar war, dass die APIs der
> gleichen Idee entstammten. Aber solche kleine fiese Unterschiede machen
> das ganze Konstrukt natürlich zunichte.
>
> Aber eben: Ich kenne im ARM-Cortex-M Segment nur ST.

Dann nimm ein stm32f1-Programm und kompiliere es mal für stm32f2/f4.
Dann nimm ein stm32-CM3-Programm und portiere es auf einen lpc CM3.

CMSIS kommt von ARM und ist "gleich", bezieht sich aber nur auf den 
Kern/NIVC etc. Würde ich nicht als "peripher" bezeichnen.

Die Peripherie und die "peripheral library" kommt z. B. von NXP und STM. 
Das alte IP will auch genutzt werden. Die Peripherie ist definitiv nicht 
gleich.

Wie kompatibel die Peripherie innerhalb von STM32f (Cortex-M3/Cortex-M4) 
ist, siehst Du an diesem Thread. Die haben es geschafft, dass die USART 
Pins zwischen stm32f1/stm32f2/stm32f4 die gleichen sind (zumindest bei 
den von mir eingesetzten CPUs). stm32f2/stm32f4 sind m. W. sogar "drop 
in" bezüglich der Pins/Power scheme. Die Library ist viel weniger 
kompatibel.

Bei NXP ist beim lpc2103 (ARM7TDMI) und lpc1343/lpc1769 (CM3) z. B. die 
USART-Einstellung tupfengleich (zumindest für meine 0815-Zwecke).

Die Unterschiede in der Peripherie sind nicht klein, die sind immens.

von Simon H. (simi)


Lesenswert?

Roland H. schrieb:
> CMSIS kommt von ARM und ist "gleich", bezieht sich aber nur auf den
> Kern/NIVC etc. Würde ich nicht als "peripher" bezeichnen.
>
> Die Peripherie und die "peripheral library" kommt z. B. von NXP und STM.
> Das alte IP will auch genutzt werden. Die Peripherie ist definitiv nicht
> gleich.

Auf der CMSIS-Seite zu lesen:

Chip vendors use a wide variety of on-chip peripherals to distinguish 
their parts from each other. Device peripherals such as I/O Ports, 
Timers, PWMs, A/Ds, or D/As can have different functions and performance 
characteristics. This variety is a challenge for the software developer 
and makes code reuse difficult. CMSIS addresses these difficulties by 
providing a vendor-independent hardware abstraction layer with a common 
approach to interface peripherals, real-time operating systems, and 
middleware components across all silicon vendor products.

Die Idee hinter CMSIS ist folglich ganz klar, auch die 
vendorspezifische Peripherie in der API zu standardisieren. Was für 
einen Sinn macht es denn, für immer gleiche Peripherie (die 
Core-Peripherie) in Zusammenarbeit mit vielen Vendors eine 
standardisierte API zu schreiben? Das, was Du meinst, ist der von ARM 
zur Verfügung gestellte Code, den die Vendors 1:1 an ihre Kunden 
weitergeben können. Was sie aber zusätzlich machen müssen, ist, _ihre 
eigene_ peripherie auch noch CMSIS-konform abzubilden. Und das ist die 
ST-Lib. Diese aber als ST-Schaumschlägerei zu betiteln, ist insofern 
also nicht ganz fair gegenüber ST, denn es ist eben eigentlich 
ARM-Schaumschlägerei....

... die ich (wenn sich alle daran halten) riesige Vorteile mit sich 
bringt. Siehe oben.

Roland H. schrieb:
> Dann nimm ein stm32f1-Programm und kompiliere es mal für stm32f2/f4.
> Dann nimm ein stm32-CM3-Programm und portiere es auf einen lpc CM3.

Wenn der HAL gut gemacht ist, dann funktioniert das eben. Periph-Lib 
austauschen und gut ist. Nicht bei 100% des Code, aber sicher bei 70%, 
das ist KEINE Träumerei. Technisch nicht. Vielleicht politisch. Darum 
mein Einwand: "(wenn sich alle daran halten)".

von (prx) A. K. (prx)


Lesenswert?

Simon Huwyler schrieb:

> Auf der CMSIS-Seite zu lesen:

Genau das ist Schaumschlägerei, wie auch der von dir erwähnte Vortrag. 
Aber das ist der Job von Marketing-Menschen - Leute mit Versprechungen 
auf eine rosige Zukunft ködern, die aber leider derzeit noch etwas 
unvollständig ist (lies: von der noch keine einzige Zeile existiert, 
nicht einmal ein Konzept).

Es gehört andererseits zum Job der Zuhörer, sowas nicht hingerissen über 
sich ergehen zu lassen, sondern solchen Spezis ihre Worte live um die 
Ohren zu hauen. Sowas mach ich ganz gern, hab da etwas Übung drin. ;-)

von Simon H. (simi)


Lesenswert?

Dann deklariere es aber fairerweise auch als ARM-Schaumschlägerei! ;-)

Wie gesagt, das glaube ich Dir auf's Wort, weil ich nämlich keinen 
Gegenbeweis habe. Wie ich geschrieben habe, ich habe sogar selber beim 
groben Überfliegen einiger .h files kleine Unterschiede zwischen den 
Vendors festgestellt. Musste mich aber zum Glück nie mit Portierung 
abmurksen.

Aber die Idee ist wirklich nicht schlecht!


(sehr simples) Beispiel LED. Die soll mal leuchten. Dann mal wieder 
nicht. Halt blinken. Du hast einen ARM-Cortex-M3. Warum zum Geier muss 
ich für jedes derivat eigenen Code schreiben, um das zu bewerkstelligen? 
Wenn sich alle Cortex-M-Vendors darauf einigen (würden!), wie ein 
GPIO-Zugriff auf höherer Ebene zu funktionieren hat, dann hast Du eben 
diese Kompatibiltät. Und in diesem Beispiel ist es Dir auch piepegal, ob 
der eine Prozi das auf HW-Ebene auf die Weise A und der andere auf die 
Weise B lieber hätte. Du verwendest die Weise C, die für beide 
suboptimal ist. Und die LED geht 2us später an.

Bei 70% des Codes ist das egal. Bei 30% nicht. Und diesen 30% (das sind 
z.B. die Codezeilen, die davon Gebrauch machen, dass der ADC von Vendor 
A besonders schnell sequenziell Kanal a-b-a-c-a-d wandeln kann) kannst 
Du jetzt viiiiel mehr Zeit widmen, weil Du eben nicht nachlesen musst, 
wie ein ST-GPIO funktioniert, um eine LED zum Leuchten zu bringen. 
Alles, was Du wissen musst, ist, wie ein CORTEX-Mx Prozi einen GPIO 
schaltet (jetzt bitte nicht wieder einwenden, dass GPIO nicht von ARM 
gemacht werden, genau das meine ich ja!!).


Einigen wir uns also darauf, dass die Idee dahinter suuuper wäre, wenn 
sie auch wirklich durchgezogen würde? Dass die Realität anders aussieht, 
glaube ich Dir, aber das hat nichts damit zu tun, dass es prinzipiell 
nicht machbar/sinnvoll wäre.

von Torben (Gast)


Lesenswert?

Bitte lasst das Offtopic Thema. Danke.

Holger schrieb:

>Ich kenn deinen STM32 jetzt nicht, aber du hast nicht zufällig
>eine Remapped Pinkonfiguration ausgesucht?

Hast Du das schon geprüft, weil es extrem danach aussieht. Welches Board 
benutzt Du?

von Torben (Gast)


Lesenswert?

Hallo, beim STM32F107VC musst du remappen.
1
  if (COM == COM1)
2
  {
3
    /* Enable the USART2 Pins Software Remapping */
4
    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
5
    RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
6
  }

von Roland H. (batchman)


Lesenswert?

Simon Huwyler schrieb:
> Aber die Idee ist wirklich nicht schlecht!

Aus welcher Perspektive? Aus der des Entwicklers/Integrators?

Vielleicht aber nicht aus der Perspektive derer, die die Chips 
herstellen. Die wollen sich u. U. nicht nur über den Preis 
differenzieren, wenn der Rest gleich ist.

Vielleicht ist aber die Komplexität auch eine Art "Kundenbindung". Man 
kann eben nicht so einfach wechseln.

Vielleicht ist es aber auch aus Sicht des Kunden gut so, wenn es in der 
Peripherie Wettbewerb gibt.

Das ist aber alles völlig egal. Die CPUs, die vor mir auf dem Tisch 
liegen, sind Fakt - mit ihren SW-Dreingaben. Papier ist geduldig und 
gilt nur dann als Information, wenn "reference manual" oder "errata" 
draufsteht.

Simon Huwyler schrieb:
> Wenn der HAL gut gemacht ist, dann funktioniert das eben. Periph-Lib
> austauschen und gut ist.

Sehr witzig. Deine Kristallkugel muss sehr klar sein, wenn Du heute beim 
Erstellen einer HAL die zukünftigen Änderungen an der Peripherie 
antizipieren und gleich so vorsehen kannst, so dass ein "Austausch" 
möglich ist.

Hab ich auch mal gehofft und fleissig auf die "STM peripheral lib" 
gesetzt. Bis ich dann den Code vom stm32f1 auf den stm32f4 bringen 
wollte.

Simon Huwyler schrieb:
> Wie ich geschrieben habe, ich habe sogar selber beim
> groben Überfliegen einiger .h files kleine Unterschiede zwischen den
> Vendors festgestellt.

Wieso die Mühe? Ich kann Dir versichern, dass der gcc alle 
Unterschiede findet ...

Welche .h files meinst Du? Die "core_cm*"? Das ist harmlos.

Ich meine die "stm32f10x*"/"stm32f4xx*" und "LPC13xx*/"LPC17xx*". Hier 
tanzt der Bär.

von Phantomix X. (phantomix)


Angehängte Dateien:

Lesenswert?

Torben schrieb:
>>Ich kenn deinen STM32 jetzt nicht, aber du hast nicht zufällig
>>eine Remapped Pinkonfiguration ausgesucht?
> Hast Du das schon geprüft, weil es extrem danach aussieht. Welches Board
> benutzt Du?

Mit Remapping habe ich mich noch überhaupt nicht beschäftigt, ich werde 
das überprüfen. Es gibt jedenfalls mehrere Pinkonfigurationen auf denen 
UART2 laufen kann.

>
1
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);

GPIO_PinRemapConfig gibts bei mir nicht. Davon steht auch nichts in der 
Anweisung in der stm32f2xx_usart.c:
1
  /*          ===================================================================
2
  *                                 How to use this driver
3
  *          ===================================================================
4
  *          1. Enable peripheral clock using the follwoing functions
5
  *             RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6 
6
  *             RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5.
7
  *
8
  *          2.  According to the USART mode, enable the GPIO clocks using 
9
  *              RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS, 
10
  *              or/and SCLK). 
11
  *
12
  *          3. Peripheral's alternate function: 
13
  *                 - Connect the pin to the desired peripherals' Alternate 
14
  *                   Function (AF) using GPIO_PinAFConfig() function
15
  *                 - Configure the desired pin in alternate function by:
16
  *                   GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
17
  *                 - Select the type, pull-up/pull-down and output speed via 
18
  *                   GPIO_PuPd, GPIO_OType and GPIO_Speed members
19
  *                 - Call GPIO_Init() function
20
  *        
21
  *          4. Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware 
22
  *             flow control and Mode(Receiver/Transmitter) using the USART_Init()
23
  *             function.
24
  *
25
  *          5. For synchronous mode, enable the clock and program the polarity,
26
  *             phase and last bit using the USART_ClockInit() function.
27
  *
28
  *          5. Enable the NVIC and the corresponding interrupt using the function 
29
  *             USART_ITConfig() if you need to use interrupt mode. 
30
  *
31
  *          6. When using the DMA mode 
32
  *                   - Configure the DMA using DMA_Init() function
33
  *                   - Active the needed channel Request using USART_DMACmd() function
34
  * 
35
  *          7. Enable the USART using the USART_Cmd() function.
36
  * 
37
  *          8. Enable the DMA using the DMA_Cmd() function, when using DMA mode. 
38
*/

Wie gesagt, ich untersuch das mal, bzw. belese ich mich im Reference 
Manual dazu.

von Roland H. (batchman)


Lesenswert?

Was hat das

Torben schrieb:
> STM32F107VC

mit

Phantomix Ximotnahp schrieb:
> Ich habe mir ein Evalboard mit dem STM32F207VGT6

zu tun?

Das könnte man auch als "off-topic" bezeichnen :-)

von Phantomix X. (phantomix)


Lesenswert?

Aber immerhin ein Versuch zu helfen :-)

Obwohl ich eure Diskussion um CMSIS auch recht interessant fand...

von Roland H. (batchman)


Lesenswert?

Phantomix Ximotnahp schrieb:
> Aber immerhin ein Versuch zu helfen :-)

Hallo?

Meinen Beitrag von

---
Autor: Roland H. (batchman)
Datum: 29.11.2011 22:28

Wenn ich es richtig sehe, ist PD6 RX und PD5 TX.
---

überhaupt schon gesehen und getestet?

von Phantomix X. (phantomix)


Lesenswert?

Roland H. schrieb:
> Wenn ich es richtig sehe, ist PD6 RX und PD5 TX.
>
> überhaupt schon gesehen und getestet?

Siehe dazu

Beitrag "Re: STM32F2xx USART weigert sich"

Und genau so ist es ja auch konfiguriert
PD5 = TX
1
  GPIO_StructInit(&GPIO_InitStructure);
2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
3
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
4
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5;
5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6
  GPIO_Init(GPIOD, &GPIO_InitStructure);

PD6 = RX
1
  GPIO_StructInit(&GPIO_InitStructure);
2
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
3
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
4
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
5
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
6
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
7
  GPIO_Init(GPIOD, &GPIO_InitStructure);

von Phantomix X. (phantomix)


Angehängte Dateien:

Lesenswert?

Das dagegen habe ich tatsächlich übersehen

Torben schrieb:
> Hast Du das schon geprüft, weil es extrem danach aussieht. Welches Board
> benutzt Du?


Das board habe ich
http://www.aliexpress.com/fm-store/312788/210751525-491344586/Free-shipping-ST-stm32-Cortex-M3-STM32F207-STM32F207VGT6-development-board-with-network-USB-Device-Host-CAN.html
dazu gibts nen schaltplan (siehe Anhang)

von Torben (Gast)


Lesenswert?

Hallo,

in der AN3374 bezogen auf das STM3210_C EVAL Board remappen Sie auch.
1
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
5
  /* Enable GPIO clock */
6
  RCC_APB2PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM] | RCC_APB2Periph_AFIO, ENABLE);
7
8
  if (COM == COM1)
9
  {
10
    /* Enable the USART2 Pins Software Remapping */
11
    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
12
    RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
13
  }
14
15
  /* Configure USART Tx as alternate function push-pull */
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
17
  GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
18
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
19
  GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);
20
21
  /* Configure USART Rx as input floating */
22
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
23
  GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
24
  GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);
25
26
  /* USART configuration */
27
  USART_Init(COM_USART[COM], USART_InitStruct);
28
    
29
  /* Enable USART */
30
  USART_Cmd(COM_USART[COM], ENABLE);
31
}

Und reinzufaellig benutzen Sie auch PD5 und PD6
1
/**
2
 * @brief Definition for COM port1, connected to USART2 (USART2 pins remapped on GPIOD)
3
 */ 
4
#define EVAL_COM1                        USART2
5
#define EVAL_COM1_CLK                    RCC_APB1Periph_USART2
6
#define EVAL_COM1_TX_PIN                 GPIO_Pin_5
7
#define EVAL_COM1_TX_GPIO_PORT           GPIOD
8
#define EVAL_COM1_TX_GPIO_CLK            RCC_APB2Periph_GPIOD
9
#define EVAL_COM1_RX_PIN                 GPIO_Pin_6
10
#define EVAL_COM1_RX_GPIO_PORT           GPIOD
11
#define EVAL_COM1_RX_GPIO_CLK            RCC_APB2Periph_GPIOD
12
#define EVAL_COM1_IRQn                   USART2_IRQn

von Torben (Gast)


Lesenswert?

Das gleiche wird in der STM32F2xxx StdPherip. Lib gemacht.

von Phantomix X. (phantomix)


Lesenswert?

Torben schrieb:
> Hallo,
>
> in der AN3374 bezogen auf das STM3210_C EVAL Board remappen Sie auch.

Die AN enthält code für mehrere Evalboards, und das STM3210_C beherbergt 
einen STM32F107VC
http://www.st.com/internet/evalboard/product/217965.jsp

von Torben (Gast)


Lesenswert?

Sieht so aus als haettest Du recht. Ich finde in der GPIO.c für den 
207er nur die Funktion.
1
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)

Die Funktion wurde auch von Dir aufgerufen.
1
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
2
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);

von A. B. (funky)


Lesenswert?

du verwendest im ersten post

RCC_AHB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


was passiert wenn du stattdessen RCC_APB1PeriphClockCmd(...) verwendest?

von A. B. (funky)


Lesenswert?

womit hast du überhaupt deine ganzen clocks konfiguriert?
ich würde dir das stm32 clock configuration tool von st empfehlen. gibts 
auf der seite. ist ein excel sheet mit dem man alles sehr komfortabel 
einstellen kann

von A. B. (funky)


Lesenswert?

W.S. schrieb:
> Hallo du Phantomas..
>
> warum schreibst du bloß so einen aufgedunsenen Kram zusammen? Mein Rat:
> Schmeiß die ganze St-Treiberlib oder wie das Zeugs heißt weg und halte
> dich an das RefManual. Was dort nicht steht, brauchst du auch nicht! Ich
> hänge mal ne Konfigurations- und USART- Bedienung aus einem meiner
> Projekte an. Da kannst du sehen, wie man ohne diese ganze
> ST-Schaumschlägerei auskommt.
>
> W.S.

naja...man kann von der STLib halten was man will, aber zum 
konfigurieren ist das Teil nicht schlecht. Und auf jedenfall 
selbstdokumentiernder als
1
if ((RCC->BDCR & 2)==0)          /* wenn 32kHz Oszi nicht ready ist */
2
  { PWR->CR |= (1<<8);
3
    RCC->BDCR = (1<<16)|(1<<15)|1; /* RTC Reset, enable, 32kHz on */
4
    RCC->BDCR = (1<<15)|(1<<8)|1;  /* RTC enable, LSE als Quelle, 32kHz on */
5
  }

von Phantomix X. (phantomix)


Lesenswert?

A. B. schrieb:
> RCC_AHB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
> was passiert wenn du stattdessen RCC_APB1PeriphClockCmd(...) verwendest?

Aehm... Ich glaub da ist was dran... Kann es aber erst heut Abend 
ausprobieren

A. B. schrieb:
> womit hast du überhaupt deine ganzen clocks konfiguriert?
> ich würde dir das stm32 clock configuration tool von st empfehlen. gibts
> auf der seite. ist ein excel sheet mit dem man alles sehr komfortabel
> einstellen kann

Wenn man Microsoft Office hat; unter Open Office geht das irgendwie 
nicht^^
Na egal, die Clocks laufen auch so

von Simon H. (simi)


Lesenswert?

Roland H. schrieb:
> Simon Huwyler schrieb:
>> Wenn der HAL gut gemacht ist, dann funktioniert das eben. Periph-Lib
>> austauschen und gut ist.
>
> Sehr witzig. Deine Kristallkugel muss sehr klar sein, wenn Du heute beim
> Erstellen einer HAL die zukünftigen Änderungen an der Peripherie
> antizipieren und gleich so vorsehen kannst, so dass ein "Austausch"
> möglich ist.

Dieses Argument taugt aber gar nichts! Ich muss die zukünftigen 
Veränderungen in der Peripherie eben NICHT kennen. DAS ist ja der Zweck 
einer HAL. In den 90er Jahren (hab' ich jetzt einfach mal geschätzt) 
hatten sie auch keine Kristallkugel zur Hand. Und trotzdem kann man auch 
heute einen modernen Bildschirm an einen alten VGA-Port anschliessen. 
Standardisiertes Interface ist das Zauberwort. Wenn Du die Vorzüge des 
modernen Bildschirms nutzen willst, reicht der VGA-Anschluss zwar nicht 
mehr, aber wenn nicht, dann passt das. Genau das ist der Clou: 
Standardisierte Interfaces.

Roland H. schrieb:
> Vielleicht ist aber die Komplexität auch eine Art "Kundenbindung". Man
> kann eben nicht so einfach wechseln.

Deswegen schrieb ich ja auch: Die grösste - nein - die EINZIGE Hürde ist 
politisch, nicht technisch.
Aber das mit der Kundenbindung kann auch ins Auge gehen. Mal angenommen, 
alle hätten das gemacht, bis auf einen. Dann wäre das ganz klar ein 
Argument dagegen, dieses Derivat zu nehmen.

(so wie Windows sich nie gegen die UNIXoiden wird durchsetzen können :-P 
- mann, ich sollte aufhören, meine eigenen Argumente zu widerlegen! 
;-)))


Roland H. schrieb:
> Wieso die Mühe? Ich kann Dir versichern, dass der gcc alle
> Unterschiede findet ...
>
> Welche .h files meinst Du? Die "core_cm*"? Das ist harmlos.

Wieso die Mühe? Weil ich per Zufall mal drauf gestossen bin. Und mal 
kurz das Interface für Peripherie X der beiden Derivate zu vergleichen, 
einfacher war, als ein neues Build aufzusetzen etc... Wie gesagt: Es war 
a) rein interessehalber und b) nur mal ein ganz grober Blick drauf.

Neinein, ich meine nicht die Core-Lib. Ich meine schon die 
Vendor-Peripherie.

von Phantomix X. (phantomix)


Lesenswert?

Phantomix Ximotnahp schrieb:
> A. B. schrieb:
>> RCC_AHB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
>> was passiert wenn du stattdessen RCC_APB1PeriphClockCmd(...) verwendest?
>
> Aehm... Ich glaub da ist was dran... Kann es aber erst heut Abend
> ausprobieren
>

So, bin nun zuhause und habs ausprobiert. Und... trommelwirbel 
frankensteinstimme aufleg ES LEEEEEEBT!

Tatsächlich lag der Fehler nur in dem einen Buchstaben; nun sendets 
fröhlich vor sich hin!


Danke an alle nochmal! :-)

von Martin (Gast)


Lesenswert?

Hallo Phantomix Ximotnahp,

ich wil mir auch dieses Board zulegen. Wie sind denn Deine Erfahrungen 
damit und würdest Du es weiterempfehlen?
Vom Preis-Leistungs-Verhältnis sieht es ja wirklich gut aus.
Danke für die Info.

Martin

von Phantomix X. (phantomix)


Lesenswert?

> Wie sind denn Deine Erfahrungen
> damit und würdest Du es weiterempfehlen?

Also das Board funktioniert; das einzige was ich noch nicht getestet hab 
ist die zugehörige CAN- und Ethernet-Schnittstelle (kommt aber noch).
Zu der Verarbeitung des Boards muss man sagen, es sieht aus wie 
teilweise handgelötet, paar sachen sind bei mir leicht schief drauf, ist 
aber für ein evalboard OK, solang es funktioniert, finde ich.


Gefallen hat mir jedenfalls die Belegung der Pinleisten am Rand, das ist 
wesentlich besser als bei manchen anderen boards.

 Softwareseitig siehts ein wenig  wenig aus; auch weils die 200er serie 
vom stm ist, und alle möglichen Beispiele im Netz sich auf die 100er 
beziehen.

Als Programmieradapter kann ich den ST-Link v2 empfehlen, geht bei mir 
problemlos und schnell. Schön wärs noch gewesen, wenn statt der 
abgewinkelten Pinleiste ein Wannenstecker für den JTAG verbaut worden 
wäre, kann man ja aber noch selbst nachrüsten :-)

von Ivan_Russia (Gast)


Lesenswert?

Lieber Freunden!
Kannst du bitte die leichte code STM32F2xx USART auf stm32-p207 plate.
I habe Probleme mit inizialization
STM_EVAL_COMInit(COM1, &USART_InitStructure); - habe keine Bibliotek

Entschuldigen Sie bitte fur meine Deutch)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.