Перейти к содержанию
    

Как программно загнать STM32 в бутлоадер?

В заводской загрузчик на 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();

    }

Изменено пользователем Pilatus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну... практически разобрался.

Контроллер оказывается заходит в бутлодер, но виснет на первой же строчке RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

Путем проб и ошибок выяснилось, что зависание в бутлодере происходит в том случае, если в основной программе, откуда произошел прыжок в бутлодер, включено прерывание таймера 2 по переполнению (ну может быть еще какие возможные условия есть, но у меня причиной было это).

Если перед прыжком в бутлодер отключить прерывание, то все работает.

 

Но все же гложет меня вопрос - почему так? В бутлодере таймеры не используются, конфликтовать не с чем. Я поэкспериментировал и с самим прерыванием от таймера - удалил его содержимое, даже сделал так, чтобы он переполнялся как можно реже (секунда) - все равно проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таблица векторов меняется в бутлодере ?

После смены таблицы и разрешенном прерывании - куда будет совершен переход при прерывании ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таблица векторов меняется в бутлодере ?

После смены таблицы и разрешенном прерывании - куда будет совершен переход при прерывании ?

 

Об этом я подумал в первую очередь, не помогло.

Сейчас попробовал еще раз - тот же результат. Может я не так пробую?

В основной программе я переношу таблицу так

        __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);

 

Что ему не так?

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что ему не так?

Для нормального запуска нужно восстановить состояние которое было сразу после ресета.

Самый простой способ добиться этого - устроить ресет.

Сделать это Вам поможет функция void NVIC_SystemReset(void) из файла core_cm3.h.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для нормального запуска нужно восстановить состояние которое было сразу после ресета.

Самый простой способ добиться этого - устроить ресет.

Сделать это Вам поможет функция void NVIC_SystemReset(void) из файла core_cm3.h.

Спасибо! Самое то!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подниму тему.

Пытаюсь сделать 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Победить HAL не смог, сделал на SPL по AN2557

Хоть и другое семейство, я тонкостей семейств не знаю, но вот в этом сообщении https://electronix.ru/forum/index.php?showt...t&p=1412512 есть совет для stm32f0xx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...