Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Простейший код для ARM LPC2148 не работает
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Alexandr
Попала ко мне в руки учебная плата с процессором 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");
  }

}
Andy Mozzhevilov
Смотрите, правильно ли определены области RAM, Flash в проекте, как стек инициализируется.
Чем заливаете Flash? Пишется ли контрольная сумма векторов прерываний?
asm "nop" - кстати абсолютно лишнее.
Alexandr
Цитата(Andy Mozzhevilov @ Jun 18 2008, 08:56) *
Смотрите, правильно ли определены области RAM, Flash в проекте, как стек инициализируется.
Чем заливаете Flash? Пишется ли контрольная сумма векторов прерываний?
asm "nop" - кстати абсолютно лишнее.


А где это посмотреть можно? Я только начал работу с IAR. Код программы приведен в первом посте. Значит все области стоят по умолчанию в настройках компилятора?

Флэшка программируется через RS232 с помощью штатного кабеля платы.

Про контрольную сумму векторов прерываний ничего не знаю. Где посмотреть?

Вроде программа то всего 5 строк, а код получился размером в 993 байта. Значит компилятор добавил нечто свое.
А еще мне тут подумалось - а не может сидеть в памяти процессора какой-нибудь хитрый загрузчик, воспринимающий только определенный код программы? Хотя я вроде всю память стирал. В общем тяжко идет освоение.
zltigo
Цитата(Alexandr @ Jun 21 2008, 00:15) *
Флэшка программируется через RS232 с помощью штатного кабеля платы.

Штатность кабеля не имет значения,а вот софт для заливки может и не править ту самую:
Цитата
Про контрольную сумму векторов прерываний ничего не знаю. Где посмотреть?

Про сумму смотреть в документации - целый раздел посвященный загрузке. Книжку для обзора (только бога ради не Редькина - тут уже предлагали сжечь его на костре из его книг, и не могу назвать такое предложение чрезмерно жестоким). Возъмите Тревор Мартин LPC2000.... Есть у него и конкретно по LPC23/24, но возможно ее нет на русском. Посмотрите на форуме AT200 программатор - он точно smile.gif умеет править контрольную сумму при загрузке.
Alexandr
Разбираюсь по маленьку. Уже правильно настроил в компоновщике XLINK области флэш и RAM, размеры скеков в RAM. А вот как заставить IAR генерить контрольную сумму векторов так и не разобрался. Код по прежнему не работает. Думаю из-за этого. Можно конечно попробовать ее ручную посчитать и hex файл поправить, но я уверен что IAR это умеет.
Как заставить IAR писать контрольную сумму векторов?
zltigo
Цитата(Alexandr @ Jun 23 2008, 22:27) *
Как заставить IAR писать контрольную сумму векторов?

4.x не умеет. 5.x - умеет. По каким причинам Вы пытаетесь "старый" EWARM использовать?
GetSmart
Я дак просто свой startup.s79 с уже просчитанной контрольной суммой подключаю к проекту и никаких проблем. Хоть на IAR 4.xx, хоть на новом.
Alexandr
Все, я ее победил. Внял совету zltigo и откомпилировал в 5-ом IAR-е. И все заработало. Спасибо всем кто откликнулся. Но не думайте, что тему можно закрывать. Изучение продолжается.
GetSmart, а Вам не составит труда прикрепить сюда Ваш startup.s79?
GetSmart
Только это startup в самой минимальной конфигурации. В нём есть только переход на вектор IRQи контрольная сумма. Никакие другие исключения не отрабатываются. Но как ни странно, я этот startup использую в 90% своих программ.
zltigo
Цитата(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) *
Никакие другие исключения не отрабатываются.

Зря.
GetSmart
Цитата(zltigo)
Это не startup, это совершенно не пригодный к использованию для чего-либо огрызок startup. Даже "таинственное число" использовать нельзя, поскольку ?cstartup находится неведомо где.
Не пригодный вместе пишется smile.gif Кто тут боролся недавно за правописание?!

