Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2104 c нуля.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
phantom
Наконец-то я раздобыл, сей чип, и хочу его запустить. Пока в ящике были AT90 и скоростуха не поджимала, все было ОК. Но час Х настал... Ткнулся я было по-старинке и понял, что здорово отстал от жизни. Посему накиньте, кому не влом, мелкий план моих действий. Все что тут было я по-видимому читал, и все что было уже скачал, но толку мало. Вообщем главный вопрос ЧТО ДЕЛАТЬ? glare.gif 1) как практически его запрограммировать (аппаратно), а то там всякие BOOT LOADER-ы и т.д, Как с ними работать? И можно ли обойтись без них - просто тупо записать прогу в ФЛЭШ контроллера как когда-то АТ90?! И как лечилку к Кейлу применить - если она хочет DLL которая есть, но которую она не видит!!! И может Кейл - ну его? 2) Wiegler дружит с Кейлом (2.4) ? Вообщем буду признателен за конкретный краткий план моих действий. Для AVR это могло бы выглядеть так 1) сделать плату с АВР-ом из примера СоdeVision****, 2) сделать програматор СТК200, 3) поставить компилятор COdeVision 3) скомпилировать пример 4) прошить АВР 5) убедится в работоспособности и т.д Буду всем очень признателен, а то время не ждет! help.gif
vet
Плата с выведенным разъёмом JTAG, вигглер, CrossWorks.
aaarrr
Цитата(vet @ Mar 30 2006, 19:48) *
Плата с выведенным разъёмом JTAG, вигглер, CrossWorks.


Или альтернативный вариант: плата с процессором и преобразователем
уровней UART и любая среда по вкусу. Шить можно при помощи встроенного загрузчика.
Использовать JTAG на столь мелком камне совсем не обязательно.
vesago
По большому счету я наверное не имею морального права советовать, так как еще не одного реального девайса на LPC не создал, но все-таки выскажусь. В данный момент я нахожусь в стадии написания фирмвари. Железо будет тольуо к концу апреля. Пока доверяю софтовому отладчику кейла - и алгоритм и работу с железом отлаживаю в нем. Возможности Кейла в этом плане безграничны. Пишу в связке с писишным программером. Кинул кабель со своего компа к его, натравил дебагер на ком порт и спокойно гоняем данные. Программер свою работу делает, я свою. Впрочем я отвлекся от сути. План действий таков:
- Прочти фак вверху форума
- Скачай юзер мануал, описание ядра арм, еррату, даташит, книгу lpc-ARM-book_srn.pdf. Последнюю особенно рекомендую. Мануал есть даже на русском, правда на другой камень, но похожи. Был на сахаре. Если не найдешь - оставь почту - вышлю. В процессе читай.
- Скачай компилятор. Сейчас самый лучьший - Кейл + Реал Вью (MDK300 с www.keil.com).
- Пробуй писать простые прожки, знакомься с примерами. Можно в дебагере убедиться в работе.
- Обзаведись железом и с помощью филипсовского флешера и преобразователя 232 интерфейса заливай фирмварю через бутлодер и пробуй в железе.
- Тусуйся на форумах.
- Если серьезно настроен прикупи МТ-LINK.
phantom
Цитата(vesago @ Mar 31 2006, 10:36) *
- Обзаведись железом и с помощью филипсовского флешера и преобразователя 232 интерфейса заливай фирмварю через бутлодер и пробуй в железе.
- Если серьезно настроен прикупи МТ-LINK.

