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

Несколько вопросов по lpc176x

Ну по этой причине я и начал продолжать тему в виде "вопросника" с простыми наводящими вопросами.

 

Жаль только "виновник торжества" как всегда игнорирует всех и вся...

 

Upd: Получил от него сообщение в личку, он просил передать, что его забанили (Read Only).

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


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

Жаль только "виновник торжества"....

На "виновника" все посты последних дней особо уже и не рассчитывалась. Теперь беседу про Cortex-M3 можно некоторое время продолжать и в конструктивном русле. Штука ведь явно mainstream на сегодняшний день.

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


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

Штука ведь явно mainstream на сегодняшний день.

Это точно.

 

Жду свою starterkit'овскую SK-MLPC1768 чтобы приступить к освоению. А пока "чукча читатель" :) И впитыватель полезного :)

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


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

Жду свою starterkit'овскую SK-MLPC1768 чтобы приступить к освоению. А пока "чукча читатель" :) И впитыватель полезного :)

Работаю сейчас с Сortex-M3 от Luminary/TI. Первый из Corteх был STM32. Из Cortex-M0 через дней десять заберу в Питере железку на LPC1114.

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


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

Насчет LPC11xx думал-думал брать или нет.

Думал на замену ATmega в изделия запланировать, но что-то насчет объемов памяти не очень как-то, линейка до 32кБ всего. А нужно менять ATmega128...которые сейчас уже дороже LPC1114.

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


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

Насчет LPC11xx думал-думал брать или нет.

Нормальные малыши, главное для меня 2 SPI. Хороший мелкий периферийный контроллер. LPC17xx уже не интересны - в текущих просто менять массовые LPC2138/48 не особо смысл имеет. А замены чего либо класса LPC23xx/24xx вообще пока ничего нет.

менять ATmega128...которые сейчас уже дороже LPC1114.

Ну 128 настолько дороги, что менять их можно хоть LPC13XX, LPC17XX, LPC21XX, LPC23XX.....

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


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

Ну 128 настолько дороги, что менять их можно хоть LPC13XX, LPC17XX, LPC21XX, LPC23XX.....

Пока прикидываю LPC17xx ставить на замену. Жду железку...

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


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

vallav попросил тут, меня терроризирует :)

Надеюсь Вы прочли, что меня забанили на месяц.

Если прочтете это, то опубликуйте в той ветке, где вопрос задали.

Ответы:

1) Регистр MEMMAP вы ни разу не упомянули. Эксперименты с учетом него проводили? Вообще про него в "LPC17xx User Manual" читали? И про сопутствующие вещи?

А зачем он мне нужен? Мельком в UM на него глянул. Что им делается такого, что может понадобиться в проге?

Затем, что, по-моему, вы плохо понимаете как происходит старт штатного загрузчика.

2) Вы листали документ "ARMv7-M Architecture Reference Manual"? Он хотя бы у вас имеется, в дополнение к "LPC17xx User Manual"?

Не, нету. Но есть DDI0337G_cortex_m3_r2p0_trm.pdf

Вообще я говорил о названии документа (пишется на первой странице), а не о названии файла. :). У вас "Cortex-M3 Technical Reference Manual". Наверное и этого достаточно. Самое главное - вы достаточно хорошо пробежались по нему, регулярно тудя заглядываете?

3) У вас есть JTAG-эмулятор? Потому как Keil вряд ли будет вам иммитировать запуск штатного загрузчика...

Нету. Но JTAG тоже не может отследить запуск загрузчика, так как после сброса отключен и именно бутлоадер решает - включать

JTAG или не включать.

Bootloader включает JTAG первым делом (есесно после проверки на отсутствие CRP1/2/3).

Далее вот вам забавная приписка из мануала на LPC17xx (стр.15):

Following a hardware reset, the Boot ROM is temporarily mapped to address 0. This is

normally transparent to the user. However, if execution is halted immediately after reset by

a debugger, it should correct the mapping for the user.

4) Пробовали, скажем, делать дамп памяти при MEMMAP.MAP=0 и при MEMMAP.MAP=1?

Не, не пробовал.