Не имеет значения где находится ?cstartup. Его адрес всё равно ляжет за границу 0x20, а команда ldr pc,=?cstartup всегда будет ldr pc,[pc,#+24]. Контрольная сумма считается по адресам от 0 до 0x1f.
aaarrr
Цитата(GetSmart @ Jun 25 2008, 10:31) *
Не имеет значения где находится ?cstartup. Его адрес всё равно ляжет за границу 0x20, а команда ldr pc,=?cstartup всегда будет ldr pc,[pc,#+24].

Это Вы зря. Теоретически ассемблер может спокойно впихнуть туда (на 0x20) нужные ему константы. Понятно, что в данном конкретном случае этого, скорее всего, никогда не будет, но писать все равно надо правильно. Добавьте в вектора переход на обработчик Abort вида ldr pc, =Abort и такой код благополучно пойдет лесом.
zltigo
Цитата(GetSmart @ Jun 25 2008, 08:31) *
Не пригодный вместе пишется smile.gif Кто тут боролся недавно за правописание?!

Что поделаешь, русский не совсем мой родной язык, бывает sad.gif и хуже, но не специально и не в совсем уже диких количествах.
Цитата
Не имеет значения где находится ?cstartup. Его адрес всё равно ляжет за границу 0x20

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

Цитата(zltigo)
Ляжет ЗА и необязательно НА, и контрольная сумма пойдет лесом. Понятно?
Нет. Хотите поговорить об этом? smile.gif
aaarrr
Цитата(GetSmart @ Jun 25 2008, 10:57) *
Но так делать строго не рекомендуется smile.gif

Строго не рекомендуется делать так, как сделано у Вас - заниматься предсказанием смещений.
GetSmart
Где там предсказание смещений? Если кто-то не знаком с командой LTORG, то это не мои проблемы. В исходнике чётко указано куда ложить ссылки. Не менее чётко, чем у zltigo, только у меня это сделано не так "топорно".
aaarrr
Цитата(GetSmart @ Jun 25 2008, 11:09) *
Где там предсказание смещений? Если кто-то не знаком с командой LTORG, то это не мои проблемы.

Ваша проблема в том, что literal pool - это внутреннее дело ассемблера. И расчет на то, что константа с адресом cstartup окажется по адресу 0x20 это и есть гадание.
zltigo
Цитата(GetSmart @ Jun 25 2008, 09:09) *
Если кто-то не знаком с командой LTORG....

Ну и причем тут отсылки в LTORG
У Вас модуль кончился. Совем кончился:
Цитата
ENDMOD
END

И куда будет прилинкован модуль в котором содержится ?cstartup - уже Ваши предположения. Кроме того,он вообще отсутстует в прведенном исходнике и уже попытавшемуся использовать этот исходник придется точно гадать.
Цитата
В исходнике чётко указано куда ложить ссылки.

"класть"

Цитата(GetSmart @ Jun 25 2008, 09:09) *
..только у меня это сделано не так "топорно".

Под "не так топорно" подразумевается наличие массы ненужных ORG? smile.gif и отсутствие обработчиков exception?
Alexandr
ПЫтаюсь стартовый код под IAR написать. Идея вроде проста и понятна. Однако ругается IAR и не хочет компилить файл. Посмотрите пожалуйста код. Что исправить чтоб IAR его принял наконец.
Код
ORG    0x00
Vectors:    LDR     PC, Reset_Addr        
                LDR     PC, Undef_AddrPUBLICPUBLIC
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            //* Reserved Vector */
                LDR     PC, pc,[pc,#-0xFF0]
                LDR     PC, FIQ_Addr
                
ORG    0x20
Reset_Addr:     DD   Reset_Handler
Undef_Addr:     DD   Undef_Handler
SWI_Addr:       DD   SWI_Handler
PAbt_Addr:      DD   PAbt_Handler
DAbt_Addr:      DD   DAbt_Handler
                       DD   0                      //* Reserved Address */
IRQ_Addr:       DD   0
FIQ_Addr:        DD   FIQ_Handler

Undef_Handler:  B       Undef_Handler
SWI_Handler:     B       SWI_Handler
PAbt_Handler:    B       PAbt_Handler
DAbt_Handler:    B       DAbt_Handler
IRQ_Handler:     B       IRQ_Handler
FIQ_Handler:      B       FIQ_Handler


// Reset Handler

Reset_Handler:  

// Enter the C code
                LDR     R0, =main
                BX      R0
Сергей Борщ
Цитата(Alexandr @ Jul 3 2008, 23:16) *
Однако ругается IAR и не хочет компилить файл.
Телепатия - не самый развитый талант у участников этого форума. Как ругается? Какая версия IAR?
Телепатически: в начале нет директив RSEG <сегмент>, CODE32. В конце - директивы END. Директива ORG расположена на первой позиции в строке, а эта позиция зарезервирована для меток.
Alexandr
Я кажется схожу с ума. Откомпилировал код в 4-ом IAR-е. Так там он откомпилировался без единой ошибки. А в 5-ом непрерывно ругался на ORG, да в общем и на половину команд. Чудеса.
zltigo
Цитата(Alexandr @ Jul 8 2008, 12:46) *
Чудеса.

Для начала надо было выяснить, что ASM-ы этих версий отличаются. В V5 org просто нет. По миграции 4->5 IAR-ом рожден специальный документ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.