Forum: Mikrocontroller und Digitale Elektronik STM32 F103 startet nicht


von Andreas K. (cortexandi)


Angehängte Dateien:

Lesenswert?

Hallo an alle!

Leider habe ich ein Problem mit meinem STM32F103RB und Keil uVision4.
Ich habe die ganze Zeit ein etwas größeres Programm auf dem STM32 
Developper-Board (MCBSTM32) von Keil entwickelt, was soweit auch sehr 
gut läuft (Prozessor läuft, debuggen funktioniert einwandfrei).
Wenn ich das ganze nun auf das eigentliche Tagetboard spiele, so klappt 
das auch einwandfrei, allerdings rührt sich der Prozessor kein bisschen.

Ich vermute das es daran liegen könnte, dass auf dem Developperboard ja 
ein externer Quarz verwendet wird, auf dem eigentlichen Target aber ein 
externer Oszillator (16 MHz) bestückt ist, dessen Taktsignal 
ausschliesslich auf "OSC_IN" gelegt ist. "OSC_OUT" ist nicht beschaltet.

Jetzt stehe ich leider total auf dem Schlauch und habe keine Ahnung, 
wieso nun bei dieser Konstellation kein Debug und nichts funktioniert. 
Ich nutze die Initialisierungsroutine von Keil "STM32_Init.c" (s. 
Anhang), allerdings wird diese ja nicht mal bearbeitet, da die 
Mainroutine ja auch nicht startet. Die Zeitanzeige im Debugmodus bleibt 
immer auf null stehen.

Habe auch schon verzweifelt versucht den internen Oszillator zu 
benutzen, was aber auch nicht so recht gelingen mag.

Hab mal den Schaltplan vom Targetboard mitgepostet, vielleicht kann mir 
ja einer von euch weiter helfen... :-) Wäre echt super!

Gruß
Andi

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Als erstes schau mal mit dem Oszi, ob der Oszillator das Signal wie 
erwartet liefert.
Im Manual steht folgendes:

External source (HSE bypass)
In this mode, an external clock source must be provided. It can have a 
frequency of up to 25
MHz. You select this mode by setting the HSEBYP and HSEON bits in the 
Clock control
register (RCC_CR). The external clock signal (square, sinus or triangle) 
with ~50% duty
cycle has to drive the OSC_IN pin while the OSC_OUT pin should be left 
hi-Z. See Figure 8.

hoffe das hilft

Grüsse

von Jörn K. (joern)


Lesenswert?

Wenn ich das richtig gesehen hab ist auf dem Keil Board ein 8 Mhz Quarz 
rauf und zu gehst jetzt aber mit einem 16 Mhz Oszillator auf den Chip. 
Da solltest du vorher die PLL noch anpassen:

16 * 9 = 144 Mhz -> STM32F103 geht aber nur bis 72 Mhz lt. DB.

von Matthias K. (matthiask)


Lesenswert?

Lass mal zum testen den internen Oszillator, 8MHz laufen, wenn es auf 
beiden Systemen dann geht, weißt Du erstmal, dass es wirklich ein 
Oszillatorproblem ist.

von Andreas K. (cortexandi)


Lesenswert?

Guten Morgen an alle und danke erst mal für die Antworten. :-)

Also mit dem Oszi habe ich den OSZ_IN Eingang schon überprüft, dort 
liegt ein sauberes 16 MHz Taktsignal an (auch wenn auf der Schematic 
irrtümlich 8 MHz angegeben ;-)).

Habe jetzt mal die PLL angepasst. Den Multiplikationsfaktor habe ich auf 
PLLSRC * 4 gesetzt, womit ich ja auf 16MHz * 4 = 64MHz komme. Damit 
sollte der STM32F103 ja klar kommen.
Allerdings ist damit immer noch das gleiche Problem.

Das mit dem internen Oszillator habe ich schon versucht, allerdings kann 
ich an der "Clock Configuration" einstellen was ich will, nichts tut 
sich.

Habe auch schon andere Tagetboards genommen, da ich dachte der 
Controller hätte nen Schlag, aber auch ohne Erfolg.

Das eigentliche Problem ist, dass der Prozessor irgendwie überhaupt 
nicht startet. Eigentich sollte doch beim Start zunächst der interne 
Oszillator verwendet werden, bis über die "Clock Configuration" etwas 
anderes eingestellt wird. Oder habe ich das falsch verstanden?