Тут пожалуйста поконкретнее. Есть у меня самопальное"железо" - LPC и два TI преобразователя напряжения на 3в по самой простой схеме. Что дальше? Чем его шить? "Филипсовский флешер" это что? И кто его поддерживает? Как с Boot-loader-ом обращаться? Он изначально прошит в процессоре или его надо где-то брать и туда записывать? Как происходит процесс записи - записывают сразу в FLASH или сначала в RAM а уже потом в FLASH? Все кто хочет, может писать на momentus@rambler.ru, но я думаю, что лучше открыто, поскольку это будет интересно многим, кто переходит на ARM. Заранее благодарен всем! w00t.gif
vesago
В каждом LPC на заводе прошит бутлодер, чтоб пользователь не напрягался с программатором, а мог подключить TXD, RXD UART0 камня к ком порту компа, запустить программу philips_flash_utility, которая доступна с сайта филипса, указать в ней путь к прошивке, и нажать пуск. Если соответствующим образом к RTS DTR подключены ресет LPC и 0.14 разряд порта, то прога сама все сделает. Если RTS/DTR не заведены, сам садишь 0.14 на землю, жмешь кнопку ресет и после старта проц начинает ожидать команды от проги-флешера. После старта управление передается бутлодеру. Он смотрит если нога 0.14 не седит на земле, значит передает управление основной программе. Короче если все собрано правильно, то LPC сможет прошить и неандарталец. Схема для RTS/DTR если в апликухе или на прошлой странице в посте где обсуждали мою схемку.
phantom
Спасибо! Главное - точка опоры! Щас буду пробовать!!!
evgen2
Привет!

Примерно аналогично.
Использую
mVision3 V3.21
C Compiler CA.Exe V2.40a
Assembler AA.Exe V2.40a

1) Вылезла проблема с выравниванием.
Вот такой код
volatile struct Msg {
long a;
long b;
long c;
long d;
unsigned char Buf[40];
} MsgOut;

*((short int *)&MsgOut.Buf[4+16]) = 0x7ff7;
*((int *) &MsgOut.Buf[4+18]) = 0x87654321;
упорно записывает 0x87654321 по смещению 20.
parma pack() не помогает

2) не могу сообразить, как разрешать-запрешать прерывания. т.е. описалово
VICIntEnable и VICIntClr читаю. Нашел что в доках голины пишут как VICIntClr, так и VICIntClear
Но не доходит, во что это выливается. Вопрос связан с тем, что вылезла неатомарность записи, т.е. если в функции записываю переменную, а в прерывании ей пользуюсь...теряются от 1 до 3 байт, аналогично опасаюсь, что может вылезли если писать в прерывании, а пользоваться в функции. Как с этим бороться - нифига не могу сообразить, ни в доках, ни в книжке "Insider's guide"


спасите-помогите ;-)
evgen2
Цитата(evgen2 @ Apr 1 2006, 16:40) *
1) Вылезла проблема с выравниванием.

сделанное из Hello World
unsigned char Buf[40];
int main (void)
{
........
*((short int *)&Buf[0]) = 0x77ff;
*((int *)&Buf[2]) = 0x12345678;
printf("%x %x %x %x \n", Buf[0],Buf[1],Buf[2],Buf[3]);
}
выводит
78 56 34 12

smile3046.gif

и шоб было праильно - надо извращаться *((_packed int *)&Buf[2]) =

А на первой странице и в ридмях этого написать эти пейсатели не могут - повбывал бы и на кол пересажал twak.gif maniac.gif
aaarrr
Цитата(evgen2 @ Apr 1 2006, 17:40) *
1) Вылезла проблема с выравниванием.

Наверное, в описанном Вами случае стоит использовать union,
а еще лучше - сделать все руками, с выравниванием шутить не стоит.

Цитата(evgen2 @ Apr 1 2006, 17:40) *
2) не могу сообразить, как разрешать-запрешать прерывания.

Для глобального запрещения прерываний служат биты I и F статусного регистра,
записываются командой msr
evgen2
[quote name='aaarrr' date='Apr 2 2006, 15:00' post='100343']
[quote name='evgen2' post='100120' date='Apr 1 2006, 17:40']
1) Вылезла проблема с выравниванием.
[/quote]
Наверное, в описанном Вами случае стоит использовать union,
а еще лучше - сделать все руками, с выравниванием шутить не стоит.
[/quote]
ну лучше сразу на все грабли встать, чем потом по очереди. Я так понимаю что если это фича проца, то хоть union, хоть не union - если попадется невыравненный адрес, то хрень произойдет

