scifi 1 15 марта, 2015 Опубликовано 15 марта, 2015 · Жалоба Рановато вам с загрузчиком баловаться, имхо. В азах плаваете, мягко говоря. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pilatus 0 6 января, 2017 Опубликовано 6 января, 2017 (изменено) · Жалоба В заводской загрузчик на STM32F205 вхожу так: #define BOOTLOADER_ADDR 0x1FFF0000 typedef void (*pFunction)(void); pFunction Jump_To_Bootloader; uint32_t JumpAddress; JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4); Jump_To_Bootloader= (pFunction) JumpAddress; /* Initialize Stack Pointer */ __set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR ); Jump_To_Bootloader(); На других STM-ках возможно что-то подобное можно сделать. Что-то у меня не получается. Контроллер STM32F103RET6 Доходит до Jump_To_Bootloader() (брейкпоинтмами проверял) а дальше тишина. У меня бутлодер по адресу 0x08000000 (Я и этот адрес подставлял и тот что в предложенном коде) - бутлодер не запускается. Точнее не запускается все то, что он должен расшевеливать (у меня для отладки диод моргает). Если остановить программу (я отлаживаю в KEIL), то показывает адрес 0x08000182. Так значит он все-таки прыгает на начало флеша? Пробовал даже таблицу векторов предварительно обратно переносить - не получается. Как мне понять, что происходит? Из будтлодера же прыгает в основную программу нормально /* Test if user code is programmed starting from address "ApplicationAddress" */ if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } Изменено 6 января, 2017 пользователем Pilatus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pilatus 0 7 января, 2017 Опубликовано 7 января, 2017 · Жалоба Ну... практически разобрался. Контроллер оказывается заходит в бутлодер, но виснет на первой же строчке RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; Путем проб и ошибок выяснилось, что зависание в бутлодере происходит в том случае, если в основной программе, откуда произошел прыжок в бутлодер, включено прерывание таймера 2 по переполнению (ну может быть еще какие возможные условия есть, но у меня причиной было это). Если перед прыжком в бутлодер отключить прерывание, то все работает. Но все же гложет меня вопрос - почему так? В бутлодере таймеры не используются, конфликтовать не с чем. Я поэкспериментировал и с самим прерыванием от таймера - удалил его содержимое, даже сделал так, чтобы он переполнялся как можно реже (секунда) - все равно проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 7 января, 2017 Опубликовано 7 января, 2017 · Жалоба Таблица векторов меняется в бутлодере ? После смены таблицы и разрешенном прерывании - куда будет совершен переход при прерывании ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pilatus 0 8 января, 2017 Опубликовано 8 января, 2017 (изменено) · Жалоба Таблица векторов меняется в бутлодере ? После смены таблицы и разрешенном прерывании - куда будет совершен переход при прерывании ? Об этом я подумал в первую очередь, не помогло. Сейчас попробовал еще раз - тот же результат. Может я не так пробую? В основной программе я переношу таблицу так __set_PRIMASK(1); NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); __set_PRIMASK(0); в бутлодере в самом начале main() __set_PRIMASK(1); NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); __set_PRIMASK(0); Что ему не так? Изменено 8 января, 2017 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 8 января, 2017 Опубликовано 8 января, 2017 · Жалоба Что ему не так? Для нормального запуска нужно восстановить состояние которое было сразу после ресета. Самый простой способ добиться этого - устроить ресет. Сделать это Вам поможет функция void NVIC_SystemReset(void) из файла core_cm3.h. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pilatus 0 8 января, 2017 Опубликовано 8 января, 2017 · Жалоба Для нормального запуска нужно восстановить состояние которое было сразу после ресета. Самый простой способ добиться этого - устроить ресет. Сделать это Вам поможет функция void NVIC_SystemReset(void) из файла core_cm3.h. Спасибо! Самое то! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 30 июня, 2017 Опубликовано 30 июня, 2017 · Жалоба Подниму тему. Пытаюсь сделать bootloader по примеру AN4657-STM32Cube_IAP_using_UART, но для STM32F100CB. И не могу разобраться с Y-MODEMом. Терминалка Tera Term, не могу загрузить bin-файл. В дебаге докопался, что status = HAL_UART_Receive(&huart1, &char1, 1, RX_TIMEOUT) при попытке загрузки все время HAL_BUSY. Кто нибудь сталкивался с подобной проблемой? boot_100_HAL.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 12 июля, 2017 Опубликовано 12 июля, 2017 · Жалоба Победить HAL не смог, сделал на SPL по AN2557 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 12 июля, 2017 Опубликовано 12 июля, 2017 · Жалоба Победить HAL не смог, сделал на SPL по AN2557 Хоть и другое семейство, я тонкостей семейств не знаю, но вот в этом сообщении https://electronix.ru/forum/index.php?showt...t&p=1412512 есть совет для stm32f0xx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться