Помогите домучать бутлоадер.
Программа бутлоадера записана по адресу 0x08000000. Программа пользователя пишется по адресу 0x0819000. Алгоритм бутлоадера такой: при сбросе ждем 5 секунд, если за это время по юсарту приходит нужная комбинация (короче устанавливается связь с внешним загрузчиком), то работает бутлоадер. А если связь не стуанавливается- загружается программа пользователя если она есть.
Не могу понять одного, как работает эта функция
Код
void JumpToApplication (uint32_t ApplicationAddress)
{
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
//__disable_interrupt(); // Запрещаем прерывания
NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_PROG_OFFSET);
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер)
{
//Адрес перехода из вектора Reset
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress; //Указатель на функцию перехода
__set_MSP(*(__IO uint32_t*) ApplicationAddress); //Устанавливаем SP приложения
Jump_To_Application(); //Запускаем приложение
}
}
Вроде бы все правильно работает до момента
[code]JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Насколько я понимаю, JumpAddress должна содержать адрес функции SystemInit. Но, у меня получается, что формируется фообще какой-то левый адрес, в котором расположен код бутлоадера.
Я так подозреваю, что причина в том, что нужно прежде чем билдить проект программы пользователя, которую нужно запистаь в память, нужно опредленным образомнастроить адрессацию где-то в настройках, то ли линковщик то ли не знаю. Потому что если брать обыкновенный проект в кейле, где настройки стоят по умолчанию, по адресу вектора сброса записывается адресс, где хранится программа, скомпилированная и слинкованная для базового адресса 0х08000000, поэтому если эту программу через программатор записать в камень и отлаживать, то адрес систем инит там будет к примеру по адресу 0х08000431. А если этот hex переслать в бутлоадер, то соответственно JumpAddress=0х08000431 будет принадлежать области порграммы бутлоадера.
Подскажите, пожалуйста, правильно ли я мыслю? И как настроить проект в Кейле, чтобы все хорошо работало???))))))))))))))))