Forum: Mikrocontroller und Digitale Elektronik STM32F103 lässt sich nicht programmieren


von Doran S. (utzer)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe auf einer Platine einen STM32F103RCT6 welchen ich gerne über 
UART programmieren möchte.
Dazu habe ich einen MCP2200 mit auf die Platine gesetzt, siehe 
Schaltplan im Anhang.

Leider reagiert mit stm32flash der STM32F103RCT6 nicht.
Wenn ich die Verbindung zw. MCP2200 und STM32F103RCT6 trenne und TX und 
RX am MCP2200 kurzschließe, dann kann ich aber mit einem 
Terminalprogramm ein Echo empfangen.

Wenn ich einen externen USB <-> UART Konverter an den STM32F103RCT6 
hänge, dann kann ich ihn erfolgreich programmieren und das Programm 
läuft dann auch korrekt ab.

Hat jemand eine Idee, was ich bei der Verbindung MCP2200 <-> 
STM32F103RCT6 falsch gemacht habe? Ich sehe es gerade irgendwie 
nicht....

Viele Grüße,
Doran

von Jdhdiebdkx (Gast)


Lesenswert?

5V statt 3.3V?

von Doran S. (utzer)


Lesenswert?

Ja, stimmt, der MCP2200 gibt Signale mit 5V-Pegel aus. Aber der STM32 
ist doch 5V-tollerant!? Macht das dann was aus?

von Walter T. (nicolas)


Lesenswert?

Doran S. schrieb:
> Aber der STM32
> ist doch 5V-tollerant!? Macht das dann was aus?

Einzelne Pins sind 5V-tolerant. Dafür bitte das Datenblatt mit den 
Seiten mit dem Pinout konsultieren.

von Stefan F. (Gast)


Lesenswert?

PA9 und PA10 sind 5V tolerant.
Rx gehört an PA9 (das ist am µC Tx).
Tx gehört an PA10 (das ist am µC Rx).

Das sieht für mich soweit gut aus.

Im Datenblatt vom MCP2200 steht, dass er als High-Voltage mindestens 
0,8·VCC sehen will, also 4 Volt - uppsalla. Da musst du wohl VDD anders 
anschließen, so dass der Chip mit 3,3V  betrieben wird. Oder du 
verwendest einen Pull-Up Widerstand - wobei ich das noch nie ausprobiert 
habe.

von Doran S. (utzer)


Angehängte Dateien:

Lesenswert?

Hallo,

habe nun den MPC2200 direkt an 3.3V gehängt und nun sind dessen Pegel 
auch 3.3V (bei high).

Allerdings bekomme ich weiterhin folgenden Fehler als Rückgabe vom Tool 
stm32flash:
1
> sudo stm32flash -b 19200 /dev/ttyACM0
2
stm32flash 0.5
3
4
http://stm32flash.sourceforge.net/
5
6
Interface serial_posix: 19200 8E1
7
Failed to read ACK byte
8
Unexpected reply from device on command 0x01

Habe mal das Oszi dran gehängt und die Kommunikation mitgeschnitten:
Kanal 1 ist der Pin PA9
Kanal 2 ist der Pin PA10

Kann man da irgendwas erkennen? (Frage an die Experten)

Viele Dank für eure Tipps, die ich bis jetzt schon erhalten habe!

von Doran S. (utzer)


Lesenswert?

Kann es an der Parität liegen?
Habe hier heraus gelesen, dass der MCP2200 nur "None" als Parität kann: 
https://www.microchip.com/forums/m535181.aspx

Kann man da was machen?

von Jdhdiebdkx (Gast)


Lesenswert?

Warum ist Kanal 1 idle low und dann idle high?

von Doran S. (utzer)


Angehängte Dateien:

Lesenswert?

Das kann ich mir auch nicht richtig erklären. Manchmal bekomme ich von 
stm32flash auch die Meldung: Warning: the interface was not closed 
properly. Kann das damit zusammen hängen?

Manchmal sieht es auch wie im Anhang aus...

Benötigt der STM32F103 unbedingt Parity=Even? Der MCP2200 scheint das 
nicht zu können....?

von W.S. (Gast)


Lesenswert?

Doran S. schrieb:
> Allerdings bekomme ich weiterhin folgenden Fehler als Rückgabe vom Tool
> stm32flash:

Hast du in deiner Nähe jemanden mit nem Windows-PC? Dann könntest du 
mein Flash-Programm benutzen. Dessen Vorteil gegenüber deiner 
Kommandozeile ist, daß ich Testroutinen eingebaut habe, also Test des 
seriellen Ports (ob Reset und Boot richtig herum kommen usw.) und des 
Chips (Status auslesen, Typ feststellen usw.)

