реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> LPC 2366 проблема в ISP, Не получается перезаписать начальные адреса Flash
jcxz
сообщение Apr 9 2015, 02:26
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(KRS @ Apr 9 2015, 01:41) *
Только вот способ не гарантированный, теоретически NXP может поменять технологию флеша.

Вряд-ли. Так как у самой NXP есть какой-то AN где так и советуют делать.
Go to the top of the page
 
+Quote Post
den_po
сообщение Apr 9 2015, 03:38
Сообщение #47


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(jcxz @ Apr 8 2015, 21:30) *
Писали невыровненные на 16 байт данные.

Нет, точно выровненные
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 9 2015, 05:13
Сообщение #48


Гуру
******

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



А я заставил линкер gcc считать контрольную сумму. Убил двух зайцев - нет описанных выше проблем с дополнительной обработкой прошивки и программа работает после загрузки отладчиком (OpenOCD), который про контрольную сумму векторов ничего не знает и считать не умеет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 9 2015, 09:42
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(den_po @ Apr 9 2015, 09:38) *
Нет, точно выровненные

Возможно в LPC23xx были какие-то проблемы. На LPC1758/68 у меня уже в нескольких проектах ведутся журналы во внутренней флешь таким образом. И никаких проблем.
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 9 2015, 09:48
Сообщение #50


Профессионал
*****

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



Цитата(Сергей Борщ @ Apr 9 2015, 08:13) *
А я заставил линкер gcc считать контрольную сумму.

А у Вас названия обработчиков прерываний фиксированные?
Или в скрипте линкера всетаки как то можно получить доступ к данным по определенному адресу...
Go to the top of the page
 
+Quote Post
lavrik
сообщение Apr 9 2015, 10:35
Сообщение #51


Участник
*

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



Цитата(Golikov A. @ Apr 8 2015, 12:37) *
В вашей прошивке в начале лежит таблица прерываний, в 0x14 - это 5 ячейка если ее мерить 32 битными словами, должна лежать контрольная сумма этой таблицы, такая что сумма по всей таблице должна давать 0.

То есть после того как вы получили файл прошивки, с ним выполняете указанные действия считаете сумму всей таблицы кроме 5 ячейки. И отрицательное значение записываете в 5 ячейку, таким образом сумма по всей таблице станет 0. После этого такую поправленную прошивку пихаете во флэш и все будет!


То есть в это место записать контрольную сумму?

Прикрепленное изображение


Как получить отрицательное значение? Просто инвертировать?

По поводу сколько копировать можно из ОЗУ во Флэш: в даташите разрешены следующие размеры данных
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 9 2015, 10:49
Сообщение #52


Профессионал
*****

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



Цитата(lavrik @ Apr 9 2015, 13:35) *
То есть в это место записать контрольную сумму?

там выделено больше 4 байт.
Надо писать слово по адресу 0x14

Цитата(lavrik @ Apr 9 2015, 13:35) *
Как получить отрицательное значение? Просто инвертировать?

Инвертировать и прибавить 1

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 9 2015, 11:02
Сообщение #53


Гуру
******

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



Цитата(KRS @ Apr 9 2015, 11:48) *
А у Вас названия обработчиков прерываний фиксированные?
Сейчас посмотрел - это я на Cortex имени LPC считал линкером. И там названия обработчиков да, фиксированные. А на ARM7 вообще не вижу проблемы - там области векторов всегда лежит один и тот же кусок кода, его контрольная сумма - константа, которую можно посчитать вручную и прибить в соответствующее место гвоздями.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
lavrik
сообщение Apr 9 2015, 11:09
Сообщение #54


Участник
*

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



Цитата(KRS @ Apr 9 2015, 13:49) *
там выделено больше 4 байт.
Надо писать слово по адресу 0x14


Инвертировать и прибавить 1



точно, случайно выделил 8 байт

В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 9 2015, 11:19
Сообщение #55


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
lavrik
сообщение Apr 9 2015, 11:37
Сообщение #56


Участник
*

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



Цитата(Сергей Борщ @ Apr 9 2015, 14:19) *
"Машина должна работать, а человек - думать" (принцип IBM). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается.


Это понятно, что надо автоматизировать это все. Просто хочется сначала понять как это все работает на корню, а потому уже можно и автоматизировать sm.gif

UPD: А обязательно вся прошивка должна писаться за один заход в ISP?

Сообщение отредактировал IgorKossak - Apr 9 2015, 16:48
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
lavrik
сообщение Apr 9 2015, 12:52
Сообщение #57


Участник
*

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



Появился сдвиг! Я сделал следующее: прошил через Keil и JTAG проект, из которого был взят HEX и затем посмотрел содержимое памяти по адресу 0x14. Было обнаружено следующее:
Прикрепленное изображение


506E20B9

Когда я эту сумму записал в свою тестовую прошивку - все заработало как следует. Значит, рассчитанная мной в предыдущих постах чек-сумма (834CE088) была посчитана по неправильному алгоритму. Вопрос: как считать правильно?
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 9 2015, 13:20
Сообщение #58


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Так как написано в User Manual:

"…Criterion for valid user code: The reserved ARM interrupt vector location (0x0000 0014) should contain the 2’s complement of
the check-sum of the remaining interrupt vectors. This causes the checksum of all of the vectors together to be 0."


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 9 2015, 13:42
Сообщение #59


Профессионал
*****

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



Цитата(lavrik @ Apr 9 2015, 14:09) *
В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088?

Нет! все совсем не верно!!

-(0xE59FF018*6+0xE51FF120) = 0xB9206E50
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 9 2015, 16:09
Сообщение #60


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



надо сложить не 5 значений!
а всю таблицу векторов, то есть 8 значений (c 0 gj 7), но пропустить 5 слово.
а потом инвертировать....

Вам надо сделать так, чтобы сумма первых 8 чисел (32 битных чисел) в итоге давала 0. Вот и рассчитайте какое там должно стоять число чтобы после суммирования стало 0.

очевидно что это сумма всех кроме 5 числа, взятая со знаком минус, суммирование без знаковое. Ну и надо не забывать что данные в памяти лежат в формате LittleEnadian то есть с младшего конца
то есть если в памяти лежит 0x11 0x22 0x33 0x44, то это число 0x44332211
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 14:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01522 секунд с 7
ELECTRONIX ©2004-2016