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

Выглядит более менее, за исключением того что неясно как вы меняете таблицу прерываний с бутлоадера на вашу программу.

 

А где менять менять? Я с таблицей ничего не делал.

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

 

Вы блинк пробовали прошить?

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

 

 

 

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


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

А где менять менять? Я с таблицей ничего не делал.

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

 

 

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

SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам.

Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний.

Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс.

 

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

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


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

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

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


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

В моей программе(не в загрузчике) я поменял дефайн

Видимо нужно отладится в асемблере. К примеру мой код для кортекса м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

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


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

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

При обычном режиме все работало, но если основная программа начиналась с 0x8020000 программа не работала.

 

Одним словом причина была совсем в ином.

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


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

А можно ли утоптать загрузчик в память OTP (512 байтов), которая имеется, например, в STM32F207?

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


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

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

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

 

Вижу вероятность получить неработающий прибор, когда сектор 0 уже стер, а записать не успел.

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


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

После сброса попадаем в него.

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

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


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

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

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

Ладно, идею похерим. Займу нулевой сектор под загрузчик. Только разобраться надо, как основную программу создавать. Задать ее расположение с адреса 0x0800_4000, что ли?

 

Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще?

Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике?

То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали...

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


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

Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще?

Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике?

То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали...

 

Правильные пацаны просто читают мануаль в таком случае.

Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров.

Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет.

И не факт что поможет.

http://www.keil.com/forum/20219/stm32-and-interrupts/

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


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

Правильные пацаны просто читают мануаль в таком случае.

Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров.

Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет.

И не факт что поможет.

Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал. :rolleyes:

Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000?

 

Глянул в отладчике Memory View. Что по 0x00000000, что по 0x08000000 - одинаковое показывает. Первое слово - стек, второе - стартовый адрес - в обоих вариантах 0x0800EAC5. Куда-то в конец скачет, видимо, загрузка переменных.

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


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

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

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


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

А в чем тогда вообще великий смысл "отображения"? Ну, сказали бы, когда заданы биты (прочитаны ноги) такие-то, процессор запускается оттуда-то, а когда такие - оттуда. И шабаш, как говорил Шариков. Типа, нет по нулевым адресам ничего, и не будет, не ищите. :rolleyes: Чтобы не пугать людей страшными цифрами адресов?

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


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

Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал. :rolleyes:

Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000?

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

 

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


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

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

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

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

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

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

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

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

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

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