|
|
  |
STM32 bootloader, написание собственного бута |
|
|
|
Feb 25 2015, 17:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(ViKo @ Feb 25 2015, 21:00)  Дохожу в загрузчике до JumpAppl() и улетаю незнамо куда, в 0xBFFFXXXX. Надо смотреть куда линкер таблицу векторов засунул, похоже она осталась на прежнем месте. Возможно что сегмент кода и сегмент под таблицу векторов настраиваются отдельно.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Feb 25 2015, 18:29
|

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

|
Цитата(SSerge @ Feb 25 2015, 20:29)  Надо смотреть куда линкер таблицу векторов засунул, похоже она осталась на прежнем месте. Я ее (их обеих) вижу в окнах Memory в отладчике. Все, как надо: адрес стека, адрес по сбросу... Цитата(Сергей Борщ @ Feb 25 2015, 20:58)  Вот прямо в дизассемблере так и написано JumpAppl()? У меня там обычно что-то вроде BL R0 и чуть выше можно увидеть, откуда в R0 вдруг оказался неправильный адрес перехода. У меня тоже, естественно. BL R1. И адрес в нем правильный, из таблицы, что находится по адресу 0x08004004. А дальше - то, что описал. Здесь вот какая штука - в основной программе использую Keil RTX RTOS. Может, она и меняет что-то, например, VTOR. Надо посмотреть в несдвинутом проекте.
|
|
|
|
|
Mar 2 2015, 19:43
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 24 2015, 16:58)  Судя по рисунку, STM32F20X может выполнять программу из внешней памяти. А также и из внутренней OTP Flash, наверное. ... То есть, можно команды выбирать откуда хочешь!?  Должен выполнять, но возможно нужно настроить MPU предварительно. По-крайней мере для LPC1788 в UM указано: Default memory space permissions for the Cortex-M3 do not allow program execution from the address range that includes the dynamic memory chip selects. These permissions can be changed by programming the MPUВ реальности если запустить код в SDRAM, то при шагании JTAG видно, что несколько команд (с десяток) код выполняется нормально, но на некоторой команде вдруг улетает в Memory Management Fault (MMFSR.IACCVIOL = 1). Я только что прописал конфигурирование MPU и после этого всё заработало - теперь программа нормально выполняется из SDRAM (LPC1788).
|
|
|
|
|
Mar 9 2015, 10:10
|

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

|
Хочу спросить... Что-то не могу после прошивки новой программы перескочить в основную. Если после сброса, и таймер отсчитал 2 с - переходит нормально. За эти 2 с я должен нажать кнопку на панели, тогда дается таймер в 16 с для приема кода прошивки. Так вот, если кода не пришло, тоже не могу перейти в основную программу. Как будто, что-то переинициализировать нужно.
Добавлю информации. После записи во флэш проверяю, что есть новый адрес для стека (т.е., что прошивка записана, и есть куда идти). Этот момент сигнализирую вспышкой светодиода. Дальше перехожу в основную программу. Сразу после программирования диод не пыхает, т.е., не обнаруживается зашитая прошивка. После сброса - нормально проходит, после 2 с ожидания в загрузчике. Если нажму кнопку в это время, после 16 с светодиод тоже пыхает, но перехода нет. Чудо. Запросы от USART стираю. Больше никакими прерываниями не пользуюсь. P.S. Я, собственно, прерываниями от USART не пользуюсь. Проверяю состояние. Постирал pending биты запросов. Еще забыл про таймер. От него тоже стер. Всё то же.
|
|
|
|
|
Mar 19 2015, 13:24
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 160

|
Есть проблема со входом в бутлоадер STM32L051 (cortex m0+) из тела программы, микроконтроллер сбрасывается. Тот же код только с другими адресами прекрасно работает на STM32L151 и STM32L401 (cortex m3/m4). Подскажите в чем может быть проблема? CODE
void (*SysMemBootJump)(void);
SysMemBootJump = (void (*)(void)) (*((unsigned int*) 0x1FF00004));
__disable_irq(); SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0;
__set_MSP(0x20001000); SysMemBootJump();
Сообщение отредактировал veteq - Mar 19 2015, 13:25
|
|
|
|
|
Mar 23 2015, 11:29
|

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

|
Цитата(ViKo @ Mar 13 2015, 16:47)  Теперь задача - зашифровать-расшифровать прошивку. Попробовал XTEA. Пока только закодировал.  Не знаю, сколько времени будет декодироваться в микроконтроллере. Есть одно замечание. Поскольку кодируются блоки из двух слов, то и перемешивание битов идет в пределах этих двух слов. Дальше все начинается сначала. То есть, одинаковые последовательности слов в начале двоичного файла прошивки (пустые обработчики прерываний) после кодирования тоже будут выглядеть одинаково. Что наталкивает взломщика на принцип кодирования. Сделал и декодирование, все по https://ru.wikipedia.org/wiki/XTEA#cite_note-report-1Декодируется быстро, практически, мгновенно. Фактически, имеется 4 32-битовых ключа, и количество итераций тоже можно выбрать на свой вкус.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|