|
|
  |
Помогите запустить первую програмку, ARM7-LPC2148 |
|
|
|
Jan 5 2010, 19:55
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206

|
Написал первую программку - некоторые из светодиодов зажечь,некоторые потушить. В протеусе работает (там использую LPC2138), на отладочной не хочет. Использую Keil uVision 4.00a, программатор MT-Link v6.0,дрова-Segger. Шить прямо из Keil не получается, пишет, что этот программатор разработан только для IAR. Шью HEX через Segger JFlash. При попытке прошить пишет, что HEX содержит неверную контрольную сумму и предлагает вставить правильную. При использовании готового HEX демопрограммы к отлад плате, тоже ругается на CRC, но после исправления шьет и все работает. Моя же программа шьется,но не работает. Не могу сам разобраться с чем проблемы: с кодом или с прошиванием. Подскажите, что тут может быть не так. На плате: контроллер LPC2148, кварц-12МГц,светодиоды подключены к P0.8-P0.15, зажигаюстя нулями. Текст програмки: CODE #include <LPC214X.H> #define LEDS_MSK 0x0000FF00 /* P0.8..15 */ #define LED1 0x00000100 /* P0.8 */ #define LED2 0x00000200 /* P0.9 */ #define LED3 0x00000400 /* P0.10 */ #define LED4 0x00000800 /* P0.11 */
int main (void) { PINSEL1 = 0x40004000; // P0.23 - VBus(?),P0.31- UP_LED(?),остальные-GPIO
IO0DIR = LEDS_MSK; // пины светодиодов - на вых IO0CLR = LEDS_MSK; // все зажечь (подать 0) IO0SET = LED2; // 2-й потушить (подать 1) for(;;); }
Конфигурация:
|
|
|
|
|
Jan 6 2010, 09:08
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206

|
Цитата(toweroff @ Jan 6 2010, 01:33)  И что Вы стараетесь получить? Протеус с одним ядром, железка с другим, кривые дрова (руки?) и тд с жытаг? Ну,в протеусе LPC2138,в железке LPC2148,ядро же одно,в коде меняю хедер,остальное же одинаковое. Насчет кривости дров - демопрога норм шьется и работает, в протеусе тоже работает -т.е.код как бы рабочий. Подскажите хотя бы все ли в порядке с кодом и конфигурацией.
|
|
|
|
|
Jan 7 2010, 10:02
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206

|
Цитата(Сергей Борщ @ Jan 7 2010, 10:21)  А выложите-ка сюда листинг (в запакованном, разумеется, виде). Не работал с Кейлом, но если память не изменяет - ему надо было в проект кроме собственно исходника добавлять еще и стартап-файл. Тут проекты для Keil4 и для IAR5.40(не работает даже в протеусе) и схема в протеусе. Стартап для Keil - statup.s (его настройка в 1-м посте на скрине), в IAR не разобрался где этот стартап и как его настраивать. Если поможете с IAR - еще лучше. Заранее благодарю за помощь. Цитата(Student Pupkin @ Jan 7 2010, 03:55)  Возможно оффтоп... Тут пробегала тема, как у мт-линка обновить прошивку, чтобы его кейл признал.  Перешивать не могу в любом случае: это все добро у меня во временном пользовании. Буду мучаться с тем, что есть.
|
|
|
|
|
Jan 7 2010, 11:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(imiron13 @ Jan 7 2010, 12:02)  Тут проекты для Keil4 и для IAR5.40(не работает даже в протеусе) и схема в протеусе. Стартап для Keil - statup.s (его настройка в 1-м посте на скрине), Очень-очень смущает в .map фраза: Код ==============================================================================
Removing Unused input sections from the image.
Removing startup.o(RESET), (272 bytes).
1 unused section(s) (total 272 bytes) removed from the image.
============================================================================== Дизассемблировал .hex, получилось такое начало: Код Disassembly of section .sec1:
00000000 <.sec1>: 0: eb000000 bl 0x8 4: eb000025 bl 0xa0 8: e28f002c add r0, pc, #44; 0x2c c: e8900c00 ldm r0, {sl, fp} 10: e08aa000 add sl, sl, r0 14: e08bb000 add fp, fp, r0 18: e24a7001 sub r7, sl, #1; 0x1 1c: e15a000b cmp sl, fp 20: 1a000000 bne 0x28 24: eb00001d bl 0xa0 28: e8ba000f ldm sl!, {r0, r1, r2, r3} 2c: e24fe018 sub lr, pc, #24; 0x18 30: e3130001 tst r3, #1; 0x1 Тут отсутствуют вектора исключений. То, что этот код работает в протеусе - чистая случайность. Он работает потому, что в вашей простой программе не используются ни исключения (прерывания), ни переменные, ни даже вызовы подпрограмм. Когда загрузчик переписывает контрольную сумму векторов, которые должны тут быть - он рушит одну из команд. Вам надо разобраться - почему линкер выкидывает секцию RESET. Специалисты по Кейлу, ау!!! Цитата(imiron13 @ Jan 7 2010, 12:02)  в IAR не разобрался где этот стартап и как его настраивать. Если поможете с IAR - еще лучше. В IAR подходящий в большинстве случаев стартап лежит в библиотеке и подлинковывается автоматически. С пятым иаром не помогу - ушел с четвертого в arm-gcc. Помню, что вся загвоздка в четвертом иаре была с выбором в настройках проекта правильного кристалла и скрипта линкера (под ваш конкретный кристалл, в пятом это будет файл .icf). Вот, смотрите - в иаровском проекте у вас вектора есть: Код Disassembly of section .sec1:
00000000 <.sec1>: 0: e59ff018 ldr pc, [pc, #24]; 0x20 4: e59ff018 ldr pc, [pc, #24]; 0x24 8: e59ff018 ldr pc, [pc, #24]; 0x28 c: e59ff018 ldr pc, [pc, #24]; 0x2c 10: e59ff018 ldr pc, [pc, #24]; 0x30 14: b8a06f60 stmialt r0!, {r5, r6, r8, r9, sl, fp, sp, lr} 18: e59ff014 ldr pc, [pc, #20]; 0x34 1c: e59ff014 ldr pc, [pc, #20]; 0x38 20: 00000080 andeq r0, r0, r0, lsl #1 24: 00000230 andeq r0, r0, r0, lsr r2 28: 00000230 andeq r0, r0, r0, lsr r2 2c: 00000230 andeq r0, r0, r0, lsr r2 30: 00000230 andeq r0, r0, r0, lsr r2 34: 00000230 andeq r0, r0, r0, lsr r2 38: 00000230 andeq r0, r0, r0, lsr r2
Disassembly of section .sec2:
00000080 <.sec2>: 80: e10f0000 mrs r0, CPSR 84: e3c0001f bic r0, r0, #31; 0x1f 88: e3800012 orr r0, r0, #18; 0x12 8c: e121f000 msr CPSR_c, r0 ........... Если ваш отладчик работает с ИАРом, то что вам мешает пройти программу по дизассемблированному листингу шагам и найти место, в котором происходит затык? Снимите в настройках проекта в разделе отладчика галочку "run to main" и при старте отладчик остановится на векторе сброса.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 7 2010, 11:31
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Цитата(imiron13 @ Jan 7 2010, 13:02)  для IAR5.40(не работает даже в протеусе)... Если поможете с IAR - еще лучше. В ИАР-е стартап прикручивать не надо, он формируется сам, в смысле там имеется шаблон, как грица на все случаи жизни, так что если в проекте нет файла cstartup.s (), то автоматически вставляется этот шаблон (но невидимо для вас  ). Не хватает вам файла *.icf - конфигурационного файла для линкера (linker, компоновщика). Я вот файл прицепил, но взял из IAR\...\arm\examples\NXP\LPC214x\...
LPC2148_flash.rar ( 743 байт )
Кол-во скачиваний: 86В опциях проекта в разделе "linker" ставьте галку "Override default" и укажите путь к файлу *.icf. Должно...
|
|
|
|
|
Jan 7 2010, 11:41
|

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

|
Цитата(Student Pupkin @ Jan 7 2010, 14:31)  В ИАР-е стартап прикручивать не надо, он формируется сам, в смысле там имеется шаблон, как грица на все случаи жизни, так что если в проекте нет файла cstartup.s (), то автоматически вставляется этот шаблон (но невидимо для вас  ). Ой какая пурга  . Да откомпилированный среднепотолочный startup просто лежит с каждой из библиотек. Вот и все - никаких "шаблонов", никаких "невидимок". Если в проекте есть, как и из чего сделать нужный объектник, то тогда он линкуется вместо готового библиотечного. Совершенно обычное поведение ДЛЯ ЛЮБЫХ библиотечных функций и ЛЮБЫХ компиляторов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 7 2010, 15:32
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206

|
Спасибо всем большое за помощь - самому тяжело разбираться. Пошагал отладчиком: уходил на обработку исключения после команды PUSH, получается не было памяти для стека. Последовал советам, вставил файл *.icf - и все заработало! Ну,как я понял,в *.icf описываются доступные области памяти, размеры стеков, а как можно настроить PLL,MAM в IAR?
|
|
|
|
|
Jan 7 2010, 21:45
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Цитата(imiron13 @ Jan 7 2010, 18:32)  Ну,как я понял,в *.icf описываются доступные области памяти, размеры стеков, Все примеры в iar-е для LPC2xx снабжаются двумя icf-файлами (из примеров их и воруйте  ): 1) для заливки программы во FLASH (xxx_FLASH.icf); 2) для заливки программы из ОЗУ (xxx_RAM.icf) - этот вариант чисто для отладки. Для использования такого варианта в примерах всегда еще есть mac-файл - RAM.mac (скрипт для отладчика по предварительному чтению-записи каких-либо участков памяти, SFR, и др. - в данном случае выполняется ремап таблицы векторов исключений на начало ОЗУ). Если используете вариант отладки в ОЗУ, то этот mac-файл нужно пристегнуть в опциях debugger. Цитата(imiron13 @ Jan 7 2010, 18:32)  а как можно настроить PLL,MAM в IAR? Графического "визард-мастера"  у иара нет. По мне так для начальных экспериментов запускать их незачем - просто включите MainOsc и переключитесь на него, а MAM на такой частоте не нужен (а также не нужен, если отладку в ОЗУ выбрали).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|