Forum: Mikrocontroller und Digitale Elektronik stm32f103C8T6 Blue Pill Bug?


von Steph M. (stephh)


Lesenswert?

Hallo zusammen,

ich war gerade am verzweifeln. Ich verwende ein MD070SD Display mit 
16Bit parallel Bus an einem STM32f103C8T6 Board, welches in der Bucht 
sehr günstig zu erwerben ist, auch BluePill genannt.
https://developer.mbed.org/users/hudakz/code/STM32F103C8T6_Hello/

Jetzt ist mir aufgefallen, dass sich mein GPIOB Pin4 nicht rücksetzen 
lässt.
Getestet habe ich das ganze mit zwei Boards und auch einem minnimal 
Projekt (nur GPIOB Pin4).
Ist euch hierzu irgendetwas bekannt?
Ist schon jemand darüber gestolpert und weis vielleicht sogar warum das 
so ist? Optisch ist mir nichts aufgefallen, dass hier ein pull up oder 
dergleichen dran wäre. Komischerweise bleibt mir beim Debugen das IDR 
Register immer auf 1 hängen für Pin4, obwohl ODR auf 0 geht, womit ich 
auf einen externen pull up schließen würde.

wo habe ich gerade meinen Denkfehler?

Grüße,
Stephan


mein minnimal Beispiel:
1
#include "stm32f10x.h"
2
3
int main(void) {
4
  SystemInit();
5
  GPIO_InitTypeDef GPIO_InitStructure;
6
7
  // Clock Enable PortB, PortA
8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
9
10
  // Pins von PortB initialisieren
11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
12
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
13
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
14
  GPIO_Init(GPIOB, &GPIO_InitStructure);
15
16
  GPIO_ResetBits(GPIOB, GPIO_Pin_4);
17
  while (1) {
18
  }
19
}

von Leo C. (rapid)


Lesenswert?

Kein Bug, sondern ein "Feature".
Laut Datenblatt:
  Pin name: PB4; Main function (after reset): JNTRST

Erklärung dazu im Reference Manual (RM0008), Kapitel 9.3.5:
  JTAG/SWD alternate function remapping

von pegel (Gast)


Lesenswert?

Dazu müsste man aber absichtlich auf JTAG umschalten.

Meine waren original alle auf SWD.

von Steph M. (stephh)


Lesenswert?

Leo C. schrieb:
> Kein Bug, sondern ein "Feature".
> Laut Datenblatt:
>   Pin name: PB4; Main function (after reset): JNTRST
>
> Erklärung dazu im Reference Manual (RM0008), Kapitel 9.3.5:
>   JTAG/SWD alternate function remapping

super! danke für die Antwort. Darauf wäre ich wohl nie gestoßen. Mir ist 
dann gleich noch aufgefallen, dass auch DB3 vor belegt ist und ich 
dadurch immer ein par Grafikbuggs hatte. Nachdem ich die beiden Pins auf 
PA6 und PA8 umgezogen habe scheint jetzt einwandfrei zu funktionieren.


pegel schrieb:
> Dazu müsste man aber absichtlich auf JTAG umschalten.
>
> Meine waren original alle auf SWD.

Komisch. Kann das eventuell davon kommen, dass ich die Boards testweise 
mal über den Bootloader gebrannt habe? Absichtlich habe ich nichts 
umgestellt.

von Leo C. (rapid)


Angehängte Dateien:

Lesenswert?

Steph M. schrieb:
> Nachdem ich die beiden Pins auf
> PA6 und PA8 umgezogen habe scheint jetzt einwandfrei zu funktionieren.

Solange Du genug freie Pins hast, kannst Du solchen Problemen natürlich 
ausweichen. Sinnvoller wäre es aber, das Problem durch Setzen der 
Config-Bits im entsprechenden Register zu lösen, da JTAG ja 
offensichtlich nicht gebraucht wird. Z.B. auf "JTAG-DP Disabled and 
SW-DP Enabled", siehe Anhang. Wie das in der "stm32f10x.h Umgebung" 
geht, kann ich Dir allerdings nicht sagen.

> Komisch. Kann das eventuell davon kommen, dass ich die Boards testweise
> mal über den Bootloader gebrannt habe? Absichtlich habe ich nichts
> umgestellt.

Nein.

von Steph M. (stephh)


Lesenswert?

Leo C. schrieb:
> Solange Du genug freie Pins hast, kannst Du solchen Problemen natürlich
> ausweichen.

Das habe ich vor, aber erst mal eins nach dem anderen. Meine 
Display-Ansteuerung läuft jetzt. Nun kann ich mich mit diesem Thema 
befassen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Steph M. schrieb:
> Mir ist dann gleich noch aufgefallen, dass auch DB3 vor belegt ist und
> ich dadurch immer ein par Grafikbuggs hatte. Nachdem ich die beiden Pins
> auf PA6 und PA8 umgezogen habe scheint jetzt einwandfrei zu
> funktionieren.

Man kann PB3, PB4 usw. aber auch wieder reaktivieren, wenn man JTAG 
nicht benötigt.

Deshalb steht bei mir in jedem STM32-Projekt ziemlich am Anfang der 
main-Funktion:
1
#if defined (STM32F103)                                       // disable JTAG to get back PB3, PB4, PA13, PA14, PA15
2
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);      // turn on clock for the alternate function register
3
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  // disable the JTAG, enable the SWJ interface
4
#endif

Und schon hat man 5 Pins mehr zur Verfügung, die davon betroffen sind.

: Bearbeitet durch Moderator
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.