LINUX.ORG.RU

CortexM3. С чего начать.

 , ,


1

2

Всем доброго времени суток.

На полке в шкафу откопал вот такую вот платку ( http://www.starterkit.ru/html/index.php?name=shop&op=view&id=5 ) на основе LPC1788 от NXP и решил попробовать реализовать свою детскую мечту и помигать светодиодиками. В наличии так же имеется SEGGER J-Link ARM, которым планируется плату прошивать.

Но в итоге я так и не смог понять, откуда мне стоит начинать свои изыскания. В интернете хватает статей о том, как написать код для этой/подобной платы. Я уже успел поставить себе LPCXpresso.

Вся проблема в том, что я не очень хорошо себе представляю, что должно произойти с моим кодом, чтобы он начал выполнятся на плате.

1. Скомпилировать (каким компилятором?)
2. Слинковать в исполняемый файл/готовую прошивку (чем это сделать?)
3. (самое сложное) Как залить исполняемый код на плату.

LPCXpresso может скомпилировать и слинковать нечто, но после уверенно сообщает о том, что ни одна плата к PC не подключена и заливать/запускать код отказывается наотрез.

Собственно буду благодарен за любую помощь, в том числе за ссылки на иностранном языке.

P.S. Нашел в репозиториях openocd, возможно это то, что необходимо для «заливки» кода на плату? Официальные утилиты от SEGGER скачать не получается, т.к. программатор покупался у местных перекупщиков, которые выдают его за свое творение и теперь невозможно узнать его реальный серийный номер.

Для пришедших за информацией - вот полезные ссылки

http://pygmy.utoh.org/riscy/cortex/led-lpc17xx.html - есть скрипт линкера и, видимо, куча другой полезной инфы - все же неправильный

http://we.easyelectronics.ru/CADSoft/ubuntu-eclipse-code-sourcery-openocd-j-l... - описание, как настроить среду для работы в Ubuntu

http://we.easyelectronics.ru - тут вообще много полезных статей

Внутри темы есть правильный скрипт для линкера и ссылки на правильный startup.S В скрипте необходимо будет сделать небольшие изменения, информация об этом так же есть в теме ниже.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 3)
Ответ на: комментарий от Kosyak

Прерывания при старте процессора обычно замаскированы. Если не используешь прерывания, тебе таблица с векторами не нужна.

geks
()
Ответ на: комментарий от Kosyak

Теперь получается вот так:

$ arm-none-eabi-gcc -T"/zprojects/LPC1788/linker/my.ld" -Xlinker --gc-sections -Wl,-Map,"test1.map" -mcpu=cortex-m3 -mthumb -g3 -o "test1.elf"  ./startup/gcc/startup_LPC177x_8x.o  ./main.o 
./startup/gcc/startup_LPC177x_8x.o: In function `.flash_to_ram_loop':
/home/trex/workspace/test1/Debug/../startup_ARMCM3.S:310: undefined reference to `SystemInit'
/home/trex/workspace/test1/Debug/../startup_ARMCM3.S:310: undefined reference to `_start'
collect2: ld returned 1 exit status

P.S. Блин! Начинаю чувствовать себя вообще ничего не понимающим дураком.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

undefined reference to `SystemInit'

Это функция обычно из CMSIS (опять, должна поставлятся производителем), инициализирует микроконтроллер (запускает внешний тактовый генератор и переключается на него, настраивает прерывания и т.д.) пока можешь просто в main.c пустую void SystemInit(void) сделать.

