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

 
 
8 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> STM32 bootloader, написание собственного бута
vovanxp
сообщение Dec 12 2014, 11:12
Сообщение #46


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-11
Пользователь №: 68 026



Цитата(Kabdim @ Dec 12 2014, 14:46) *
Выглядит более менее, за исключением того что неясно как вы меняете таблицу прерываний с бутлоадера на вашу программу.


А где менять менять? Я с таблицей ничего не делал.
Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000

Цитата(Kabdim @ Dec 12 2014, 14:46) *
Вы блинк пробовали прошить?

Я свою прошивку заливаю.


Go to the top of the page
 
+Quote Post
Kabdim
сообщение Dec 12 2014, 13:19
Сообщение #47


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(vovanxp @ Dec 12 2014, 14:12) *
А где менять менять? Я с таблицей ничего не делал.
Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000


Я свою прошивку заливаю.

SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам.
Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний.
Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс.

Вдогонку, если у вас thumb, то младший бит адреса по которому переходите должен быть 1.
Go to the top of the page
 
+Quote Post
vovanxp
сообщение Dec 12 2014, 14:56
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-11
Пользователь №: 68 026



Цитата(Kabdim @ Dec 12 2014, 16:19) *
SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам.
Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний.
Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс.

Вдогонку, если у вас thumb, то младший бит адреса по которому переходите должен быть 1.


В моей программе(не в загрузчике) я поменял дефайн
//#define VECT_TAB_OFFSET 0x00
#define VECT_TAB_OFFSET 0x20000

В SystemInit() есть такой кусок кода

#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

Сообщение отредактировал vovanxp - Dec 12 2014, 14:56
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Dec 12 2014, 17:25
Сообщение #49


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(vovanxp @ Dec 12 2014, 17:56) *
В моей программе(не в загрузчике) я поменял дефайн

Видимо нужно отладится в асемблере. К примеру мой код для кортекса м0
Код
void JumpToMainProgram() {
    __disable_irq();
    memcpy(MEMORY_OFFSET, MAIN_PROG_FLASH_OFFSET, INT_MEM_TO_MAP_SIZE);
    __set_MSP(*MAIN_PROG_FLASH_OFFSET);
    LPC_SYSCON->SYSMEMREMAP = 1;
    __enable_irq();
    ISRPtr application_reset_handler = *((ISRPtr*) (MAIN_PROG_FLASH_OFFSET + 1));
    goto *application_reset_handler;

}


MAIN_PROG_FLASH_OFFSET - указатель на u32

Сообщение отредактировал Kabdim - Dec 12 2014, 17:23
Go to the top of the page
 
+Quote Post
vovanxp
сообщение Dec 17 2014, 07:59
Сообщение #50


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-11
Пользователь №: 68 026



Только что удалось прошить через веб, причина было совсем капец, инициализацию IWDG закоментировал, а в обработчике прерывания таймера оставил HAL_IWDG_Refresh(&Hiwdg);
При обычном режиме все работало, но если основная программа начиналась с 0x8020000 программа не работала.

Одним словом причина была совсем в ином.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 19 2015, 10:44
Сообщение #51


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А можно ли утоптать загрузчик в память OTP (512 байтов), которая имеется, например, в STM32F207?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 20 2015, 05:46
Сообщение #52


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А как туда будет передаваться управление?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 20 2015, 07:53
Сообщение #53


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Feb 20 2015, 08:46) *
А как туда будет передаваться управление?

Это будет автономный проект, загрузчик. Без прерываний, работа только по последовательному порту. После сброса попадаем в него. Если есть признак, что нужно обновить основную программу (или просто ждать сообщения секунды 4), принимаем, программируем, сбрасываемся. Если признака нет уходим на основную программу. Стартовый адрес (тот, что в прошивке по 0x00000000), сохраняем где-то в недрах..., и используем его для перехода. А вместо него при прошивке пишем адрес загрузчика. И не надо перемещать основную программу, удобно для отладки.

Вижу вероятность получить неработающий прибор, когда сектор 0 уже стер, а записать не успел.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 20 2015, 09:17
Сообщение #54


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Feb 20 2015, 12:53) *
После сброса попадаем в него.

Я вот про это и спрашивал. Как мы попадаем в него? Насколько я знаю, после сброса можно попасть в три места: в начало флеша, в ОЗУ и в заводской загрузчик.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 20 2015, 10:36
Сообщение #55


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Feb 20 2015, 12:17) *
Я вот про это и спрашивал. Как мы попадаем в него? Насколько я знаю, после сброса можно попасть в три места: в начало флеша, в ОЗУ и в заводской загрузчик.

Как обычно. В начале flash записан адрес (загрузчика, в данном случае), по которому переходим... ага, эта часть не отображается на нулевые адреса... и из нее, очевидно, нельзя выполнять программы. Но ведь в System Memory скакнуть, вроде, можно?
Ладно, идею похерим. Займу нулевой сектор под загрузчик. Только разобраться надо, как основную программу создавать. Задать ее расположение с адреса 0x0800_4000, что ли?

Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще?
Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике?
То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 20 2015, 12:20
Сообщение #56


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(ViKo @ Feb 20 2015, 05:36) *
Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще?
Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике?
То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали...


Правильные пацаны просто читают мануаль в таком случае.
Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров.
Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет.
И не факт что поможет.
http://www.keil.com/forum/20219/stm32-and-interrupts/


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 20 2015, 13:01
Сообщение #57


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(A. Fig Lee @ Feb 20 2015, 15:20) *
Правильные пацаны просто читают мануаль в таком случае.
Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров.
Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет.
И не факт что поможет.

Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал. rolleyes.gif
Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000?

Глянул в отладчике Memory View. Что по 0x00000000, что по 0x08000000 - одинаковое показывает. Первое слово - стек, второе - стартовый адрес - в обоих вариантах 0x0800EAC5. Куда-то в конец скачет, видимо, загрузка переменных.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 20 2015, 13:29
Сообщение #58


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Видимо затем, что программу еще надо во флешку записать. А когда она заливается через встроенный заводской загрузчик, на нулевые адреса отражен этот самый загрузчик. Поэтому скомпилированная в "родные" адреса 0x0800.... программа будет заливаться любым способом.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 20 2015, 13:45
Сообщение #59


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А в чем тогда вообще великий смысл "отображения"? Ну, сказали бы, когда заданы биты (прочитаны ноги) такие-то, процессор запускается оттуда-то, а когда такие - оттуда. И шабаш, как говорил Шариков. Типа, нет по нулевым адресам ничего, и не будет, не ищите. rolleyes.gif Чтобы не пугать людей страшными цифрами адресов?
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 20 2015, 14:06
Сообщение #60


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(ViKo @ Feb 20 2015, 08:01) *
Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал. rolleyes.gif
Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000?

А как программа/компилятор поймет это РАМ или флаш, если обращение будет к 0х00000100 ?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:10
Рейтинг@Mail.ru


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