|
Простейший код для ARM LPC2148 не работает, Помогите советом |
|
|
|
Jun 17 2008, 20:02
|

Знающий
   
Группа: Модераторы
Сообщений: 804
Регистрация: 1-12-04
Пользователь №: 1 283

|
Попала ко мне в руки учебная плата с процессором LPC2148 - плата EA-EDU-001, разработанная конторой Embedded Artists. Посмотреть и скачать описание можно тут http://www.megachip.ru/item.php?item_id=670612 Хорошая плата, много периферии. Купил книгу Редькина. Изучил. Все вроде понятно. Написал простенькую программу под IAR - должна она была PLL подключить, таймер и прерывание настроить и по прерыванию светодиодами мигать. В симуляторе прогнал - работает. Записал в плату - тишина. Возился, возился - в IAR-овском симуляторе и в NoICE работает, а в железе - нет! Упростил программу до нескольких строк - чтоб только светодиоды загорелись после сброса (схему включения светодиодов прилагаю). И снова тишина. И можно было бы списать на то, что плата дохлая, но записав в нее фирменную программу я наглядно убедился в том, что все светодиоды мигают. Видимо я не понимаю какой-то простой, но важной вещи. Подскажите в чем ошибка. Код #include <iolpc2148.h>
void main(void) { IO0DIR=0x0000FF00; IO0CLR=0x0000FF00;
while (1) { asm ("nop"); }
}
Эскизы прикрепленных изображений
--------------------
Иван Сусанин - первый полупроводник
|
|
|
|
|
Jun 20 2008, 22:15
|

Знающий
   
Группа: Модераторы
Сообщений: 804
Регистрация: 1-12-04
Пользователь №: 1 283

|
Цитата(Andy Mozzhevilov @ Jun 18 2008, 08:56)  Смотрите, правильно ли определены области RAM, Flash в проекте, как стек инициализируется. Чем заливаете Flash? Пишется ли контрольная сумма векторов прерываний? asm "nop" - кстати абсолютно лишнее. А где это посмотреть можно? Я только начал работу с IAR. Код программы приведен в первом посте. Значит все области стоят по умолчанию в настройках компилятора? Флэшка программируется через RS232 с помощью штатного кабеля платы. Про контрольную сумму векторов прерываний ничего не знаю. Где посмотреть? Вроде программа то всего 5 строк, а код получился размером в 993 байта. Значит компилятор добавил нечто свое. А еще мне тут подумалось - а не может сидеть в памяти процессора какой-нибудь хитрый загрузчик, воспринимающий только определенный код программы? Хотя я вроде всю память стирал. В общем тяжко идет освоение.
--------------------
Иван Сусанин - первый полупроводник
|
|
|
|
|
Jun 21 2008, 04:45
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Alexandr @ Jun 21 2008, 00:15)  Флэшка программируется через RS232 с помощью штатного кабеля платы. Штатность кабеля не имет значения,а вот софт для заливки может и не править ту самую: Цитата Про контрольную сумму векторов прерываний ничего не знаю. Где посмотреть? Про сумму смотреть в документации - целый раздел посвященный загрузке. Книжку для обзора (только бога ради не Редькина - тут уже предлагали сжечь его на костре из его книг, и не могу назвать такое предложение чрезмерно жестоким). Возъмите Тревор Мартин LPC2000.... Есть у него и конкретно по LPC23/24, но возможно ее нет на русском. Посмотрите на форуме AT200 программатор - он точно  умеет править контрольную сумму при загрузке.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 25 2008, 05:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Jun 25 2008, 05:47)  Только это startup.. Это не startup, это совершенно не пригодный к использованию для чего-либо огрызок startup. Даже "таинственное число" использовать нельзя, поскольку ?cstartup находится неведомо где. Тогда-уж хоть так этот огрызок должен выглядеть Код ;------------------------ ORG 0x00 __program_start: ldr pc,(?vect_entry + 4*0); 0x00 Reset ldr pc,(?vect_entry + 4*1); 0x04 UND ldr pc,(?vect_entry + 4*2); 0x08 SWI ldr pc,(?vect_entry + 4*3); 0x0C P_ABT ldr pc,(?vect_entry + 4*4); 0x10 D_ABT dc32 0xB9205F80 ; 0x14 Summ of other vectors instructions ldr pc,[pc,#-0xFF0] ; 0x18 Jump directly to the address given by the AIC ldr pc,(?vect_entry + 4*7); 0x1C FRQ ;---------------------------------------------------------------------------- ORG 0x20 ; Constant table entries (for ldr pc) will be placed at 0x20 ?vect_entry: dc32 ?cstartup dc32 ... dc32 ... dc32 ... dc32 ... dc32 0 dc32 ... dc32 ... Цитата(GetSmart @ Jun 25 2008, 05:47)  Никакие другие исключения не отрабатываются. Зря.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 25 2008, 06:31
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo) Это не startup, это совершенно не пригодный к использованию для чего-либо огрызок startup. Даже "таинственное число" использовать нельзя, поскольку ?cstartup находится неведомо где. Не пригодный вместе пишется  Кто тут боролся недавно за правописание?! Не имеет значения где находится ?cstartup. Его адрес всё равно ляжет за границу 0x20, а команда ldr pc,=?cstartup всегда будет ldr pc,[pc,#+24]. Контрольная сумма считается по адресам от 0 до 0x1f.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 25 2008, 06:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(GetSmart @ Jun 25 2008, 10:31)  Не имеет значения где находится ?cstartup. Его адрес всё равно ляжет за границу 0x20, а команда ldr pc,=?cstartup всегда будет ldr pc,[pc,#+24]. Это Вы зря. Теоретически ассемблер может спокойно впихнуть туда (на 0x20) нужные ему константы. Понятно, что в данном конкретном случае этого, скорее всего, никогда не будет, но писать все равно надо правильно. Добавьте в вектора переход на обработчик Abort вида ldr pc, =Abort и такой код благополучно пойдет лесом.
|
|
|
|
|
Jun 25 2008, 06:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Jun 25 2008, 08:31)  Не пригодный вместе пишется  Кто тут боролся недавно за правописание?! Что поделаешь, русский не совсем мой родной язык, бывает  и хуже, но не специально и не в совсем уже диких количествах. Цитата Не имеет значения где находится ?cstartup. Его адрес всё равно ляжет за границу 0x20 Ляжет ЗА и необязательно НА, и контрольная сумма пойдет лесом. Понятно?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 25 2008, 06:57
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aaarrr) Добавьте в вектора переход на обработчик Abort вида ldr pc, =Abort и такой код благополучно пойдет лесом. Это ещё почему? Загрузка любой константы через команду ldr pc, =... всегда будет превращаться в ldr pc,[pc,#+..]. И если у меня в файле допустим ровно шесть таких загрузок, то они все лягут после команды LTORG с вполне предсказуемым смещением. Короче, если я заменю все фиктивные ссылки на реальные из других мест (модулей), то по адресам 0..0x1f останется те же самые коды. Проблема будет если один и тот же адрес (вектор) загружать для разных исключений, тогда компилятор объединит эти ссылки и машинные коды изменятся. Но так делать строго не рекомендуется  Цитата(zltigo) Ляжет ЗА и необязательно НА, и контрольная сумма пойдет лесом. Понятно? Нет. Хотите поговорить об этом?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|