Я полагаю, вы ссылаетесь на этот проект на https://github.com/akospasztor/stm32-bootloader
Цель Bootloader_CheckForApplication()
- определить, находится ли действительное приложение в APP_ADDRESS
или 0x0800 8000
.Начало этого образа приложения на самом деле - векторная таблица , поэтому значение *(__IO uint32_t*)APP_ADDRESS
является начальным значением указателя стека (SP).(Ссылка описывает Cortex-M3, но первые две записи таблицы векторов одинаковы для всех процессоров Cortex-M)
Вы можете увидеть использование этого начального SP и вектора сброса в функции Bootloader_JumpToApplication()
в том же исходном файле на https://github.com/akospasztor/stm32-bootloader/blob/master/Src/bootloader.c
Обратите внимание, что автор использует STM32L4, из которых начальный адрес ОЗУ равен 0x2000 0000
, последний адрес - 0x2003 FFFF
, а размер ОЗУ - 0x0004 0000
.В этом случае Bootloader_CheckForApplication()
проверяет, находится ли сохраненный начальный SP в области ОЗУ.
Однако эта проверка не будет правильной, если начальный SP окажется 0x2004 0000
, что является наивысшим допустимым значениемв этом случае.(Обратите внимание, что процессоры Cortex-M используют полный нисходящий стек )