Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2103 -> LPC1751
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
toweroff
Добрый вечер!
Хотелось бы узнать, есть ли какие-то принципиальные камни при переходе от ARM7 к CM3
Так-то оно, вроде как, все понятно, но не хотелось бы по первым шагам биться об стену
В принципе, пока интересует базовая схемотехника и стартап

Прошу прощения за введение в заблуждение
Не LPC2000 -> LPC1700, а, конечно, младшие модели, то есть LPC210x->LPC1751,52

Просто предложили по неплохой цене и есть интерес все-таки переползти в это ядро, благо и скорость выше (хотя надо ли оно - другой вопрос), и периферия богаче, да и питание от одного источника

Я понимаю, что только надо начать, а там уже... но
SII
В процессорах M-профиля совершенно по-другому организована работа с прерываниями. Периферия у NXP, как правило, остаётся если не полностью идентичной, то близкой к таковой, за исключением обработки прерываний (в силу уже упомянутых особенностей архитектуры) и адресов регистров.
toweroff
Цитата(SII @ Jul 11 2012, 01:35) *
В процессорах M-профиля совершенно по-другому организована работа с прерываниями. Периферия у NXP, как правило, остаётся если не полностью идентичной, то близкой к таковой, за исключением обработки прерываний (в силу уже упомянутых особенностей архитектуры) и адресов регистров.

спасибо!
mempfis_
Цитата(toweroff @ Jul 10 2012, 21:54) *
Добрый вечер!
Хотелось бы узнать, есть ли какие-то принципиальные камни при переходе от ARM7 к CM3
Так-то оно, вроде как, все понятно, но не хотелось бы по первым шагам биться об стену
В принципе, пока интересует базовая схемотехника и стартап


Как уже упомянули - по разному организована обработка прерываний. Отличные стартапы. Дело в том что для М3 прерывания имеют определённый названия, прописанные в стартапе. И названия обработчиков прерываний должны совпадать с теми что прописаны в стартапе. В LPC2xxx перывания можно было называть как угодно и инсталлировать. При переводе одного проекта на LPC17 брал куски кода с проекта на LPC23. Порадовало что обработчики UARTs были заменены один в один. Только подкорректировал clear pending interrupt. Watchdog тоже не корректировался. Таймеры не помню. Остальная переферия не использовалась поэтому сказать ничего не могу. Кажется NXP позиционировал LPC17 как семейство для перехода с LPC2xxx. Так что во многом код должен быть взаимозаменяем.
toweroff
Цитата(mempfis_ @ Jul 11 2012, 21:45) *
Дело в том что для М3 прерывания имеют определённый названия, прописанные в стартапе. И названия обработчиков прерываний должны совпадать с теми что прописаны в стартапе. В LPC2xxx перывания можно было называть как угодно и инсталлировать. При переводе одного проекта на LPC17 брал куски кода с проекта на LPC23. Порадовало что обработчики UARTs были заменены один в один. Только подкорректировал clear pending interrupt. Watchdog тоже не корректировался. Таймеры не помню. Остальная переферия не использовалась поэтому сказать ничего не могу. Кажется NXP позиционировал LPC17 как семейство для перехода с LPC2xxx. Так что во многом код должен быть взаимозаменяем.

да, уже заметил

Цитата(mempfis_ @ Jul 11 2012, 21:45) *
Кажется NXP позиционировал LPC17 как семейство для перехода с LPC2xxx.

именно так. Если б знал года два назад, не бодался бы с ARM9 )) но - тоже опыт
_Артём_
Цитата(mempfis_ @ Jul 11 2012, 20:45) *
В LPC2xxx перывания можно было называть как угодно и инсталлировать.

Так и у Cortex-ов как хочешь так и называешь. Главное чтобы

Цитата
названия обработчиков прерываний должны совпадать с теми что прописаны в стартапе.

и функция обработчика располагалась на своём месте в таблице векторов.


Цитата(mempfis_ @ Jul 11 2012, 20:45) *
Порадовало что обработчики UARTs были заменены один в один. Только подкорректировал clear pending interrupt. Watchdog тоже не корректировался.

С LPC2xxx не работал, но когда изучал LPC11 часто пользовался книгами LPC2xxx (Тревора или Редькина) - периферия местами очень похожая.
toweroff
Еще вопрос, по железу
Софт - Keil 4.xx
Из отладчиков - ULINK2 и J-LINK ULTRA (оба - китайцы)
LPC17xx поддерживает SWD. Хотелось бы как-то освободиться от здорового IDC разъема и использовать "малопиновый" SWD
Как там все правильно подключить? Первый раз с SWD развожу laughing.gif
Lotor
Цитата(toweroff @ Jul 17 2012, 19:43) *
Как там все правильно подключить? Первый раз с SWD развожу laughing.gif

В таких случаях имхо стандартно гуглится какая-нибудь готовая отладка с интересующим камнем и смотрится ее схема. Или читается документация - ничего сложного нету же. sm.gif
toweroff
Цитата(Lotor @ Jul 17 2012, 21:14) *
ничего сложного нету же. sm.gif

параллельно идет ремонт, голова уже пухнет... вот и мнятся всякие шпатели и ротбандты biggrin.gif
toweroff
Подниму еще раз, теперь вопрос про NVIC, дабы сомнений уж не осталось

Далее все "утверждения" с оговоркой "я так понимаю"

Pending
Выставляется, если во время прерывания, - прервали с более высоким приоритетом... Нужно сбрасывать/проверять при выходе из прерывания?

Перенос векторов в RAM, VTOR
Просто резервируем область в SRAM под таблицу (с размерностью под свой кристалл), копируем свои вектора
Нужно ли как-то еще неиспользуемые вектора модифицировать? Выравнивание к границе 256 байт, правильно?

Вектора с приоритетом "-"
эту часть как копировать, что с ней вообще и где? из бута отдается управление, как это будет полноценно?

В связи с чем вопрос. Во всех примерах пока для меня куча кода, хотя бы просто на пальцах работу NVIC и 90% вопросов просто не возникнет, да и оставшиеся 10 не захочется задавать sm.gif

Спасибо!
_Артём_
Цитата(toweroff @ Aug 3 2012, 21:42) *
Далее все "утверждения" с оговоркой "я так понимаю"

Аналогично: "я так вижу".


Цитата(toweroff @ Aug 3 2012, 21:42) *
Pending
Выставляется, если во время прерывания, - прервали с более высоким приоритетом... Нужно сбрасывать/проверять при выходе из прерывания?

Pending - на ожидании.
Периферия сетит pending и если вектор разрешён - прерывание может произойти.

Цитата(toweroff @ Aug 3 2012, 21:42) *
Нужно сбрасывать/проверять при выходе из прерывания?

Возможно случаи бывают разные, но точно не всегда надо.
И ещё цитата:
Цитата
Note that the pending bit will be automatically cleared by hardware when the
corresponding ISR is entered.

В основном нужно флаги периферийных блоков сбрасывать - источников может быть несколько, а вектор один.
Цитата(toweroff @ Aug 3 2012, 21:42) *
Перенос векторов в RAM, VTOR
Просто резервируем область в SRAM под таблицу (с размерностью под свой кристалл), копируем свои вектора
Нужно ли как-то еще неиспользуемые вектора модифицировать? Выравнивание к границе 256 байт, правильно?

Бывает вроде и 512 байт выравнивание (не помню у кого видел).
И ещё (из UM10360):
Цитата
When setting TBLOFF, you must align the offset to the number of exception entries in the
vector table. The recommended alignment is 256 words, allowing for 128 interrupts.


Цитата(toweroff @ Aug 3 2012, 21:42) *
Вектора с приоритетом "-"
эту часть как копировать, что с ней вообще и где? из бута отдается управление, как это будет полноценно?

А что с приоритетом? Не понял - такие же вектора.
Почти у всех векторов приритет настраивается. Они - никакой не особый случай.
Есть ещё случай - вектора во flash и тогда копировать ничего не надо.
Вектора в рам - это скорей исключение. Зачем их в рам пихать?

Цитата(toweroff @ Aug 3 2012, 21:42) *
эту часть как копировать, что с ней вообще и где? из бута отдается управление, как это будет полноценно?

А что с бутом непонятно? Задавайте вопрос - вместе разберёмся. sm.gif
mempfis_
Цитата(toweroff @ Aug 3 2012, 21:42) *
Перенос векторов в RAM, VTOR


Вопрос - а зачем их переносить в RAM? Если у Вас стоит задача вызвать приложение из загрузчика, то наверняка в приложении вектора прерываний будут расположены во flash и я предполагаю что они также будут выравнены на границу сектора.
Процедура перехода вызова приложения из загрузчика:
Код
typedef void (* func)(void);
void boot_jump(void)
{
  
  
  VTOR = 0x2000; //расположение векторов прерываний в приложении

  register func user_code_entry;
    
  /* Set stack pointer with the first world of the user progrtam
         sp = *((Int32U *) USER_PROGRAM_START);*/
  asm("mov sp,#0x2000");
  asm("ldr sp,[sp,#0]");
    
  user_code_entry = * ((func *)0x2000+1);
  user_code_entry();
}

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.