vovanxp 0 12 декабря, 2014 Опубликовано 12 декабря, 2014 · Жалоба Выглядит более менее, за исключением того что неясно как вы меняете таблицу прерываний с бутлоадера на вашу программу. А где менять менять? Я с таблицей ничего не делал. Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000 Вы блинк пробовали прошить? Я свою прошивку заливаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 12 декабря, 2014 Опубликовано 12 декабря, 2014 · Жалоба А где менять менять? Я с таблицей ничего не делал. Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000 Я свою прошивку заливаю. SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам. Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний. Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс. Вдогонку, если у вас thumb, то младший бит адреса по которому переходите должен быть 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovanxp 0 12 декабря, 2014 Опубликовано 12 декабря, 2014 (изменено) · Жалоба 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 Изменено 12 декабря, 2014 пользователем vovanxp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 12 декабря, 2014 Опубликовано 12 декабря, 2014 (изменено) · Жалоба В моей программе(не в загрузчике) я поменял дефайн Видимо нужно отладится в асемблере. К примеру мой код для кортекса м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 Изменено 12 декабря, 2014 пользователем Kabdim Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovanxp 0 17 декабря, 2014 Опубликовано 17 декабря, 2014 · Жалоба Только что удалось прошить через веб, причина было совсем капец, инициализацию IWDG закоментировал, а в обработчике прерывания таймера оставил HAL_IWDG_Refresh(&Hiwdg); При обычном режиме все работало, но если основная программа начиналась с 0x8020000 программа не работала. Одним словом причина была совсем в ином. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 февраля, 2015 Опубликовано 19 февраля, 2015 · Жалоба А можно ли утоптать загрузчик в память OTP (512 байтов), которая имеется, например, в STM32F207? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба А как туда будет передаваться управление? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба А как туда будет передаваться управление? Это будет автономный проект, загрузчик. Без прерываний, работа только по последовательному порту. После сброса попадаем в него. Если есть признак, что нужно обновить основную программу (или просто ждать сообщения секунды 4), принимаем, программируем, сбрасываемся. Если признака нет уходим на основную программу. Стартовый адрес (тот, что в прошивке по 0x00000000), сохраняем где-то в недрах..., и используем его для перехода. А вместо него при прошивке пишем адрес загрузчика. И не надо перемещать основную программу, удобно для отладки. Вижу вероятность получить неработающий прибор, когда сектор 0 уже стер, а записать не успел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба После сброса попадаем в него. Я вот про это и спрашивал. Как мы попадаем в него? Насколько я знаю, после сброса можно попасть в три места: в начало флеша, в ОЗУ и в заводской загрузчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба Я вот про это и спрашивал. Как мы попадаем в него? Насколько я знаю, после сброса можно попасть в три места: в начало флеша, в ОЗУ и в заводской загрузчик. Как обычно. В начале flash записан адрес (загрузчика, в данном случае), по которому переходим... ага, эта часть не отображается на нулевые адреса... и из нее, очевидно, нельзя выполнять программы. Но ведь в System Memory скакнуть, вроде, можно? Ладно, идею похерим. Займу нулевой сектор под загрузчик. Только разобраться надо, как основную программу создавать. Задать ее расположение с адреса 0x0800_4000, что ли? Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще? Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике? То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще? Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике? То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали... Правильные пацаны просто читают мануаль в таком случае. Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров. Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет. И не факт что поможет. http://www.keil.com/forum/20219/stm32-and-interrupts/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба Правильные пацаны просто читают мануаль в таком случае. Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров. Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет. И не факт что поможет. Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал. :rolleyes: Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000? Глянул в отладчике Memory View. Что по 0x00000000, что по 0x08000000 - одинаковое показывает. Первое слово - стек, второе - стартовый адрес - в обоих вариантах 0x0800EAC5. Куда-то в конец скачет, видимо, загрузка переменных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба Видимо затем, что программу еще надо во флешку записать. А когда она заливается через встроенный заводской загрузчик, на нулевые адреса отражен этот самый загрузчик. Поэтому скомпилированная в "родные" адреса 0x0800.... программа будет заливаться любым способом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба А в чем тогда вообще великий смысл "отображения"? Ну, сказали бы, когда заданы биты (прочитаны ноги) такие-то, процессор запускается оттуда-то, а когда такие - оттуда. И шабаш, как говорил Шариков. Типа, нет по нулевым адресам ничего, и не будет, не ищите. :rolleyes: Чтобы не пугать людей страшными цифрами адресов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 20 февраля, 2015 Опубликовано 20 февраля, 2015 · Жалоба Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал. :rolleyes: Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000? А как программа/компилятор поймет это РАМ или флаш, если обращение будет к 0х00000100 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться