|
|
  |
STM32 bootloader, написание собственного бута |
|
|
|
Dec 12 2014, 11:12
|
Участник

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

|
Цитата(Kabdim @ Dec 12 2014, 14:46)  Выглядит более менее, за исключением того что неясно как вы меняете таблицу прерываний с бутлоадера на вашу программу. А где менять менять? Я с таблицей ничего не делал. Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000 Цитата(Kabdim @ Dec 12 2014, 14:46)  Вы блинк пробовали прошить? Я свою прошивку заливаю.
|
|
|
|
|
Dec 12 2014, 13:19
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(vovanxp @ Dec 12 2014, 14:12)  А где менять менять? Я с таблицей ничего не делал. Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000
Я свою прошивку заливаю. SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам. Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний. Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс. Вдогонку, если у вас thumb, то младший бит адреса по которому переходите должен быть 1.
|
|
|
|
|
Dec 12 2014, 14:56
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 12 2014, 17:25
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 17 2014, 07:59
|
Участник

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

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

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

|
Цитата(AHTOXA @ Feb 20 2015, 08:46)  А как туда будет передаваться управление? Это будет автономный проект, загрузчик. Без прерываний, работа только по последовательному порту. После сброса попадаем в него. Если есть признак, что нужно обновить основную программу (или просто ждать сообщения секунды 4), принимаем, программируем, сбрасываемся. Если признака нет уходим на основную программу. Стартовый адрес (тот, что в прошивке по 0x00000000), сохраняем где-то в недрах..., и используем его для перехода. А вместо него при прошивке пишем адрес загрузчика. И не надо перемещать основную программу, удобно для отладки. Вижу вероятность получить неработающий прибор, когда сектор 0 уже стер, а записать не успел.
|
|
|
|
|
Feb 20 2015, 10:36
|

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

|
Цитата(AHTOXA @ Feb 20 2015, 12:17)  Я вот про это и спрашивал. Как мы попадаем в него? Насколько я знаю, после сброса можно попасть в три места: в начало флеша, в ОЗУ и в заводской загрузчик. Как обычно. В начале flash записан адрес (загрузчика, в данном случае), по которому переходим... ага, эта часть не отображается на нулевые адреса... и из нее, очевидно, нельзя выполнять программы. Но ведь в System Memory скакнуть, вроде, можно? Ладно, идею похерим. Займу нулевой сектор под загрузчик. Только разобраться надо, как основную программу создавать. Задать ее расположение с адреса 0x0800_4000, что ли? Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще? Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике? То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали...
|
|
|
|
|
Feb 20 2015, 12:20
|

Знающий
   
Группа: Участник
Сообщений: 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/
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Feb 20 2015, 13:01
|

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

|
Цитата(A. Fig Lee @ Feb 20 2015, 15:20)  Правильные пацаны просто читают мануаль в таком случае. Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров. Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет. И не факт что поможет. Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал.  Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000? Глянул в отладчике Memory View. Что по 0x00000000, что по 0x08000000 - одинаковое показывает. Первое слово - стек, второе - стартовый адрес - в обоих вариантах 0x0800EAC5. Куда-то в конец скачет, видимо, загрузка переменных.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|