О, благодаря вашему видео удалось собрать два ардуиновских скетча, в которых первый стартует второй (и даже второй потом снова стартует первый). Огромное спасибо! Теперь можно наконец прямо в ардуине написать загрузчик, накатывающий обновления с флешки.
Я так запустил программу в RAM. Запускаемую программу собрал в адресном пространстве RAM и бинарник её сунул запускающей программе. При старте я скопировал массив в нужный адрес RAM, загрузил из ее таблицы адрес ResetHandler и назначил его указателю на void функцию. Потом переназначил таблицу векторов, адрес указателя стека и дёрнул функцию передачи управления (ту самую void функцию). В новом стеке остаётся адрес возврата, который можно использовать, если нужно вернуться в загрузчик. Для этого нужно просто выйти из main функции.
Здравствуйте! По времени 10.50в видео Вы ставите настройку отчищать только сектор, а не весь чип, не подскажите где аналогичные настройки в CubeIDE, если таковые есть
Очень годный контент! Так держать! Есть вопрос : 16:34 как Вы настроили, чтобы не активная ветка условной компиляции выделялась серым цветом? Какие только настройки я не пробовал..... Если что, я использую Keil uVision 5.23
Здравствуйте! Спасибо за видео, за это и всё видео что Вы сделали. Повторил данный пример на F030. В нём нет регистра VTOR! и NVIC_SetVectorTable как в F100 тоже нет. Управление передается, но вероятно таблица векторов не подменяется. И еще проблема с переопределением тактовой частоты в главной программе. В загрузчике HSI включен, в главной программе тактирование от HSE включаю (с PLL) но частота все равно 8Mhz. Не сталкивались ли с подобными проблемами?
Загрузчик на f030 куда интересно у вас там программа помещается. Ну а по сути я в видео показываю общий подход. Для каждого конкретного контроллера reference manual позволит разобраться в деталях. Надо поднимать документацию на ядро и смотреть где он хранит информацию о векторе прерывания. А по тактирования тот же подход надо смотреть условия переключения.
@@VladimirMedintsev F030C8T6 - 64k, место есть, опять же сделал с прицелом на будущие проекты. Для себя сделал вывод, что если предполагается обновлять прошивку бутлоадером, чип лучше сразу с запасом по памяти выбирать. По документации понятно - использование HALовских DeInit не избавляет от ньюансов каждого конкретного чипа. Вобщем так подмена таблицы прерываний для F0: __disable_irq(); volatile uint32_t *VectorTable = (volatile uint32_t *)0x20000000; // адрес SRAM на который будет подменена область памяти 0x0000 0000 volatile uint32_t *SourseTable = (volatile uint32_t *)APPLICATION_ADDRESS; //адрес начала главной программы 0x0800 4000 for(uint32_t VectorIndex = 0; VectorIndex < 44; VectorIndex++) //Количество векторов - считал вручную по ASM файлу { VectorTable[VectorIndex] = SourseTable[VectorIndex]; // переносим копию таблицы с 0x08004000 на 0x20000000 }; SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_MEM_MODE); // Очистка битов регистра ремапа SYSCFG->CFGR1 |= (SYSCFG_CFGR1_MEM_MODE_0 | SYSCFG_CFGR1_MEM_MODE_1); //установка ремапа адресов теперь процессор обращаясь к содержимому по адресу 0x0000 0000 попадет на данные из адреса 0x2000 0000 куда скопирована таблица из 0x0800 4000. если нужно прыгнуть в бут, нужно очистить биты SYSCFG->CFGR1 - ремап вернется на 0x0800 0000
Поправте меня если я ошибаюсь. Как я понял, если использовать такой метод то в памяти микроконтролерра одновременно будут существовать две таблицы прерываний: первая создается от «бутлоадера», а вторая от «прошивки»?
Плата показанная на видео - 4х слойная. Так что два слоя не видно, на самом деле там не все так однозначно. На плате стоит радиомодуль GSM и сверху видно антенну. А так спасибо огромное за идею я как-нить сделаю видео по печатным платам и его сразу же утопят в потоке дизлайков. Просто единого мнения нету. Но идея огромное спасибо еще раз.
Спасибо Вам за уроки они мне помогали ещё с AVRok. Недавно стала передо мной задача написать загрузчик для оборудования. И все бы хорошо, да вот Corex M0 используемый на применяемом контроллере STM32F072R не поддерживает перенос векторов прирываний:(. В даташите вычитал что его можно скопировать в оперативку и от туда использовать. Но как это на деле выглядит не знаю. В интернете примеров не нашел. Подскажите пожалуйста.
Честно говоря я не видел такого в даташите на F0, не дадите номер страницы? Прям вот в рам можно, а во флэш нельзя? Хотя с другой стороны а что мешает то же самое провернусь с оперативной памятью?
@@РусланСидоров-й7п Да, спасибо, прочитал и удивился. С другой стороны они же и пишут вариант обхода этой особенности контроллера. Более того, они ссылаются на AN4065 а в нем (в его архиве) и есть пример который показывает как обходить эти ограничения. Думаю что разобраться там совсем не проблема.
Это все очень интересно, но теперь есть вопрос, а как устроен бутлодер с юсб (DFU режим) и с защитой от стирания? У меня в black pill можно программировать с помощью stlink не смещая ничего но бутлодер не стирается.
Добрый день! Можете подсказать, как лучше сделать оповещение об ошибке в программе, например, МК повис или произошла программная ошибка, и к примеру у нас есть красный светодиод и в случае ошибки его надо задействовать. Вопрос, как это лучше всего сделать?
@@Sergey_Bobrov Если повис, то сделать ничего нельзя. Но, в случаях возникновения ошибок все вполне реализуемо. Кроме того, после срабатывания сторожевого таймера тоже можно сказать что было не так. Ну в смысле сделать индикацию и разбор подвисания.
покажите пожалуйста пример на стм32 3-5 запущенных задач и передачу данных между ними. пусть даже это будет мигание светодиодами с разными периодами. может быть у стма есть для этого специальные аппаратные блоки или программные типовые шаблоны
Аппаратных блоков таких нет, а вот программные шаблоны есть. Называются они FreeRTOS. Очень удобная штука. С обменом данными между задачами, приоритетами, семафорами. Одно удовольствие с ней работать. Как-нибудь сделаю видео.
@@VladimirMedintsev , также интересно и без ОС. она съест половину выч мощности наверно. ОС наверно выгодно использовать при более 7- 10 задачах. а в простейших случаях хотелось бы без нее обойтись. например задача основная пид регулятор с периодом 5мкс , задача клавиатуры и задача вывода на дисплей. может у микроконтроллеров есть для этого соответствующее количество таймеров для прерываний.
@@aleksandrzakutnyy4450 Простите меня за грубость, но без операционной системы это просто извращение какое-то получится. Для вас видимо самое время прочитать про FreeRTOS. Она потребляет меньше того, что у вас на таймерах и прерываниях получится, а надежность в разы выше. Ну а про вычислительную мощность. Блин ее даже в самом дешевом процессоре столько, что не знаешь куда девать. А уж задача ПИД регулятора чего может быть проще.
Вы создаете программу, кроме всего прочего она может содержать обработчики прерываний которые сама же эта программа и использует. Это ее часть. Логично, что размещая в памяти вторую программу у нее будут свои обработчики прерываний. А как нам об этом сказать процессору? У него есть регистр.
Если я правильно понимаю, то достаточно установить соединение с памятью и дальше исполнять программу, залитую согласно указанным в видео правилам, только что её придётся сначала прочитать, потом записать в память контроллера, а потом уже исполнить, либо отслеживать исполнение каждой отдельной команды и читать память дальше до тех пор, пока данные в памяти не закончатся, но я вообще не уверен, что это возможно. Хотя, наверное, я просто плохой программист:)
Спасибо за добротный материал. А не подскажете, есть-ли возможность создания scatter файла линкера для одновременной заливки основной программы и дампа бутлоадера по нужным адресам?
Есть много способов одновременно залить и собственный бутлоадер и основную программу. Как правило линковать их вместе для этих целей нет никакого смысла. Наоборот правильнее заливать их последовательно. В этом случае меньше шанс утечки дешифрующей части бутлоадера в чужие руки. Хотя, конечно, это зависит от вашего подхода.
Вероятно неточно сформулировал, крипто вопросы не рассматриваются, скажем при первоначальной заливке продакшн версии проекта в "чистый" контроллер удобнее программировать все за один раз и не обязательно бутлоадер, а, например, основную программу и блок конфигурационных данных по начальным адресам флеша. Какие есть варианты?
Взять два или более готовых .hex файлов. Командой copy file1.hex + file2.hex + file3.hex скопировать в один файл, его и заливать в процессор любым доступным вам методом.
Ну а если вам так хочется использовать именно scatter файл, то читаем его формат и пишем как в инструкции. См ссылку. Но лично я такой вариант не использую. Т.к. если в каких программах и использую область данных во flash, то и загружает ее программа. Дерективы компилятора располагающие данные по конкретным адресам никто не отменял. www.keil.com/support/man/docs/ARMLINK/armlink_pge1362075656353.htm
@@urichaplin1424 Есть три видео на канале. Вот это, про FatFS и про работу с Flash. Если их соединить то получится именно то, что вы хотели. Я давно все рассказал и показал на примерах.
Тут вариантов много. Если созданное вами устройство имеет на борту USB, то вы можете эмулировать Mass Storage Device и принять прошивку как файл. Если хотите можете отправить прошивку по UART ну в принципе по абсолютно любому удобному для вас интерфейсу. Следовательно если это USB то со стороны компьютера вам ничего не нужно в принципе, если это UART то любой терминал. Логика я думаю понятна. Ну или вообще обновляйтесь через сеть. В данном случае я всего лишь показал как передавать управление.
Если это будет происходить через терминал ? как можно защититься от того что контроллер не будет успевать принимать новые данные а данные будут продолжать лететь. Mass Storage Device пока не вникал но виртуальный ком порт думаю подниму (я на SPL) Думаю пользователю будет удобнее пользоваться только USB шнурком . а не USB-TTL переходником.
У всего есть свое назначение и цель. На SPL удобно писать части программы наиболее критичные по времени и занимаемому обьему. На HAL писать гораздо быстрее и проще. Сейчас ведь у всех какая цель - продукт должен максимально быстро оказаться на рынке, а доделывать потом в следующей ревизии. Маркетинг мать его...
@@VladimirMedintsev Очень странный у вас подход. Если человек просмотрел и осознал ваше видео, то он обязательно сам должен ручками набить текст проекта, вместо того чтобы взять готовые примеры и доработать под себя? Вообще считается хорошим тоном выкладывать исходники о которых идет речь в видео. Ну и похоже вы сами взяли за основу видео и исходники от avislab www.avislab.com/blog/stm32-bootloader_ru/ . Ничего не имею против этого, дополнительные объяснения никогда не помешают, хотя возможно стоило упомянуть автора.
@@Sergey_Bobrov Скажите, а вы по поводу основы, такое заключение сделали только по той причине, что увидели в тексте appJumpAddress? Если так, то немного вас расстрою. На хабре - habr.com/ru/post/309218/ переменная так же называется. Такая же стилистика в имени переменной используется на сайтах cyberforum.ru, itnan.ru, radiokot.ru, it-ua.info, rssing.com, telegrammy.net ну и еще пару сотен адресов могу привести. И вот на микротехнике JumpAddress, что тоже очень похоже. А если серьезно, то идею для этого кода и идею имени переменной я взял на сайте www.keil.com. Так какого автора по вашему мне стоило упоминать? Ну между прочим avislab я до этого не видел. Надо будет поглядеть.
@@VladimirMedintsev Понятное дело, что того автора, у которого взяли идею. Хотя в любом случае это ваше дело. А вот про выкладывание исходников все-таки предлагаю подумать.
Ну какие тут исходники, десяток строчек кода и подправленный адрес памяти в настройках? Автор объяснил теорию, для меня это важней. Адрес перехода, стек и таблица векторов. Просто.
@@VladimirMedintsevнекорректно обьясняете,в переменной appjumpaddress будет не то что вы там написали 0x0800C000,а именно адресс Reset H тоесть адресс перехода но основную программу,а по 0x0800C000 хранится адресс указателя стека,тоесть его вершина которая записывается в регистр SP
@@VladimirMedintsev у вас hal вызывает system init до main, где переназначает vtor. Делая одно и то же в разных местах, вы просто подкладываете бомбу программисту, которому достанется в наследство ваш код.
А можно сделать так чтобы процессор прошивал себя самостоятельно, а в случае проблемы восстанавливал предыдущую версию прошивки. Сложного в этом ничего нету. И boot0 в этом случае не понадобится. В случае с Марсом выглядит все немного по другому. Там несколько процессоров в виде одинаковых блоков действуют параллельно, и сбойный модуль просто исключается из процесса принятия решения. Т.е. его можно исключать из кластера. Да, это требует определенного подхода к проектированию системы в целом, но в медицине, авиации и космосе это применяется. К примеру в инсулиновых помпах стоит 2 процессора.
Было бы полезно указать способ указать свойство NO RETURN на функцию перехода из бутлоадера в прошивку (чтобы пре переходе стек не заполнялся сразу адресом возврата). И в дополнение, при использовании библиотеки HAL адрес смещения вектора прерываний указывается в файле system_stm32xxxxx.c (/*!< Uncomment the following line if you need to relocate your vector Table in Internal SRAM. */ /* #define VECT_TAB_SRAM */ //#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field. //This value must be a multiple of 0x200. */)
@@VladimirMedintsev Неверно. Вы сначала устанавливаете новый стек, а потом делаете переход, а значит новый стек уже будет использован для хранения адреса возврата.
О, благодаря вашему видео удалось собрать два ардуиновских скетча, в которых первый стартует второй (и даже второй потом снова стартует первый). Огромное спасибо! Теперь можно наконец прямо в ардуине написать загрузчик, накатывающий обновления с флешки.
Огромное спасибо! Всё просто и понятно объяснили! Попробовал - получилось!
С удовольствием посмотрел урок. Спасибо, очень понятно и доступно объясняете.
Большое спасибо! Без вас никогда бы не разобрался!
Огромное спасибо за видео. Очень познавательно!
Спасибо.
Большое спасибо! Всё по полочками и с объяснениями!!! Лайк!
Спасибо.
Спасибо! Все коротко и ясно.
Как раз недавно читал про создание загрузчиков. Хорошее видео!
Спасибо за урок!
Еще раз - СПАСИБО ОГРОМНОЕ. И донатики.
Я так запустил программу в RAM. Запускаемую программу собрал в адресном пространстве RAM и бинарник её сунул запускающей программе. При старте я скопировал массив в нужный адрес RAM, загрузил из ее таблицы адрес ResetHandler и назначил его указателю на void функцию. Потом переназначил таблицу векторов, адрес указателя стека и дёрнул функцию передачи управления (ту самую void функцию). В новом стеке остаётся адрес возврата, который можно использовать, если нужно вернуться в загрузчик. Для этого нужно просто выйти из main функции.
Спасибо большое. Ждём новых видео
прикольный гайд. Буду пробовать.
Дякую за пояснення,)Промучивши пів дня L552, невийшло завести перехід до основної програми( Завтра вже з більш менш розуміням це робитиму.
Здравствуйте! По времени 10.50в видео Вы ставите настройку отчищать только сектор, а не весь чип, не подскажите где аналогичные настройки в CubeIDE, если таковые есть
По смещению таблицы векторов: у меня заработало только когда изменил VECT_TAB_OFFSET, пока пытался изменить VTOR в main - не работало.
Очень годный контент!
Так держать!
Есть вопрос :
16:34 как Вы настроили, чтобы не активная ветка условной компиляции выделялась серым цветом? Какие только настройки я не пробовал.....
Если что, я использую Keil uVision 5.23
По умолчанию так работает.
Добрый день. Не подскажете, каким плагином Вы раскрашивали содержимое hex-файла в notepad++?
Все по умолчанию. Ничего не устанавливал.
Странною У меня последняя версия notepad++, но ничего не подсвечивается :-(
Всё. Нашел. Спасибо.
Здравствуйте! Спасибо за видео, за это и всё видео что Вы сделали. Повторил данный пример на F030. В нём нет регистра VTOR! и NVIC_SetVectorTable как в F100 тоже нет. Управление передается, но вероятно таблица векторов не подменяется. И еще проблема с переопределением тактовой частоты в главной программе. В загрузчике HSI включен, в главной программе тактирование от HSE включаю (с PLL) но частота все равно 8Mhz. Не сталкивались ли с подобными проблемами?
Загрузчик на f030 куда интересно у вас там программа помещается. Ну а по сути я в видео показываю общий подход. Для каждого конкретного контроллера reference manual позволит разобраться в деталях. Надо поднимать документацию на ядро и смотреть где он хранит информацию о векторе прерывания. А по тактирования тот же подход надо смотреть условия переключения.
@@VladimirMedintsev F030C8T6 - 64k, место есть, опять же сделал с прицелом на будущие проекты. Для себя сделал вывод, что если предполагается обновлять прошивку бутлоадером, чип лучше сразу с запасом по памяти выбирать. По документации понятно - использование HALовских DeInit не избавляет от ньюансов каждого конкретного чипа.
Вобщем так подмена таблицы прерываний для F0:
__disable_irq();
volatile uint32_t *VectorTable = (volatile uint32_t *)0x20000000; // адрес SRAM на который будет подменена область памяти 0x0000 0000
volatile uint32_t *SourseTable = (volatile uint32_t *)APPLICATION_ADDRESS;
//адрес начала главной программы 0x0800 4000
for(uint32_t VectorIndex = 0; VectorIndex < 44; VectorIndex++)
//Количество векторов - считал вручную по ASM файлу
{
VectorTable[VectorIndex] = SourseTable[VectorIndex];
// переносим копию таблицы с 0x08004000 на 0x20000000
};
SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_MEM_MODE);
// Очистка битов регистра ремапа
SYSCFG->CFGR1 |= (SYSCFG_CFGR1_MEM_MODE_0 | SYSCFG_CFGR1_MEM_MODE_1); //установка ремапа адресов
теперь процессор обращаясь к содержимому по адресу 0x0000 0000 попадет на данные из адреса 0x2000 0000 куда скопирована таблица из 0x0800 4000.
если нужно прыгнуть в бут, нужно очистить биты SYSCFG->CFGR1 - ремап вернется на 0x0800 0000
Поправте меня если я ошибаюсь. Как я понял, если использовать такой метод то в памяти микроконтролерра одновременно будут существовать две таблицы прерываний: первая создается от «бутлоадера», а вторая от «прошивки»?
Абсолютно верно, но в регистре процессора хранится адрес начала только той таблицы, которая соответствует выполняемой программе.
Добрый день(вечер). Расскажите, почему вы убираете полностью медь с плат, оставляя только дорожки?
Плата показанная на видео - 4х слойная. Так что два слоя не видно, на самом деле там не все так однозначно. На плате стоит радиомодуль GSM и сверху видно антенну.
А так спасибо огромное за идею я как-нить сделаю видео по печатным платам и его сразу же утопят в потоке дизлайков. Просто единого мнения нету. Но идея огромное спасибо еще раз.
День добрый. Почему видос про шифрование не доступен?
Такова жизнь.
@@VladimirMedintsev :) За деньги можно где то посмотреть?
@MAGAVHEBRON easyembedded.ru/
Спасибо Вам за уроки они мне помогали ещё с AVRok. Недавно стала передо мной задача написать загрузчик для оборудования. И все бы хорошо, да вот Corex M0 используемый на применяемом контроллере STM32F072R не поддерживает перенос векторов прирываний:(. В даташите вычитал что его можно скопировать в оперативку и от туда использовать. Но как это на деле выглядит не знаю. В интернете примеров не нашел. Подскажите пожалуйста.
Честно говоря я не видел такого в даташите на F0, не дадите номер страницы? Прям вот в рам можно, а во флэш нельзя? Хотя с другой стороны а что мешает то же самое провернусь с оперативной памятью?
@@VladimirMedintsev Даташит RM0091 страница 53, раздел Physical remap.
@@РусланСидоров-й7п Да, спасибо, прочитал и удивился. С другой стороны они же и пишут вариант обхода этой особенности контроллера. Более того, они ссылаются на AN4065 а в нем (в его архиве) и есть пример который показывает как обходить эти ограничения. Думаю что разобраться там совсем не проблема.
Это все очень интересно, но теперь есть вопрос, а как устроен бутлодер с юсб (DFU режим) и с защитой от стирания? У меня в black pill можно программировать с помощью stlink не смещая ничего но бутлодер не стирается.
Он в системной части памяти. Вы не можете его стереть.
@@VladimirMedintsev вот оно как, понял, спасибо. пошел изучать этот вопрос.
Добрый день! Можете подсказать, как лучше сделать оповещение об ошибке в программе, например, МК повис или произошла программная ошибка, и к примеру у нас есть красный светодиод и в случае ошибки его надо задействовать. Вопрос, как это лучше всего сделать?
Если МК повис, то светодиод уже не сработает, в этом случае спасет watchdog timer.
@@Sergey_Bobrov Если повис, то сделать ничего нельзя. Но, в случаях возникновения ошибок все вполне реализуемо. Кроме того, после срабатывания сторожевого таймера тоже можно сказать что было не так. Ну в смысле сделать индикацию и разбор подвисания.
покажите пожалуйста пример на стм32 3-5 запущенных задач и передачу данных между ними. пусть даже это будет мигание светодиодами с разными периодами. может быть у стма есть для этого специальные аппаратные блоки или программные типовые шаблоны
Аппаратных блоков таких нет, а вот программные шаблоны есть. Называются они FreeRTOS. Очень удобная штука. С обменом данными между задачами, приоритетами, семафорами. Одно удовольствие с ней работать. Как-нибудь сделаю видео.
@@VladimirMedintsev , также интересно и без ОС. она съест половину выч мощности наверно. ОС наверно выгодно использовать при более 7- 10 задачах. а в простейших случаях хотелось бы без нее обойтись. например задача основная пид регулятор с периодом 5мкс , задача клавиатуры и задача вывода на дисплей. может у микроконтроллеров есть для этого соответствующее количество таймеров для прерываний.
@@aleksandrzakutnyy4450 Простите меня за грубость, но без операционной системы это просто извращение какое-то получится. Для вас видимо самое время прочитать про FreeRTOS. Она потребляет меньше того, что у вас на таймерах и прерываниях получится, а надежность в разы выше. Ну а про вычислительную мощность. Блин ее даже в самом дешевом процессоре столько, что не знаешь куда девать. А уж задача ПИД регулятора чего может быть проще.
Было очень полезно, спасибо!
Но можете объяснить пожалуйста почему мы смешаем таблицу векторов прерывания?
Вы создаете программу, кроме всего прочего она может содержать обработчики прерываний которые сама же эта программа и использует. Это ее часть.
Логично, что размещая в памяти вторую программу у нее будут свои обработчики прерываний. А как нам об этом сказать процессору? У него есть регистр.
Cпасибо, Владимир! Приходилось ли Вам писать загрузчик для программы расположенной во внешней QSPI Nor Flash, другими словами, реализовать XiP?
Нет, не приходилось.
Если я правильно понимаю, то достаточно установить соединение с памятью и дальше исполнять программу, залитую согласно указанным в видео правилам, только что её придётся сначала прочитать, потом записать в память контроллера, а потом уже исполнить, либо отслеживать исполнение каждой отдельной команды и читать память дальше до тех пор, пока данные в памяти не закончатся, но я вообще не уверен, что это возможно. Хотя, наверное, я просто плохой программист:)
Спасибо за добротный материал. А не подскажете, есть-ли возможность создания scatter файла линкера для одновременной заливки основной программы и дампа бутлоадера по нужным адресам?
Есть много способов одновременно залить и собственный бутлоадер и основную программу. Как правило линковать их вместе для этих целей нет никакого смысла. Наоборот правильнее заливать их последовательно. В этом случае меньше шанс утечки дешифрующей части бутлоадера в чужие руки. Хотя, конечно, это зависит от вашего подхода.
Вероятно неточно сформулировал, крипто вопросы не рассматриваются, скажем при первоначальной заливке продакшн версии проекта в "чистый" контроллер удобнее программировать все за один раз и не обязательно бутлоадер, а, например, основную программу и блок конфигурационных данных по начальным адресам флеша. Какие есть варианты?
Взять два или более готовых .hex файлов. Командой copy file1.hex + file2.hex + file3.hex скопировать в один файл, его и заливать в процессор любым доступным вам методом.
Ну а если вам так хочется использовать именно scatter файл, то читаем его формат и пишем как в инструкции. См ссылку. Но лично я такой вариант не использую. Т.к. если в каких программах и использую область данных во flash, то и загружает ее программа. Дерективы компилятора располагающие данные по конкретным адресам никто не отменял. www.keil.com/support/man/docs/ARMLINK/armlink_pge1362075656353.htm
Спасибо за разъяснения.
А можно сделать чтобы программа загружалась с СД карточки. Меняю карточку загружается новая версия/другая программа ?
@@urichaplin1424 Разумеется можно.
@@VladimirMedintsev И Вы можете сказать как ? И даже есть пример ?
@@urichaplin1424 Да, я могу сказать как.
@@VladimirMedintsev И за сколько ?
@@urichaplin1424 Есть три видео на канале. Вот это, про FatFS и про работу с Flash. Если их соединить то получится именно то, что вы хотели. Я давно все рассказал и показал на примерах.
Добрый день . А со стороны компьютера какой софт можно использовать для обновления прошивки?
Тут вариантов много. Если созданное вами устройство имеет на борту USB, то вы можете эмулировать Mass Storage Device и принять прошивку как файл. Если хотите можете отправить прошивку по UART ну в принципе по абсолютно любому удобному для вас интерфейсу. Следовательно если это USB то со стороны компьютера вам ничего не нужно в принципе, если это UART то любой терминал. Логика я думаю понятна.
Ну или вообще обновляйтесь через сеть. В данном случае я всего лишь показал как передавать управление.
Если это будет происходить через терминал ? как можно защититься от того что контроллер не будет успевать принимать новые данные а данные будут продолжать лететь. Mass Storage Device пока не вникал но виртуальный ком порт думаю подниму (я на SPL) Думаю пользователю будет удобнее пользоваться только USB шнурком . а не USB-TTL переходником.
неужели проще перейти на HAL ?
У всего есть свое назначение и цель. На SPL удобно писать части программы наиболее критичные по времени и занимаемому обьему. На HAL писать гораздо быстрее и проще. Сейчас ведь у всех какая цель - продукт должен максимально быстро оказаться на рынке, а доделывать потом в следующей ревизии. Маркетинг мать его...
Все зависит от создаваемого вами устройства. А что касается успевать-не успевать так для этого есть контроль CTS-RTS и все такое...
Хорошо бы примеры на github выкладывать.
Нет, выкладывать я ничего и никуда не буду.
Я показываю что и как можно делать, а делать каждый должен сам.
@@VladimirMedintsev Очень странный у вас подход. Если человек просмотрел и осознал ваше видео, то он обязательно сам должен ручками набить текст проекта, вместо того чтобы взять готовые примеры и доработать под себя? Вообще считается хорошим тоном выкладывать исходники о которых идет речь в видео.
Ну и похоже вы сами взяли за основу видео и исходники от avislab www.avislab.com/blog/stm32-bootloader_ru/ . Ничего не имею против этого, дополнительные объяснения никогда не помешают, хотя возможно стоило упомянуть автора.
@@Sergey_Bobrov Скажите, а вы по поводу основы, такое заключение сделали только по той причине, что увидели в тексте appJumpAddress? Если так, то немного вас расстрою. На хабре - habr.com/ru/post/309218/ переменная так же называется. Такая же стилистика в имени переменной используется на сайтах cyberforum.ru, itnan.ru, radiokot.ru, it-ua.info, rssing.com, telegrammy.net ну и еще пару сотен адресов могу привести. И вот на микротехнике JumpAddress, что тоже очень похоже. А если серьезно, то идею для этого кода и идею имени переменной я взял на сайте www.keil.com. Так какого автора по вашему мне стоило упоминать? Ну между прочим avislab я до этого не видел. Надо будет поглядеть.
@@VladimirMedintsev Понятное дело, что того автора, у которого взяли идею. Хотя в любом случае это ваше дело. А вот про выкладывание исходников все-таки предлагаю подумать.
Ну какие тут исходники, десяток строчек кода и подправленный адрес памяти в настройках? Автор объяснил теорию, для меня это важней. Адрес перехода, стек и таблица векторов. Просто.
Здраствуйте,делаю все тоже самое через cmsis, почему то не выполняется программа
Если мы говорим о передаче управления, то она и написана на CMSIS, и как видно из видео - работает.
@@VladimirMedintsevвы то hal пользуетесь,а я нет,пока не выходит(
@harrys_potter для перехода я хал не использовал. Он там как вспомогательное.
@@VladimirMedintsevнекорректно обьясняете,в переменной appjumpaddress будет не то что вы там написали 0x0800C000,а именно адресс Reset H тоесть адресс перехода но основную программу,а по 0x0800C000 хранится адресс указателя стека,тоесть его вершина которая записывается в регистр SP
я не пойму но по вашему методу у меня попадает в hard fault и висит на нем
Хотел чуть поправить в комментарии, но тут столько ошибок, что их разбор займёт больше времени, чем длится видео.
О, круто, чтобы вас сильно не утомлять разбором всех ошибок, давайте пару слов, самую грубую из всех 100500 допущенных назовите, пожалуйста.
@@VladimirMedintsev у вас hal вызывает system init до main, где переназначает vtor. Делая одно и то же в разных местах, вы просто подкладываете бомбу программисту, которому достанется в наследство ваш код.
Понятно....
@@VladimirMedintsev кто-то не знает как хал работает, это понятно. Кстати, у вас nvic остался не сброшенный.
в последные видео нету да
не показывает
А мені подобається нога BOOT0: можна додати ще один процесор та прошивати перший другим (чи другий першим). Зручно якщо воно десь на Марсі :)
А можно сделать так чтобы процессор прошивал себя самостоятельно, а в случае проблемы восстанавливал предыдущую версию прошивки. Сложного в этом ничего нету. И boot0 в этом случае не понадобится. В случае с Марсом выглядит все немного по другому. Там несколько процессоров в виде одинаковых блоков действуют параллельно, и сбойный модуль просто исключается из процесса принятия решения. Т.е. его можно исключать из кластера. Да, это требует определенного подхода к проектированию системы в целом, но в медицине, авиации и космосе это применяется. К примеру в инсулиновых помпах стоит 2 процессора.
Прошивка одним МК из другого особенно актуальная сейчас, в месяцы дефицита и всеобщего подорожания МК.
Если не ошибаюсь то адрес стека не нужно переставлять. он там при старте программы сам устанавливает куда нужно.
Было бы полезно указать способ указать свойство NO RETURN на функцию перехода из бутлоадера в прошивку (чтобы пре переходе стек не заполнялся сразу адресом возврата).
И в дополнение, при использовании библиотеки HAL адрес смещения вектора прерываний указывается в файле system_stm32xxxxx.c (/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
/* #define VECT_TAB_SRAM */
//#define VECT_TAB_OFFSET 0x0 /*!< Vector Table base offset field.
//This value must be a multiple of 0x200. */)
А чем это было бы полезно? Ну пусть будет в стеке. Как только произойдет запуск основной программы у нее свой стек, своя жизнь.
@@VladimirMedintsev Неверно. Вы сначала устанавливаете новый стек, а потом делаете переход, а значит новый стек уже будет использован для хранения адреса возврата.
холопам привет