Mein Problem ist, dass mein Bootloader nicht zur Anwendung springt, oder vielleicht doch, aber dann wegen eines Interrupts zum Bootloader zurückspringt. Um Ihnen etwas zum Arbeiten zu geben, hier einige Informationen:
Der Code, der zur Anwendung springt
typedef void (*pFunction)(void);
pFunction Jump_To_Firmware;
void JumpToInternalFlashImage()
{
Jump_To_Firmware = (pFunction) (*(uint32_t *)(0x08008000 + 4));
__set_MSP(*(uint32_t*) 0x08008000);
Jump_To_Firmware();
}
Wie main in der Anwendung aussieht
int main(void)
{
// Copy ISRs to RAM
memcpy((uint8_t *)&_isr_vector_ram_start, (uint8_t *)&_isr_vector_flash_start, &_isr_vector_flash_end - &_isr_vector_flash_start);
// Relocate the vector table
SCB->VTOR = (uint32_t) &_isr_vector_ram_start;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
while (1)
{
HAL_UART_Transmit_DMA(&huart2, "hello", 5);
uint32_t i =0;
for(;i<1000000;i++);
}
Es sollte vielleicht darauf hingewiesen werden, dass dieses Programm gut funktioniert, wenn ich es über ST-Link ohne Bootloader-Code programmiere. Die wichtigen Teile dieses Codes sollten auch die ersten Zeilen sein, in denen ich die ISRs in den RAM kopiere und dann den Vektor verschiebe
Das Linkerscript sieht wie folgt aus, um Ihnen eine Vorstellung davon zu geben, woher die Adressen stammen (es sieht sowohl im Bootloader als auch in der Anwendung gleich aus).
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = 0x20050000; /* end of SRAM2 */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
// There are more areas but these should be the only relevant ones
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
RAM_ISR (xrw) : ORIGIN = 0x20000000, LENGTH = 512
RAM (xrw) : ORIGIN = 0x20000200, LENGTH = 64K - 512
}
SECTIONS
{
/* The startup code goes first into FLASH */
.isr_vector :
{
. = ALIGN(4);
_isr_vector_flash_start = .;
KEEP(*(.isr_vector)) /* Startup code */
_isr_vector_flash_end = .;
. = ALIGN(4);
} >FLASH
._isr_vector_ram (NOLOAD) :
{
. = ALIGN(4);
_isr_vector_ram_start = .;
KEEP(*(._isr_vector_ram)) /* Startup code */
. = ALIGN(4);
}>RAM_ISR
}
Mein Problem ist also, dass es nicht funktioniert, wenn ich versuche, zur Anwendung zu springen
Die ersten Adressen ab 0x8008000 (Startadresse der Anwendung) sehen aus
Und bei der Adresse 0x08004DD1 sieht es so aus
Was passiert ist, dass ich immer hängen bleibe, wenn der Programmzähler auf zeigt (er bewegt sich nicht von dieser Adresse, wenn er versucht, weiter zu gehen)
0x8007770
und MSP
0x2004ffe0
in der output.map für den bootloader kann ich sehen das 0x08007770 steht
.text.Default_Handler
0x08007770 0x2 startup/startup_stm32f746xx.o
0x08007770 RTC_Alarm_IRQHandler
0x08007770 EXTI2_IRQHandler
0x08007770 TIM8_CC_IRQHandler
0x08007770 DebugMon_Handler
0x08007770 UART8_IRQHandler
0x08007770 SPI4_IRQHandler
0x08007770 TIM1_CC_IRQHandler
0x08007770 DMA2_Stream5_IRQHandler
0x08007770 HardFault_Handler
and so on (the rest of the handlers )
Weiß jemand was mein Problem ist und wie ich es lösen kann? Bitte zögern Sie nicht, Fragen zu stellen, wenn Sie das Gefühl haben, dass ich es verpasst habe, Ihnen etwas zu sagen
Sie sollten Ihre Linker-Skripte dahingehend anpassen, dass die Programme in getrennte Flash-Bereiche geladen werden sollen. Also, für den Bootloader, den Sie brauchen
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K
und für die Bewerbung:
FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 992K /* (992 = 1024 - 32 */
Peter Mortensen
i
deklariert werdenvolatile
, um zu vermeiden, dass die Schleife vom Optimierer des Compilers entfernt wird?