[quote name='evgen2' post='100120' date='Apr 1 2006, 17:40']
2) не могу сообразить, как разрешать-запрешать прерывания.
[/quote]
Для глобального запрещения прерываний служат биты I и F статусного регистра,
записываются командой msr
[/quote]
[/quote]
Modem Control Register ? blink.gif

А может таки VICIntEnable/VICIntClr ? Ну так я их использую и все равно с CARM-овским компилером получается фигня - так будто бы это VICIntClr не моментально действует. А вот с RealView - вроде бы как все правильно, но таки остаются сомнения - может быть надо таки делать какие ритуальные танцы для гарантирования атомарности действий ?
aaarrr
Цитата(evgen2 @ Apr 2 2006, 17:41) *
Я так понимаю что если это фича проца, то хоть union, хоть не union - если попадется невыравненный адрес, то хрень произойдет

Только в случае с union это будет головная боль компилятора, а не Ваша.
*((_packed int *)&Buf[2] делает тоже самое, только через Ж.

Цитата(evgen2 @ Apr 2 2006, 17:41) *
Modem Control Register ? blink.gif

Во-первых MSR, а не MCR; во-вторых, это команда, а не регистр. Регистр называется
PSR, и относится к ядру процессора - смотрите мануал на ядро.
evgen2
Цитата(aaarrr @ Apr 3 2006, 03:12) *
Во-первых MSR, а не MCR; во-вторых, это команда, а не регистр. Регистр называется
PSR, и относится к ядру процессора - смотрите мануал на ядро.

эээ... смотрел в книгу, видел фигу называется.
Окей. MSR.
а VICIntEnable/VICIntClr тогда каким боком соотносится с MSR ?
Во! Еще оказывается в RealView компилере еще есть _enable_irq/_disable_irq и _enable_fiiq/_disable_fiq, которые я безуспешно пытался обнаружить в CARMе и аналоги которых есть в более других местах.
Теперь осталось прояснить ситуацию с задержкой запрещения прерываний и тем, сколько тактов съедает прерывание в сях.
Вот если я делаю _disable_irq() - можно ли считать что "на следующей строчке" у меня прерывания действительно запрещены ?
aaarrr
Цитата(evgen2 @ Apr 3 2006, 11:54) *
а VICIntEnable/VICIntClr тогда каким боком соотносится с MSR ?
Во! Еще оказывается в RealView компилере еще есть _enable_irq/_disable_irq и _enable_fiiq/_disable_fiq, которые я безуспешно пытался обнаружить в CARMе и аналоги которых есть в более других местах.

VIC никаким боком не соотносится с ядром - это внешнее периферийное устройство.
Функции _enable_irq/_disable_irq как раз устанавливают и снимают бит I в PSR.

Цитата(evgen2 @ Apr 3 2006, 11:54) *
Теперь осталось прояснить ситуацию с задержкой запрещения прерываний и тем, сколько тактов съедает прерывание в сях.
Вот если я делаю _disable_irq() - можно ли считать что "на следующей строчке" у меня прерывания действительно запрещены ?

Да, можно.
evgen2
А как бы так отпрофилировать выполнение , а то, например для
int A, B,C;
....
A = B/C;
показываются несколько не те времена, т.е. все что улетает в функции записывается в профилировщике в другом месте. Для своих функций это удобно, а вот для intrinsic все время сбивает с толку.

И еще вопрос: вот мне надо найти
int X, T;

V = (X[1]-X[0]) / (T[1]-T[0])

Где X - положение, Т - время с таймера 0. Долго выеживался чтоб остаться в int - типа
( (X[1]-X[0])<<16) / (T[1]-T[0]) и не уехать в ноль
где
abs(X[1]-X[0]) < 16000, (T[1]-T[0]) - от 0 до эээээ.. секунды
потом плюнул и сделал
float V = (float)(X[1]-X[0]) /(float) (T[1]-T[0])
и как-то оно с RealView вроде бы не очень тормозно получается
поругайте-похвалите
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.