реклама на сайте
подробности

 
 
9 страниц V  « < 7 8 9  
Reply to this topicStart new topic
> Как программно загнать STM32 в бутлоадер?
scifi
сообщение Mar 15 2015, 15:31
Сообщение #121


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Рановато вам с загрузчиком баловаться, имхо. В азах плаваете, мягко говоря.
Go to the top of the page
 
+Quote Post
Pilatus
сообщение Jan 6 2017, 21:51
Сообщение #122


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 25-02-13
Пользователь №: 75 781



Цитата(AVNN @ Mar 7 2015, 22:51) *
В заводской загрузчик на 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 - Jan 6 2017, 21:45
Go to the top of the page
 
+Quote Post
Pilatus
сообщение Jan 7 2017, 08:01
Сообщение #123


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 25-02-13
Пользователь №: 75 781



Ну... практически разобрался.
Контроллер оказывается заходит в бутлодер, но виснет на первой же строчке RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
Путем проб и ошибок выяснилось, что зависание в бутлодере происходит в том случае, если в основной программе, откуда произошел прыжок в бутлодер, включено прерывание таймера 2 по переполнению (ну может быть еще какие возможные условия есть, но у меня причиной было это).
Если перед прыжком в бутлодер отключить прерывание, то все работает.

Но все же гложет меня вопрос - почему так? В бутлодере таймеры не используются, конфликтовать не с чем. Я поэкспериментировал и с самим прерыванием от таймера - удалил его содержимое, даже сделал так, чтобы он переполнялся как можно реже (секунда) - все равно проблемы.
Go to the top of the page
 
+Quote Post
x893
сообщение Jan 7 2017, 21:13
Сообщение #124


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Таблица векторов меняется в бутлодере ?
После смены таблицы и разрешенном прерывании - куда будет совершен переход при прерывании ?
Go to the top of the page
 
+Quote Post
Pilatus
сообщение Jan 8 2017, 05:40
Сообщение #125


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 25-02-13
Пользователь №: 75 781



Цитата(x893 @ Jan 8 2017, 00:13) *
Таблица векторов меняется в бутлодере ?
После смены таблицы и разрешенном прерывании - куда будет совершен переход при прерывании ?


Об этом я подумал в первую очередь, не помогло.
Сейчас попробовал еще раз - тот же результат. Может я не так пробую?
В основной программе я переношу таблицу так
Код
        __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 - Jan 8 2017, 17:46
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 8 2017, 10:02
Сообщение #126


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Pilatus @ Jan 8 2017, 12:40) *
Что ему не так?

Для нормального запуска нужно восстановить состояние которое было сразу после ресета.
Самый простой способ добиться этого - устроить ресет.
Сделать это Вам поможет функция void NVIC_SystemReset(void) из файла core_cm3.h.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Pilatus
сообщение Jan 8 2017, 11:18
Сообщение #127


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 25-02-13
Пользователь №: 75 781



Цитата(SSerge @ Jan 8 2017, 13:02) *
Для нормального запуска нужно восстановить состояние которое было сразу после ресета.
Самый простой способ добиться этого - устроить ресет.
Сделать это Вам поможет функция void NVIC_SystemReset(void) из файла core_cm3.h.

Спасибо! Самое то!
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Jun 30 2017, 09:41
Сообщение #128


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



Подниму тему.
Пытаюсь сделать 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 ( 78.86 килобайт ) Кол-во скачиваний: 9
 
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Jul 12 2017, 08:04
Сообщение #129


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



Победить HAL не смог, сделал на SPL по AN2557
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jul 12 2017, 11:00
Сообщение #130


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(A.Lex @ Jul 12 2017, 11:04) *
Победить HAL не смог, сделал на SPL по AN2557

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

9 страниц V  « < 7 8 9
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 03:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.06697 секунд с 7
ELECTRONIX ©2004-2016