Mi problema es que mi cargador de arranque no está saltando a la aplicación, o tal vez sí, pero luego regresa al cargador de arranque debido a una interrupción. Para darte algo con que trabajar, aquí hay información:
El código que salta a la aplicación
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();
}
Cómo se ve main en la aplicación
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++);
}
Tal vez debería señalarse que este programa funciona bien si lo programo a través del enlace ST sin ningún código del cargador de arranque. Además, las partes importantes de este código deberían ser las primeras líneas en las que copio los ISR en la RAM y luego reubico el vector
El linkerscript se parece a lo siguiente para darle una idea de dónde provienen las direcciones (se ve igual en el cargador de arranque y en la aplicación)
/* 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
}
Mi problema es que cuando intento saltar a la aplicación no funciona
Las primeras direcciones de 0x8008000 (dirección de inicio de la aplicación) se ven como
Yaladirección0x08004DD1separecea
Lo que sucede es que siempre me quedo atascado cuando el contador del programa apunta a (no se mueve de esta dirección cuando intento avanzar)
0x8007770
y MSP
0x2004ffe0
en el output.map para el gestor de arranque puedo ver que 0x08007770 es
.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 )
¿Alguien sabe cuál es mi problema y cómo resolverlo? Por favor, siéntase libre de hacer preguntas si siente que no pude decirle algo