undefined reference to `_start'

Можно просто заменить в стартапе _start на main. ЕМНИП, _start определен в сишной рантаймовой библиотеке и внутри себя вызывает main.

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

ПОБЕДА!!!

(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x1fff0bde in ?? ()
(gdb) load
Loading section .text, size 0x1fc lma 0x0
Loading section .data, size 0x8 lma 0x1fc
Start address 0x114, load size 516
Transfer rate: 1 KB/sec, 258 bytes/write.
(gdb) break main
Breakpoint 1 at 0x1be: file ../main.c, line 12.
(gdb) continue
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, main () at ../main.c:12
12		int counter = 0;
(gdb) 

Большое спасибо за помощь. Теперь только осталось разобраться, как правильно самостоятельно писать скрипты, найти SystemInit и наконец-то подмигнуть светодиодиком.

Еще раз спасибо за помощь, подозреваю, что без вас я бы в итоге не справился.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

Я по аналогии с MPlabom говорю - там можно сразу из IDE выбирать программер и заливать прошиву, может в его IDE такое можно.

aiqu6Ait ★★★★
()
Ответ на: комментарий от aiqu6Ait

MPlab

Я без понятия, что это. Подозреваю, что что-то вендузячье.

может в его IDE такое можно

Он вообще никакого IDE не использует! И правильно делает. Хотя, на любителя. Я сам пользуюсь geany, правда, лишь в качестве редактора.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Он вообще никакого IDE не использует

Это не совсем верно. В повседневной жизни использую QtCreator - очень удобная штука и для подсветки кода, и для добавления файлов в проект автоматически и еще много для чего. Рекомендую попробовать, плюшек для чистого C там конечно же не так много, как для крестов, но все же хватает.

В этом проекте пока что IDE не использую, т.к. не было готовых скриптов для сборки и заливки (да и вообще была каша в голове по поводу самого процесса разработки). Теперь вроде бы все стало ясно и понятно, буду пробовать приспособить QtCreator для работы с МК-шками.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от aiqu6Ait

Никак. Зачем? Если не фурычит, добавляю отладочных сообщений. Я никогда не пользовался дебаггерами, да и не умею.

А вообще, я не понял связи между дебаггерами и IDE. Зачем нужна IDE, чтобы запускать gdb?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Зачем нужна IDE, чтобы запускать gdb?

Удобно сразу же видеть код, в котором находишься и значения переменных в одном окне, удобнее расставлять брейкпоинты, нет нужды осиливать ман по gdb (а он, к слову, в распечатанном виде 4 с небольшим сантиметра).

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Я уже "прилип" к geany, очень он мне нравится. А к кутям у меня блевотное отношение, поэтому, ясен пень, ни о каких кутикриейторах речи идти не может.

// эх, чертов НГ! Я так надеялся, что допилю работу с AD7794 и проверю на точность три разных типа РТД. Похоже, до лета отложить придется ☹. Ну, хоть сетку успел поднять на STM32F407.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

к кутям у меня блевотное отношение, поэтому, ясен пень, ни о каких кутикриейторах речи идти не может

А как связаны QtCreator и библиотеки Qt? Или у вас ко всему ПО, выполненное с помощью этого фреймворка вызывает отвращение?

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Ко всему. Конечно, не до такой степени, чтобы вообще не пользоваться, но таки предпочитаю, если есть возможность, использовать что-нибудь более приличное.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от trex6

Ну или motif какой. Лишь бы красиво и без глюков.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

если ты имеешь ввиду j-link от segger (или его китайские клоны), то общий у него с st-link только разъём jtag/swd :)

qbe
()
Ответ на: комментарий от Kosyak

Еще раз добрый день.

После того, как мне успешно удалось помигать светодиодом я продолжил свои эксперементы и попробовал собрать бинарник без startup.S. После его заливки на плату и запуска у меня что-то «сломалось». Теперь openocd выдает следующее:

$ openocd 
Open On-Chip Debugger 0.5.0 (2011-12-03-08:57)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.berlios.de/doc/doxygen/bugs.html
Warn : Adapter driver 'jlink' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
adapter_nsrst_delay: 500
jtag_ntrst_delay: 500
1000 kHz
cortex_m3 reset_config vectreset
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM V8 compiled Dec  1 2009 11:42:48
Info : J-Link caps 0xb9ff7bbf
Info : J-Link hw version 80000
Info : J-Link hw type J-Link
Info : J-Link max mem block 9576
Info : J-Link configuration
Info : USB-Address: 0xff
Info : Kickstart power on JTAG-pin 19: 0xffffffff
Info : Vref = 3.287 TCK = 1 TDI = 0 TDO = 1 TMS = 0 SRST = 0 TRST = 0
Info : J-Link JTAG Interface ready
Info : clock speed 1000 kHz
Info : JTAG tap: lpc1788.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Error: lpc1788.cpu: IR capture error; saw 0x02 not 0x01
Warn : Bypassing JTAG setup events due to errors
Warn : Invalid ACK 0 in JTAG-DP transaction
Polling target failed, GDB will be halted. Polling again in 100ms
Polling target failed, GDB will be halted. Polling again in 300ms
Polling target failed, GDB will be halted. Polling again in 700ms
Polling target failed, GDB will be halted. Polling again in 1500ms
Polling target failed, GDB will be halted. Polling again in 3100ms
Polling target failed, GDB will be halted. Polling again in 6300ms

Последняя строчка постоянно повторяется, на reset и halt отвечает ошибками и продолжает повторять последнюю строчку. Это как-нибудь можно починить?

P.S. sudo call ncrmnt

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.