Forum: Mikrocontroller und Digitale Elektronik STM32 Bootloader aus Programm starten


von Stefan (Gast)


Lesenswert?

Hallo liebe MC Gemeinde!

Ich weiß, das mein Problem ein alter Hut ist, aber ich komme leider 
nicht weiter...

Ich nutze einen STM32F103C8T6 und möchte aus meinem Code den Bootloader 
starten (Gründe erstmal egal).

Ich setze den VTOR auf 0x1FFFF000 und springe dann mit
1
        LDR     R0, =0x1FFFF000
2
        LDR     SP, [R0, #0]
3
        LDR     PC, [R0, #4]

zu dem Bootloader. Das Ganze habe ich mit einem Terminal getestet, also 
den Code ausgeführt, per Terminal ein 0x7F und erhalte ein "y" zurück.
Soweit also alles i.O.
Wenn ich aber mit dem ST Flash Loader Demonstrator auf den F103 
zugreifen möchte, erhalte ich die Meldung "Cannot get available 
commands..."
Nun stehe ich voll aufm Schlauch, bin mir aber auch nicht sicher, ob der 
Verktor Offset richtig ist, oder ob da etwas anderes faul ist.
Noch als kleine Info: ich nutze den Basic Compiler von MikroElektronika, 
kann also mit C Libs nicht viel anfangen.

Danke schonmal fürs bis hierher lesen ;) noch dankbarer währe ich aber 
für eure Hilfe...

MfG Stefan

von holger (Gast)


Lesenswert?

Hast du das hier alles gemacht?

In addition to patterns described below, user can execute bootloader by 
performing a jump
to system memory from user code. Befor jumping to Bootloader user must :
•
Disable all peripheral clocks
•
Disable used PLL
•
Disable interrupts
•
Clear pending interrupts

von Stefan (Gast)


Lesenswert?

Sorry, hätte gleich meinen gesamten Code anhängen sollen:
1
    if tmp = "Boot" then
2
      text("Bootloader")
3
      RCC_APB1ENR = 0
4
      RCC_APB2ENR = 0
5
      RCC_AHBENR = 0
6
      RCC_CR = 0x00000081      'HSI Clock
7
      RCC_CFGR = 0x00346400
8
      EXTI_IMR = 0
9
      NVIC_SETENA0 = 0         'Interrupt 0-31 set-enable registers
10
      NVIC_SETENA1 = 0         'Interrupt 32-63 set-enable registers
11
      NVIC_SETENA2 = 0
12
      EXTI_PR = 0xFFFFF             'Pending register
13
      NVIC_VTOR = 0x1FFFF000
14
      asm
15
        LDR     R0, =0x1FFFF000
16
        LDR     SP, [R0, #0]
17
        LDR     PC, [R0, #4]
18
      end asm
19
    end if

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Welchen Compiler nutzt Du?

von Stefan (Gast)


Lesenswert?

Den mikroBasic PRO for ARM Version 4.2.0 von mikroElektronika.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Mache am Anfang vielleicht noch das rein:
asm
cpsid i

von Detlef K. (adenin)


Lesenswert?

Die Peripheral Reset Register APB1RSTR und APB2RSTR sind auch ganz 
nützlich dabei. ;)

von Stefan (Gast)


Lesenswert?

Bringt leider nichts, aber damit kann ich auf die SETENA Register 
verzichten...

von holger (Gast)


Lesenswert?

>Bringt leider nichts, aber damit kann ich auf die SETENA Register
>verzichten...

Das würde ich mir aber noch mal überlegen;)
So wie es aussieht muss für den Bootloader
die Hardware komplett clean sein, wie nach einem Reset
im Idealfall.

von Stefan (Gast)


Lesenswert?

Käme mir aber auf einen Versuch an (wenns denn mal funktioniert) ;)

von Stefan (Gast)


Lesenswert?