Für's Programmieren solltest du besser Reset und Boot geeignet an deine 
serielle Schnittstelle heranführen als auf der LP irgendwelche Schalter 
zu haben.

Übrigens ist die Logik vom Boot-Pin bei STM32 genau andersherum als bei 
LPC.

W.S.

von Bauform B. (bauformb)


Lesenswert?

Doran S. schrieb:
> Benötigt der STM32F103 unbedingt Parity=Even?

auf jeden Fall, AN2606 sagt:
1
Once initialized, the USART1 configuration is:
2
8 bits, even parity and 1 Stop bit.
Eigentlich ist die AN3155 maßgeblich, aber die ist genauso schwammig 
formuliert wie das Datenblatt vom MCP2200. Rein theoretisch könnte man 
die Parität mit diesem Config Tool von Microchip einstellen, aber es 
gibt keinen Hinweis, dass es geht. Wie kann man so einen UART-Chip 
abliefern? Warum gibt es diese Firma eigentlich noch?

von Doran S. (utzer)


Lesenswert?

Genau das frage ich mich auch...
Das Config-Tool für den MCP2200 bietet keine Option, um die Parität zu 
ändern. Nur die Baudrate kann geändert werden.

@W.S. kann Dein Tool mit dem MCP2200 funktionieren, obwohl der MCP2200 
nur Parität=None kann?
Wenn ja, dann wäre es ja ein Versuch wert. Wo finde ich denn Dein 
Tool/Webseite?

von W.S. (Gast)


Lesenswert?

Doran S. schrieb:
> @W.S. kann Dein Tool mit dem MCP2200 funktionieren, obwohl der MCP2200
> nur Parität=None kann?
> Wenn ja, dann wäre es ja ein Versuch wert. Wo finde ich denn Dein
> Tool/Webseite?

Anders herum: ist dieser MCP2200 ein korrekt funktionierender 
USB-Seriell-Wandler? Und gibt es nen funktionierenen Treiber dafür? Wenn 
ja, dann geht es, wenn nicht dann nicht.

Und du findest diese Programm hier im Forum, konkret beim Unterforum 
Projeke+Code.

Aber wenn dein MCPdingsda keine Einstellung der Parität erlaubt, dann 
kann das Programmieren mit dem Bootlader nicht funktionieren, denn 
dieser verlangt es.

Kauf dir bei Ali einfach einen strunzbilligen USB-Seriell-Adapter, bei 
dem nicht nur RxD+TxD herausgeführt sind, sondern wo du auch an DTR und 
RTS heran kommst.

W.S.

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Auszug aus dem Datenblatt:
1
The MCP2200 responds by setting the baud rate only. The other parameters (Data Bits, Parity, Stop Bits) remain unchanged.

Das bedeutet für mich, dass der MCP2200 nur "keine Parität" kann und war 
für mich ein Grund, diesen nicht mehr zu verwenden.

stm32flash benötigt zwingend einen Parity Check und deshalb wird das mit 
stm32flash nicht funktionieren.

Hierfür habe ich dann den CH340G eingesetzt, der aber zumindest in der 
Linuximplementierung einen Fehler im Treiber genau bei der Generierung 
des Paritybits hat und der Treiber gepatcht werden muss. Quellen finden 
sich im Netz, z.Bsp. hier:

https://github.com/fraopess/CH341_driver_parity_patch

Zudem hat der CH340G das Problem, dass er an manchen Boards nur ein 
einziges mal über stm32flash angesprochen werden kann und dann in einem 
Betriebsmodi verbleibt, der einen weiteren Datentransfer nicht erlaubt.

Hierfür habe ich mir dann ein kleines Tool namens ch340reset geschrieben 
(Für Linux im Anhang, hier muss dann vor jedem stm32flash ein ch340reset 
aufgerufen werden).

Summa sumarum:

Mit dem MCP2200 wird es nicht gehen, mit dem CH340 und Anpassung geht 
es. Wenn du einfach nur "anschließen und glücklich sein willst" solltest 
du einen FTDI-Chip nehmen.

In

https://www.mikrocontroller.net/attachment/327595/stm8s103_boot.gif

findest du eine Verschaltung des CH340G für 3,3V, auch wenn hier ein 
STM8 an den CH340 angeschlossen ist, funktioniert diese Schaltung auch 
zum Flashen eines STM32 (wenn du die Reset und Boot0 Condition korrekt 
einhälst).

von Doran S. (utzer)


Lesenswert?

Super, vielen Dank für die zusätzlichen Erläuterungen. Werde wohl einen 
FTDI-Chip einsetzen und dann auch mal das Programm von W.S. testen.

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.