Ну и пес с ним, с этим дампом :)

JTAG-ом все же обзаведитесь. Сейчас это не дорого :). Пригодится.

 

 

Теперь к Вам несколько вопросов.

Можно выделить три характерные точки после сброса - вход в бутлоадер, выход из бутлоадера, вход в main.

Уточняйте, о каком бутлоадере идет речь - о штатном или о вторичном (USB)?

Скорее две - выход из бутлоадера есть одновременно переход на пользовательскую программу. Не пишите main - хотя я понял, что вы имели ввиду пользовательскую программу (например ваш blink-led), такая функция есть и у вторичного бутлоадера.

Чему равны sp и ip в точке входа в бутлоадер, как и откуда они взялись?

Смотря о каком бутлоадере вы говорите.

1) После снятия сигнала RESET в соответсвии с моделью обработки исключений, заложенной в архитектуре Cortex-M3, ЦПУ считывает с адреса 0х00 константу и помещает ее в main_SP, затем считывает константу с адреса 0x04 и помещает ее в IP, что является просто безусловным переходм по адресу. Однако за счет внешнего ремапа, управляемого регистром MEMMAP, который после RESET-а содержит 1 (Boot Mode), первые 256 байт адресного пространства, начиная с 0х0, переотображаются на область BOOTROM. Поэтому ЦПУ, считывая первые два слова с адреса 0х0, на самом деле считывает слова с адреса 0х1FFF 0000.

2) Для проверки наличия пользовательского ПО (в данном случае это будет вторичный USB-бутлоадер) штатный бутлоадер устанавливает MEMMAP в 0 (User Mode) и проверяет вычисляет сумму первых 8 слов начиная с адреса 0х0 (если оставить MEMMAP в 1, то бутлоадер будет считывать слова с адреса 0х1FFF 0000).

The reserved Cortex-M3 exception vector location 7 (offset 0x 001C in the vector table) should contain the 2’s complement of the check-sum of table entries 0 through 6. This causes the checksum of the first 8 table entries to be 0.

3) Запуск вторичного бутлоадера - как уже говорилось много постов выше, наиболее логичный способ такой:

- считать с адреса 0х00 константу (по логике вещей там должно лежать значение SP для пользовательской программы) в main_SP (программно - командой LDR);

- считать с адреса 0х04 константу (по логике вещей там должен лежать адрес начала пользовательской программы) в IP (тоже программно - честно говоря не знаю, это LDR в PC или сначала LDR в РОН а потом установить младший бит и BX через этот РОН :)).

Чтобы быть абсолютно в этом уверенным, необходимо раздобыть исходник первичного бутлоадера.

Чему равны sp и ip в точке выхода из бутлоадера, как и откуда они взялись?

Не понял вопроса :). Особенно про IP...

Чему равны sp и ip в точке входа в main, как и откуда они взялись?

Вопрос именно о входе в main, или о входе в пользовательскую программу? В общем случае до main еще выполняется _main - инициализация глобальных и локальных статических переменных нулем/инициализаторами... :)

Честно скажу - не знаю где и как инициалицируется SP перед переходом на пользовательськую программу. Заметьте, что это ни в коей мере не "допиливание ЦПУ инженерами NXP" и архитектуре COrtex-M3 никак не противоречит. Смотрите исходники. Найдите JTAG и запустите вторичный бутлоадер под ним. Флаг в руки :)

Насчет значения IP - посмотрите исходники вторичного бутлоадера:

1) в функции main() (memory.c) есть вызов ф-ции execute_user_code() (sbl_iap.c)

void execute_user_code(void)
{
    void (*user_code_entry)(void);
    
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_START);

      user_code_entry = (void (*)(void))((USER_FLASH_START)+1);
    user_code_entry();
}

Дабы вы не потерялись, вот еще скопипастил из заголовочных файлов:

/* из sbl_config.h*/
#define USER_FLASH_START (sector_start_map[USER_START_SECTOR])

/* в конечном счете вместо USER_FLASH_START получиться вот это: */
#define SECTOR_2_START      0x00002000

Итого:

