|
|
  |
LPC 2366 проблема в ISP, Не получается перезаписать начальные адреса Flash |
|
|
|
Apr 9 2015, 03:38
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(jcxz @ Apr 8 2015, 21:30)  Писали невыровненные на 16 байт данные. Нет, точно выровненные
|
|
|
|
|
Apr 9 2015, 10:35
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635

|
Цитата(Golikov A. @ Apr 8 2015, 12:37)  В вашей прошивке в начале лежит таблица прерываний, в 0x14 - это 5 ячейка если ее мерить 32 битными словами, должна лежать контрольная сумма этой таблицы, такая что сумма по всей таблице должна давать 0.
То есть после того как вы получили файл прошивки, с ним выполняете указанные действия считаете сумму всей таблицы кроме 5 ячейки. И отрицательное значение записываете в 5 ячейку, таким образом сумма по всей таблице станет 0. После этого такую поправленную прошивку пихаете во флэш и все будет! То есть в это место записать контрольную сумму?
Как получить отрицательное значение? Просто инвертировать? По поводу сколько копировать можно из ОЗУ во Флэш: в даташите разрешены следующие размеры данных
|
|
|
|
|
Apr 9 2015, 10:49
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(lavrik @ Apr 9 2015, 13:35)  То есть в это место записать контрольную сумму? там выделено больше 4 байт. Надо писать слово по адресу 0x14 Цитата(lavrik @ Apr 9 2015, 13:35)  Как получить отрицательное значение? Просто инвертировать? Инвертировать и прибавить 1
|
|
|
|
|
Apr 9 2015, 11:09
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635

|
Цитата(KRS @ Apr 9 2015, 13:49)  там выделено больше 4 байт. Надо писать слово по адресу 0x14
Инвертировать и прибавить 1 точно, случайно выделил 8 байт В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088?
|
|
|
|
|
Apr 9 2015, 11:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Сергей Борщ @ Apr 9 2015, 13:02)  контрольная сумма - константа, которую можно посчитать вручную и прибить в соответствующее место гвоздями. Как раз сегодня решаю такую задачу. Вот что получилось: Код .section .vectors,"ax" .global _start .code 32 _start: LDR PC, reset_addr // Reset LDR PC, undef_addr // Undefined instruction LDR PC, swi_addr // Software interrupt LDR PC, pabort_addr // Prefetch abort LDR PC, dabort_addr // Data abort .word 0 - (5 * 0xE59FF018 + 0xE51FFFF0 + 0xE59FF010) LDR PC, [PC, #-0xFF0] // Read vector address from VIC LDR PC, fiq_addr // FIQ interrupt reset_addr: .word reset_handler undef_addr: .word undef_handler swi_addr: .word swi_handler pabort_addr: .word prefetch_abort_handler dabort_addr: .word data_abort_handler fiq_addr: .word fiq_handler .ltorg Добавлено: Цитата(lavrik @ Apr 9 2015, 13:09)  В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088? "Машина должна работать, а человек - думать" (принцип IBM). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 9 2015, 11:37
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635

|
Цитата(Сергей Борщ @ Apr 9 2015, 14:19)  "Машина должна работать, а человек - думать" (принцип IBM). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается. Это понятно, что надо автоматизировать это все. Просто хочется сначала понять как это все работает на корню, а потому уже можно и автоматизировать  UPD: А обязательно вся прошивка должна писаться за один заход в ISP?
Сообщение отредактировал IgorKossak - Apr 9 2015, 16:48
Причина редактирования: избыточное цитирование
|
|
|
|
|
Apr 9 2015, 12:52
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-01-15
Пользователь №: 84 635

|
Появился сдвиг! Я сделал следующее: прошил через Keil и JTAG проект, из которого был взят HEX и затем посмотрел содержимое памяти по адресу 0x14. Было обнаружено следующее:
506E20B9 Когда я эту сумму записал в свою тестовую прошивку - все заработало как следует. Значит, рассчитанная мной в предыдущих постах чек-сумма (834CE088) была посчитана по неправильному алгоритму. Вопрос: как считать правильно?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|