Hmm, mit den APB1RSTR und APB2RSTR kommt als Meldung direkt "No 
response..."

von sprites (Gast)


Lesenswert?

musst du nicht in deiner applikation einfach bei der startadresse 
(0x8000) das 0x82 löschen, dann reseten und via flash load demonstrater 
draufzugreifen. im notfall kannst du auf über den STVP 
(VisualProgrammer) den flash auslesen und an der adresse 0x8000 0x00 
hineinflashen, dann startet nach einem reset auch wieder der 
bootloader...

von Detlef K. (adenin)


Lesenswert?

sprites schrieb:
> musst du nicht in deiner applikation einfach bei der startadresse
> (0x8000) das 0x82 löschen, dann reseten und via flash load demonstrater
> draufzugreifen. im notfall kannst du auf über den STVP
> (VisualProgrammer) den flash auslesen und an der adresse 0x8000 0x00
> hineinflashen, dann startet nach einem reset auch wieder der
> bootloader...

Einfach nicht weiter ignorieren.

Stefan schrieb:
> Hmm, mit den APB1RSTR und APB2RSTR kommt als Meldung direkt "No
> response..."

Warscheinlich schießt Du dier die Schnittstelle ab.
Na dann setze doch das Bit für die nicht.

von Stefan (Gast)


Lesenswert?

Detlef Kunz schrieb:
> Na dann setze doch das Bit für die nicht.

OK, war ein langer Tag gestern.
Habe alles außer USART1, PortA und AFIO resettet.
1
  RCC_APB1RSTR = 0xFFFFFFFF
2
  RCC_APB2RSTR = 0xFFFFBFFA

Leider keine Änderung.

sprites schrieb:
> musst du nicht in deiner applikation einfach bei der startadresse
> (0x8000) das 0x82 löschen

??? Meinst du mit Startadresse den Start des Programmcodes? Währe dann 
aber 0x08000000 und da steht der Wert, der in den MSP geladen wird 
(0x20004FFC).
Außerdem müsste ich dann jedesmal die Werte ändern, wenn ich flashen, 
oder das Programm starten möchte...?!

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Du kannst auch ein sonstwie unbenutztes Deviceregister oder einen Pin 
auf einen definierten Wert setzten und dann einen Core-Reset machen. In 
deinem Start-Up Code pruefts Du dann das Register/ den Pin auf den Wert 
und springst zum Bootloader oder zu Deinen Programm.

Bei neueren STM32 Chips kann man das SYSCFG_MEMRMP entsprechend setzen, 
dann den Core-Reset ausloesen und man landet im ROM Bootloader.

von Stefan (Gast)


Lesenswert?

Habe jetzt den Aufruf
1
sub procedure Bootloader()
2
      text("Bootloader")
3
      delay_ms(2000)
4
      RCC_CR = 0x00000081
5
      RCC_CFGR = 0x00346400
6
      NVIC_VTOR = 0x1FFFF000
7
      asm
8
        LDR     R0, =0x1FFFF000
9
        LDR     SP, [R0, #0]
10
        LDR     PC, [R0, #4]
11
      end asm
12
end sub

direkt nach dem Start geladen und siehe da, es funktioniert. Ein 
unbenutzes Register prüfen ist eine sehr gute Idee. Das werde ich so 
umsetzen...

Danke an euch alle...

von Stefan (Gast)


Lesenswert?

Nur noch fürs Archiv:
Es ist wichtig die USART-Register zurückzusetzen. Der folgende 
Codeschnipsel funktioniert (zumindest bei mir ;))
1
      USART1_BRR = 0
2
      USART1_CR1 = 0
3
      RCC_CR = 0x00000081
4
      RCC_CFGR = 0x00346400
5
      NVIC_VTOR = 0x1FFFF000
6
      asm
7
        LDR     R0, =0x1FFFF000
8
        LDR     SP, [R0, #0]
9
        LDR     PC, [R0, #4]
10
      end asm

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.