1) SP и IP инициализируются аппаратно после сброса процессора - старт штатного загрузчика.

2) В дальнейшем SP изменяется программно, IP тоже (команды перехода)

3) Естественно за исключением случаев обработки прерываний или иных (аварийных) исключений - там тоже все аппаратно (надеюсь тут сомнения вас не гложут :))

Что касается остального - каюсь, на все вопросы ответить не смогу. Покопайтесь в исходниках, поразбирайтесь.

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


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

1) SP и IP инициализируются аппаратно после сброса процессора - старт штатного загрузчика.

Цитирую мануал:

P2[10]/EINT0/NMI 53[6] I/O P2[10] — General purpose digital input/output pin.

Note: LOW on this pin while RESET is LOW forces on-chip bootloader to take

over control of the part after a reset.

Т.е. загрузчик - это если указанную ножку держать в нуле при сбросе. Без этого - обычный старт - startup, main...

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


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

Во-первых пардон - я там выше кажется перепутал значение бита в MEMMAP - 0 это BootMode (по сбросу), а 1 - это UserMode

ViKo, тоже процитирую мануал:

1) Following a hardware reset, the Boot ROM is temporarily mapped to address 0. - стр.15

2) The flash boot loader code is executed every time the part is powered on or reset. The loader can execute the ISP command handler or the user application code.

A LOW level after reset at pin P2.10 is considered an external hardware request to start the ISP command handler. - стр.612 (3.Description)

3) См. Boot Process Flowсhart (стр.616)

Цитирую мануал:

Т.е. загрузчик - это если указанную ножку держать в нуле при сбросе. Без этого - обычный старт - startup, main...

Из доки выходит, что если указанная ножка в нуле - загрузчик может перейти в к выполнению ISP, разумеется с учетом дополнительных условий - наличие/отсутсвие User Code (точнее соответсвия Criterion for Valid User Code) и наличие specific pattern in flash location at 0x000002FC (CRP1/CRP2/CRP3) :)

Другое дело, что, как я понял, в случае рассматриваемого вторичного USB-бутлоадера при его прошивке устанавливается CRP3 - чип становиться "нечувствительным" к состоянию Р2.10 :)

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


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

Наш Ленин в ссылке передал мне привет :)

Что же Вы сразу не сказали, что у Вас были не вопросы, на которые Вас интересует ответ, а экзаменационные вопросы ко мне.

Я бы не пыхтел на них отвечать, тем более в лычку.

А Ваше - после реset_а производится аппаратная загрузка sp значением с адреса 0x1fff0000 и ip с адреса 0x1fff0004 - сильно...

Хотя правильно написали - все последующие загрузки sp и ip - программные...

Долго думали? И главное, зачем это делать - если проще сбросить ip на заранее заданное значение а в ПЗУ по этому адресу занести

нужный код? Очень хочется строчкам из UM придать хоть какой то смысл?

Этот ответ можете ( и желательно ) не публиковать на форуме.

Особенно фраза про поиск смысла в строчках UserManual-а - :lol:

 

 

Извините - вы говорили, что это желательно на форуме не публиковать, но я посчитал нужным еще раз показать всем ваше неумение вести разговор нормально.

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


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

Student Pupkin, оставьте цитирование слов vallav. Он получил наказание заслуженно. Пусть подумает и сделает выводы (что вряд ли, но надежда есть). Или Вам заняться нечем?

Смотрите...и Вас прикроют за пособничество :)

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


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

Цитирую мануал:

Не правильное токование :(. Загрузчик у LPC запускается всегда - занимается разборками с защитой, и считыванием той самой ножки.

Это все софтовые действия. Процесс запуска этого загрузчика ядром Corteх ничем не отличается от запуска любого другого кода, в том числе и в контроллерах не имеющих загрузчиков.

 

Наш Ленин...

Admin:

Заканчиваем с приветами. У него "до осени" самостоятельная работа над ошибками.

но я посчитал нужным еще раз показать всем ваше неумение вести разговор нормально.

Вот если считаете, что для Вас это "все нормально", то можете продолжать с ним личную переписку.

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


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

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

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


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

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

Да, именно так.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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