Nicht mal die main-Funktion startet:
1
int main (void) 
2
{
3
    stm32_Init ();                          /* Hier STM32 initialisieren */
4
    RCC_Initial();                          /* Enable periperal clock for DMA       */ 
5
6
    //ADC_Initial();            /* Analogeingang initialisieren */
7
8
    USB_Init();                            /* USB Initialization */
9
    USB_Connect(__TRUE);                 /* USB Connect */
10
11
    /* Unlock the Flash Program Erase controller */
12
    FLASH_Unlock();
13
    /* EEPROM Init */
14
    if ( FLASH_COMPLETE != EE_Init() )
15
    return FALSE;
16
17
    os_sys_init(Init);          /* Realtime-Kernel starten (starten der Task 'init') */
18
}

Könnte es denn sein, dass ich an den Pinnen noch etwas vergessen habe? 
Denn wie gesagt, die Initialisierungsroutine für die Clock Configuration 
wird ja nie gestartet, da der Prozessor nicht läuft.

Gruß

von AS (Gast)


Lesenswert?

Andreas K. schrieb:
> dass ich an den Pinnen noch etwas vergessen habe?

Was hat denn das jetzt mit Segeln zu tun?


- BOOT0 Pin überprüft?
- !RST Pin überprüft?
- JTAG-Gedöne mal abgezogen?
- direkt in main() mal Pins "getoggelt"
  (ohne den ganzen Konfig-Mist)

1
int main (void)
2
{
3
  ...
4
  return ...;
5
  ...
6
}

hübsch ;-)

von Philipp (Gast)


Lesenswert?

Also den Takt für USB musst du auch anpassen (48MHz), sonst geht nichts. 
Ist die CPU über JTAG ansprechbar?. Wie überprüfst du ob er 
funktioniert?

ciao,
Philipp

von Andreas K. (cortexandi)


Lesenswert?

AS schrieb:
>> dass ich an den Pinnen noch etwas vergessen habe?
>
> Was hat denn das jetzt mit Segeln zu tun?

Ich meinte natürlich ob an der Beschaltung der PINS irgendetwas fehlt. 
;-)

Also ich habe mal mit dem Oszi nachgemessen:

 -BOOT0 ist kontinuierlich auf NULL
  (Soll auch so sein, da ja vom Flash gebootet werden soll)

 -!RST ist NULL, beim übertragen der Software via SWJ kurzzeitig auf
  HIGH

Allerdings ist mir auf gefallen, dass !RST nicht komplett auf 0 V ab 
fällt, sondern nur auf ca. 1,5V. Vieleicht könnte das ja das Problem 
sein.

Wenn ich die GPIOs direkt in der Main toggel tut sich am Oszi rein gar 
nichts.

Die CPU ist über JTAG bzw. über SWJ ansprechbar. Kann mein Programm ja 
ohne Probleme in den Flash laden.

Am besten spreche ich mal mit dem Hardwareentwickler, der hat zwar vom 
Cortex keine Ahnung, aber vieleicht weiß er ja noch was...

Achso...

AS schrieb:
> int main (void)
> {
>   ...
>   return ...;
>   ...
> }
>
> hübsch ;-)

Das "return" wurde schon entfernt... ;-)

von Uwe (Gast)


Lesenswert?

Wenn RST Null ist, dann ist doch alles in ordnung. RST ist 0 aktiv. Das 
heißt bei 0 V macht er nen Reset. Der muß auf 1 gezogen werden für den 
normalen Betrieb.

von Andreas K. (cortexandi)


Lesenswert?

Andreas K. schrieb:
> Allerdings ist mir auf gefallen, dass !RST nicht komplett auf 0 V ab
> fällt, sondern nur auf ca. 1,5V. Vieleicht könnte das ja das Problem
> sein.

...

von Uwe (Gast)


Lesenswert?


von Uwe (Gast)


Lesenswert?

Was ist denn am /RST pin angeschlossen ? Der hat nur nen schwachen 
internen Pullup von ca. 40 KOhm.

von Andreas K. (cortexandi)


Lesenswert?

Also der !RST ist mit einem 10k Pulup an 3,3V angeschlossen. Zusätzlich 
ist noch ein 100nF KeKo zwischen !RST und GND.
Habe vorhin mal mit dem Entwickler des Boards telefoniert, der mir 
sagte, dass der LOW-Pegel maximal 0,8V betragen darf. In meinem Fall 
sind es aber ca. 1,5V. Also viel zu viel für einen sauberen Reset.

Ich versuche mal die !RST Leitung per Hand kurz auf 0V zu legen und 
schaue ob der Prozessor dann läuft.

von Andreas K. (cortexandi)


Lesenswert?

Problem gelöst!! :-)

Da die Resetleitung im Resetzustand nicht unter 0,8V fällt, wird der 
Prozessor auch nicht resettet.
Resetleitung per Hand mal auf 0V gelegt und siehe da, es funktioniert. 
:-)

Danke an alle für die Hilfe!

Gruß
Andi

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.