I'm writing a second bootloader and I'd like to use a magic number to decide if staying in bootloader or running application. Something similar to this:
#include <cr_section_macros.h>
#define START_APPLICATION_MAGIC 0x4C514400
static __NOINIT_DEF uint32_t start_application;
if (start_application == START_APPLICATION_MAGIG) {
run_application();
} else {
/* Stay in the bootloader and waits for new application image
* to write in the Flash. After... */
start_application = START_APPLICATION_MAGIC;
NVIC_SystemReset();
}
Of course, start_application variable shouldn't be zeroed at reset and during startup code. I already used this tecnique in other applications.
Now, the linker puts start_application at address 0x2000149C and it is marked as .noinit in the map file. However it doesn't work.
If I put a break point on NVIC_SystemReset() instruction, I can see the magic number in start_application variable. When I proceed I stop the execution with another breakpoint in ResetISR(), before initializing bss and data sections. Now I see 0 at address 0x2000149C.
I tried to investigate deeper and I noticed all the address starting from 0x20001000 are zero at startup, while previous addresses (4kB) maintain values before reset.
Why this behaviour? I can't understand. The only reason for this could reside in the bootloader in ROM that should always start. However I don't know how much SRAM it uses and where.
Hello giusloq,
Check your startup file, maybe fill zero with uninitalized data, for example MCXUpresso IDE:
BR
Alice
Check your startup file, maybe fill zero with uninitalized data
I put a breakpoint at the beginning of ResetISR(), before initializing bss and data sections.
Even at this point, the variable that was initialized with a magic number before the reset appears again to zero.
I suspect it's a behaviour of ROM bootloader. Do you know if the ROM bootloader uses SRAM? If yes, which part of SRAM are touched by bootloader?
Hello giusloq,
Enter ISP mode, then use blhsot command "get-property 12":
The ROM reserved regions can be obtained from the blhost command "get-property 12".
Below picture is or lpc55xx:
BR
Alice
Not that it in any way is an answer to your problem...
On the LPC54x I use the RTCC RET RTC->GPREG registers for stuff like that (also when activating bootloader etc)
RTCC->RET[31].REG != 0xDEADBEEF
Correction, its RTC->GPREG[]
You just need to initialize the RTC before accessing the registers.
As I said, not a solution for your problem, just another way of solving the job
On the LPC54x I use the RTCC RET registers for stuff like that (also when activating bootloader etc)
Do you mean GPREGx, general purpose register, don't you? Because I can't see RET registers.
Is LPC54x a different MCU than LPC546xx?
Sorry, yes, too many different targets here
I meant:
RTC->GPREG[7] != 0xDEADBEEF