How to check for application request found in bootloader project

0

Iam doing a Bootloader for an arm cortex m0 based microcontroller and for that I have gone through some projects in github and I donot understand some of the lines in the following code. What is the meaning of the line *(__IO uint32_t*)APP_ADDRESS) & ~(RAM_SIZE-1) in the following code. It would be great if someone explains this. Thanks in advance.

#define APP_ADDRESS     (uint32_t)0x08008000
#define RAM_SIZE        (uint32_t)0x00040000

uint8_t Bootloader_CheckForApplication(void)
{
    return ( ((*(__IO uint32_t*)APP_ADDRESS) & ~(RAM_SIZE-1)) == 0x20000000 ) ? BL_OK : BL_NO_APP;
}
c
bootloader
cortex-m
asked on Stack Overflow Jun 24, 2018 by user8540390 • edited Jun 24, 2018 by Michael Petch

1 Answer

0

I believe you are referring to this project at https://github.com/akospasztor/stm32-bootloader

The purpose of Bootloader_CheckForApplication() is to determine whether a valid application is located from APP_ADDRESS or 0x0800 8000. The start of this application image is actually the vector table , thus the value *(__IO uint32_t*)APP_ADDRESS is the initial value of the Stack Pointer (SP). (The link discusses about Cortex-M3 but the first two entries of the vector table are the same for all Cortex-M processors)

You can see the use of this initial SP and the reset vector in function Bootloader_JumpToApplication() in the same source file at https://github.com/akospasztor/stm32-bootloader/blob/master/Src/bootloader.c

Note that the author is using STM32L4, of which the starting address of RAM is 0x2000 0000, the last address is 0x2003 FFFF, and the RAM size is 0x0004 0000. In this case, Bootloader_CheckForApplication() is checking if the stored initial SP is within RAM area.

However, this check will not be correct if the initial SP happens to be 0x2004 0000, which is the highest valid value in this case. (Note that Cortex-M processors use full descending stack)

answered on Stack Overflow Jun 27, 2019 by DinhQC

User contributions licensed under CC BY-SA 3.0