Ich habe einen Bootloader für mein Board geschrieben, aber er generiert einen harten Fehler, wenn er zum Anwendungscode springt.
Mein Fehler ist wie diese Frage:
Bootloader-Sprung zum Hauptanwendungsproblem bei Verwendung von STM32 mit Keil Uvision
Ich habe diese Schritte ausgeführt: im Anwendungscode :
Dann habe ich einen einfachen Code geschrieben (blinky)
im Bootloader-Code : Ich erhalte eine .bin-Datei mit USART und schreibe sie dann an die Adresse 0x8030000 von FLASH und den folgenden Code:
USART_DeInit(USART1);
RCC_DeInit();
__set_CONTROL(ENABLE_PRIVILEGE_MODE);
NVIC->ICER[ 0 ] = 0xFFFFFFFF ;
NVIC->ICER[ 1 ] = 0xFFFFFFFF ;
NVIC->ICER[ 2 ] = 0xFFFFFFFF ;
NVIC->ICPR[ 0 ] = 0xFFFFFFFF ;
NVIC->ICPR[ 1 ] = 0xFFFFFFFF ;
NVIC->ICPR[ 2 ] = 0xFFFFFFFF ;
SysTick->CTRL = 0 ;
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk ;
SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk |
SCB_SHCSR_BUSFAULTENA_Msk |
SCB_SHCSR_MEMFAULTENA_Msk );
__disable_irq();
if( CONTROL_SPSEL_Msk & __get_CONTROL( ) )
{ /* MSP is not active */
__set_MSP( __get_PSP( ) ) ;
__set_CONTROL( __get_CONTROL( ) & ~CONTROL_SPSEL_Msk ) ;
}
JumpAddress=(FLASH_WRITE_ADDRESS+4);
JumpToApplication =(void(*)(void))(*((uint32_t*)JumpAddress));
__set_MSP(*(__IO uint32_t*)FLASH_WRITE_ADDRESS);
JumpToApplication();
Aber es geht zu Hardfault. Also benutze ich jetzt diesen Teil des Codes:
/* Jump to user application */
JumpAddress = *(volatile uint32_t*)(FLASH_WRITE_ADDRESS+4);
JumpToApplication = (pFunction) JumpAddress;
__set_MSP((*(volatile uint32_t*) FLASH_WRITE_ADDRESS));
now_pointer=__get_MSP();
JumpToApplication();
aber es ist wie vorher. Was ist das Problem?
Dies ist eine Sekunde vor dem Sprung zum Anwendungscode:
Und dies ist das Ergebnis des Sprungs zum Anwendungscode:
okey.now, ich finde und löse das Problem: Ich habe mein Schreiben in FLASH-Fehlerbild eingefügt:
Höchstwahrscheinlich verwenden Sie den Standardstartcode aus dem STM in der Benutzeranwendung. Is setzt VTOR an den Anfang des FLASH-Speichers. Entfernen Sie diese Zeile und es sollte funktionieren
Ich finde meinen Fehler und löse ihn. Jetzt funktioniert mein Bootloader korrekt
aber mein problem:
1- Ich habe einen Vertrag abgeschlossen, die Adresszeile des Vektors ändern, nach dem Haupteintrag in der Anwendungsdatei.
2- Ich habe diese Zeilen in der Bootloader-Datei kommentiert:
__disable_irq();
__set_MSP((*(volatile uint32_t*) FLASH_WRITE_ADDRESS));
Ansonsten hatte ich einen Fehler beim Schreiben in Flash (ich beziehe mich nicht auf Little Indian)
und jetzt funktioniert mein Code richtig
Vielen Dank an alle, die mir helfen, dieses Problem zu lösen.
Da der Cortex m0+ nicht über einige der ausgefallenen 32-Bit- oder sogar 16-Bit-Zwischenprodukte verfügt und Sie sogar bis zur 1-KB-Grenze kompilieren, müssen Sie nur um 8 Bit nach links verschoben auf die neue Vektortabelle zeigen.
if ( firm1 > firm2) __asm("movs r0, #0x40"); // firmware at 0x4000
else __asm("movs r0, #0xa0"); // for firmware at 0xa000
__asm("lsls r0, r0, #8");
__asm("ldr r1, [r0]");
__asm("msr msp, r1"); // Set new MSP
__asm("msr psp, r1"); // PSP based on SP
__asm("ldr r1, [r0,#0x4]");
__asm("mov pc, r1"); // Jump by changing PC
Chris Stratton
hadisamani1996
Elliot Alderson
Oldtimer
Oldtimer
Oldtimer
Oldtimer
brhans
Jeroen3
hadisamani1996