Перейти к содержанию
    

lpc13xx + gcc

В общем имеется у меня платка LPCExpresso, с lpc1343 на борту, давно купленная за кровные 750руб.

Никакие keil'ы, iar'ы, code red'ы, меня категорически не устраивают, как и eclipse в принципе.

Выбор IDE я хочу сделать самостоятельно.

А вот компилятор я хочу gcc.

Есть от klen'а, есть Yagarto, есть Codesourcery G++.

Так вот:

Не могу сообразить, как собрать первый проект с cortex'овским cmsis'ом. (CMSISv1p30_LPC13xx)

Нужен как минимум makefile и скрипты для линкера, а также правильная инициализация при старте. - это я правильно понимаю?

Есть у кого нибудь пример для сабжа. Ну или может кто объяснит, что да как. Или даст адресок, где можно об этом почитать.

 

Натыкался вот на это в интернете.

http://www.microbuilder.eu/Projects/LPC134...enceDesign.aspx

Но там все как-то перепахано и simple example от туда не получается выдрать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, смотрел, спасибо.

Копал довольно долго, но там в основном если и есть какие примеры, то для их среды на code red, или для keil'овского uVision'а, то есть всякие IDE.

А makefile'ы в Example Projects созданы средой и имеют соответствующее предупреждение

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

 

И вообще высылаю сайту NXP лучики паноса, ибо гуглом не гуглится, а ихними поисками находятся постоянно 100500 страниц одного и того же, как бы ты не уточнял запрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Копал довольно долго, но там в основном если и есть какие примеры, то для их среды на code red, или для keil'овского uVision'а, то есть всякие IDE.

А makefile'ы в Example Projects созданы средой и имеют соответствующее предупреждение

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

Эти предупреждения касаются тех, кто пользуется средами. Если Вы пользоваться не собираетесь, то можете смело вымарать комментарии и пользоваться на первых порах имеющимися мейкфайлами и скриптами, которые и в африке останутся мейкфайлами и скриптами.

Когда немного разберётесь можете продолжить самообучение на базе ну хоть этой статьи, а также имеющейся в интернете документации по линкеру и утилите make.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам сюда = LPC1343 Code Base

 

У меня тоже есть плата за 750р, я половину от нее (с чужим JTAG) отпили ножовкой по металлу ;)

Изменено пользователем Arischenko Ivan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, родной jtag я уже отпилил.

Имеется в наличии какой то клон j-link'а, вот его и прикручу.

Но для начала надо хоть что нибудь скомпилировать.

Как я уже говорил имеется стойкая неприязнь ко всем навязываемым IDE.

Вам сюда = LPC1343 Code Base

Тут весьма сложно для начала. То есть, я не понимаю что там происходит при сборке (что и от чего зависит), и это мне не нравится. Хочется во всем разобраться.

Надеялся на то, что тут у кого нибудь имеется совсем простенький пример makefile и ld скрипта для lpc13xx. Если в makefile'ах я еще что-то понимаю, то с ld я не сталкивался. И нужен ли он, ld-скрипт, вообще, может он в CMSIS'е есть?

можете продолжить самообучение на базе ну хоть этой статьи

Там не про cortex'ы, я так понял что cortex'ы довольно сильно отличаются от arm7tdmi. Да и к тому же там все как то объясняется через одно место, типа:

для работы процессора нужна низкоуровневая инициализация low_level_init(), вот она. В ней эта строка обозначает то, а та строка обозначает это.

то же самое и для ld-скриптов.

Меня больше интересует, где это взять для конкретного процессора, в частности моего, а уж дальше я надеюсь разберусь там, где да что.

Если есть еще какие мануалы, я буду рад.

 

P.S. Обзавелся еще платкой с stm32f103cbt6, может с этим чипом у меня заладится. Хотя, как я думал, между кортексами окромя переферии разницы нет. Оказывается не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я уже говорил имеется стойкая неприязнь ко всем навязываемым IDE

Это конечно дело вкуса и удобности, но вот интересно дебаг вы тоже будете с помощью консоли ?

Насколько я понимаю Вы только начинаете работать с этой платой. Так почему же для начала не использовать готовые сеймплы от производителя ?

Меня больше интересует, где это взять для конкретного процессора, в частности моего, а уж дальше я надеюсь разберусь там, где да что.

Если есть еще какие мануалы, я буду рад.

 

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

 

Процедура же компиляции в gcc и использования мейкфайлов ИМХО не очень отличаются между разными процессорами, тем более подобной архитектуры будь то Cortex или ARM7TDMI. В инете можно найти масу примеров майкфайлов, как сложной так и более понятной структуры. Отличия в основном будут в файле линкера, разметка секций памяти. Но я думаю что можно найти lds файл для Вашего проца и разобраться.

 

Кстати, тоже жду на LPCExpresso от NXP и тоже привык работать с makefile + gcc, правда на мой взгляд гораздо удобнее тогда использовать связку gcc + makefile +Eclipse и нормальной редактор и дебагер можно подцепить.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я попробовал пользоваться этим code red. Спасибо, больше желания нет.

Говорю, среду я выберу. Благо хватает альтернатив, это и code::blocks, и codelite. Наверняка еще разных IDE можно найти тот же ваш любимый eclipse (на котором code red и построена). Мне сейчас важно откомпилить какой нибудь хеллоу ворд, а уж потом озаботится средой, и перейти на любую другую среду поддерживающую gcc и makefile не составит труда.

Я просто надеялся, что может кто уже работает с этим процом, и поделится хелло вордом для него, что ускорит изучение.

Но видимо не судьба. Буду сам рыть интернет и по чуть чуть все изучать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, родной jtag я уже отпилил.

Имеется в наличии какой то клон j-link'а, вот его и прикручу.

Но для начала надо хоть что нибудь скомпилировать.

Как я уже говорил имеется стойкая неприязнь ко всем навязываемым IDE.

 

А что в том примере навязано? Там есть makefile based project, соответственно его упрощением можно хоть получить "hello worrd", даже приведены gdb скрипты.

 

Проект никак не привязан к среде разработки, я с ним работал и в Eclipse и в CodeLite. Более на сайте все подробно разобрано, отдают полные исходники : проект, скрипт линкера, скрипт GDB, пояснения к makefile. У меня проект поехал сразу и с первого раза, тем более что периферия совпадает с предыдущей линейкой от NXP. Если есть желание - я завтра могу свой демонстрационный проект посмотреть и отдать.

Изменено пользователем Arischenko Ivan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рабочий Makefile для сборки библиотеки CMSYS для LPC1768. Правда, для работы в линуксе.

 

########################################################################

# Makefile to create FirmWare Library for LPC17xx

########################################################################

TCHAIN = arm-elf

TCHAIN_VER = 4.6.1

TCHAIN_ROOT = /usr/local

 

MCU = cortex-m3

OPT = 0

CMCORE = CM3

DEVICE = LPC17xx

 

DEBUG = dwarf-2

CSTANDARD = -std=gnu99

 

TARGET = lib$(DEVICE)

 

PROJECT = DEV_LPC17xx

PROJ_ROOT = ~/MPrjs/CortexM3/$(PROJECT)

 

EXTRAINCDIRS =

 

########################################################################

# (FWLIB) SOURCE AND HOCEADERS LOCATIONS

########################################################################

FWLIB_ROOT =~/MPrjs/CortexM3/LPC1700CMSIS

FWLIB_SRC_DIR =$(FWLIB_ROOT)/Drivers/source

FWLIB_INC_DIR =$(FWLIB_ROOT)/Drivers/include

 

 

########################################################################

# (CMCORE) SOURCE AND HEADERS LOCATIONS

########################################################################

CMCORE_DIR =$(FWLIB_ROOT)/Core/$(CMCORE)/CoreSupport

DEVICE_DIR =$(FWLIB_ROOT)/Core/$(CMCORE)/DeviceSupport/NXP/$(DEVICE)

 

 

########################################################################

# C-Sources

########################################################################

SRC = $(PROJ_ROOT)/lpc17xx_libcfg.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_gpio.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_adc.c

#SRC += $(FWLIB_SRC_DIR)/lpc17xx_gpio.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_nvic.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_pinsel.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_spi.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_timer.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_uart.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_clkpwr.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_rtc.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_ssp.c

SRC += $(FWLIB_SRC_DIR)/lpc17xx_systick.c

 

########################################################################

# Assembler-Sources

########################################################################

ASRC =

 

#CDEFS =

CDEFS = -D__BUILD_WITH_EXAMPLE__

 

CFLAGS = $(CDEFS)

CFLAGS += -mthumb

CFLAGS += -Wall

CFLAGS += -O$(OPT)

CFLAGS += -mapcs-frame

CFLAGS += -D__thumb2__=1

CFLAGS += -msoft-float

CFLAGS += -mfpu=vfp

CFLAGS += -mfloat-abi=soft

CFLAGS += -mno-sched-prolog

CFLAGS += -fno-hosted

#CFLAGS += -mtune=cortex-m3

#CFLAGS += -march=armv7-m

#CFLAGS += -mfix-cortex-m3-ldrd

CFLAGS += -ffunction-sections

CFLAGS += -fdata-sections

CFLAGS += -g$(DEBUG)

CFLAGS += $(CSTANDARD)

 

#CFLAGS += -Wstrict-prototypes

#CFLAGS += -Wundef

#CFLAGS += -Wa,-adhlns=$(<:%.c=%.lst)

#CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))

 

CFLAGS += -D__BUILD_WITH_EXAMPLE__=1

 

CFLAGS += -I $(FWLIB_INC_DIR) -I $(CMCORE_DIR) -I $(DEVICE_DIR)

 

ASFLAGS = -Wa,-adhlns=$(<:%.S=%.lst),-g$(DEBUG)

ASFLAGS += -mthumb -Dgcc -DBUILD_ALL

AFLAGS += -I $(FWLIB_INC_DIR) -I $(CMCORE_INC_DIR)

 

CC = $(TCHAIN_ROOT)/bin/$(TCHAIN)-gcc

AS = $(TCHAIN_ROOT)/bin/$(TCHAIN)-as

AR = $(TCHAIN_ROOT)/bin/$(TCHAIN)-ar

LD = $(TCHAIN_ROOT)/bin/$(TCHAIN)-gcc

NM = $(TCHAIN_ROOT)/bin/$(TCHAIN)-nm

OBJDUMP = $(TCHAIN_ROOT)/bin/$(TCHAIN)-objdump

OBJCOPY = $(TCHAIN_ROOT)/bin/$(TCHAIN)-objcopy

READELF = $(TCHAIN_ROOT)/bin/$(TCHAIN)-readelf

RANLIB = $(TCHAIN_ROOT)/bin/$(TCHAIN)-ranlib

SIZE = $(TCHAIN_ROOT)/bin/$(TCHAIN)-size

 

SHELL = /bin/sh

REMOVE = /bin/rm -f

REMOVEDIR = /bin/rm -rf

 

# Define all object files.

OBJ = $(SRC:%.c=%.o) $(ASRC:%.S=%.o)

 

# Define all listing files.

LST = $(SRC:%.c=%.lst) $(ASRC:%.S=%.lst)

 

# Combine all necessary flags and optional flags.

# Add target processor to flags.

ALL_CFLAGS = -mcpu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)

ALL_ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)

 

# target for make all -> just create go to target lib

all: lib

 

%.o : %.c

$(CC) -c $(ALL_CFLAGS) $< -o $@

 

%.o : %.S

$(CC) -c $(ALL_ASFLAGS) $< -o $@

 

lib: $(OBJ)

$(AR) -crs $(TARGET).a $(OBJ)

 

# Target: clean project.

clean :

$(REMOVE) $(SRC:.c=.s)

$(REMOVE) $(SRC:.c=.d)

$(REMOVE) $(OBJ)

$(REMOVE) $(LST)

$(REMOVE) $(TARGET).a

$(REMOVEDIR) .dep

 

 

# Create object files directory

# $(shell mkdir $(OBJDIR) 2>/dev/null)

 

 

# Include the dependency files.

-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

 

 

# Listing of phony targets.

.PHONY : all build clean lib

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага спасибо =)

Программа минимум для меня выполнена ( моргание светодиодом )

 

Благодаря интернетам собрал солянку ->

 

/* link.ld - GNU ld script */

SEARCH_DIR(.);
ENTRY(reset);	/* точка входа программы */
OUTPUT_ARCH(arm);
OUTPUT_FORMAT("elf32-littlearm","elf32-bigarm","elf32-littlearm"); /*  */

MEMORY		/* Начальные адреса и размеры оперативной и флешь памяти */
{
flash (rx)	: ORIGIN = 0x0,			LENGTH = 0x8000	/* размер флешь LENGTH = 32K */
ram (rwx)	: ORIGIN = 0x10000000,	LENGTH = 0x2000	/* размер опреативной памяти LENGTH = 8K */
}

SECTIONS	/* куда какую информацию размещать */
{
/*. = flash; */
.text :						/* размещение самой программы (исполняемый код) */
{
	/*. = ALIGN(4)	*/		/* оператор точка определяет текущий адрес, оператор ALIGN(4) –
предписываем компоновщику выравнивать адреса по 4 байта */
	KEEP(*(.vector_table))	/* таблица векторов прерывания в начале флешь памяти, KEEP */
	*(.text*)				/* исполняемый код */
	*(.rodata*)				/* константы */
} > flash					/* размещаем во флешь*/
_etext = .;					/* */
/*. = ram; */
.data :						/* размещение ненулевых данных */
{
	_data = .;				/*  */
	*(.data*)				/*  */
	_edata = .;				/*  */
} > ram AT>flash			/*  */

.bss :						/*  */
{
	_bss = .;				/*  */
	*(.bss*)				/*  */
	_ebss = .;				/*  */
} > ram						/*  */

/*_ram_top = ram;*/
/*_stack_top = _ram_top;*/

_stack_size = 200;						/*  */
_stack_top = 0x10000000 + 0x2000; 		/*  */
_stack_begin = _stack_top - _stack_size;/*  */

. = _stack_begin;						/*  */
._stack :								/*  */
{
	. = . + _stack_size;				/*  */
  } > ram									/*  */
}

 

/* startup.c */
void reset(void);
extern void main(void);
extern unsigned long _stack_top;

__attribute__ ((section(".vector_table")))
void (* const vectors[128])(void) =
{
(void *) &_stack_top,
reset
};

void reset(void)
{
/* copy the .data section from flash to RAM */

/* zero the .bss section */

main();

while(1);
}

 

#==========================================================
#	File:	Makefile for Cortex-M3
#	Date:	2011-01-02
#==========================================================

OPTIMIZATION = s

#----------------------------------------------------------

SRC_C = startup.c
SRC_C += lpc1343_hello.c

#----------------------------------------------------------

#CROSS_PATH = C:/gcc/arm/Sourcery/
CROSS_PATH = C:/gcc/arm/yagarto/
#CROSS_PATH = C:/gcc/arm/kgp-arm-eabi_x86-64/

LD_SCRIPT = link.ld

TOOLCHAIN = arm-none
#TOOLCHAIN = arm-kgp

#CROSS = $(CROSS_PATH)/bin/arm-none-eabi-
CROSS = $(CROSS_PATH)/bin/$(TOOLCHAIN)-eabi-

INCLUDES += -I$(CROSS_PATH)/$(TOOLCHAIN)-eabi/include
INCLUDES += -I$(CROSS_PATH)/$(TOOLCHAIN)-eabi/include/lib

#----------------------------------------------------------

FLAGS_C  = $(INCLUDES) -I.
FLAGS_C += -O$(OPTIMIZATION)
FLAGS_C += -Wall
FLAGS_C += -c
FLAGS_C += -fmessage-length=0
FLAGS_C += -fno-builtin
FLAGS_C += -ffunction-sections
FLAGS_C += -fdata-sections
FLAGS_C += -msoft-float
FLAGS_C += -mapcs-frame
FLAGS_C += -D__thumb2__=1
FLAGS_C += -mno-sched-prolog
FLAGS_C += -fno-hosted
FLAGS_C += -mtune=cortex-m3
FLAGS_C += -mcpu=cortex-m3
FLAGS_C += -mthumb
FLAGS_C += -mfix-cortex-m3-ldrd

FLAGS_LD = -Xlinker
FLAGS_LD += --gc-sections
FLAGS_LD += -mcpu=cortex-m3
FLAGS_LD += -mthumb
FLAGS_LD += -static   
FLAGS_LD += -nostdlib

#----------------------------------------------------------

all: clean target.elf

%.elf: $(SRC_C:%.c=target/%.o)
@echo Linking: $@
@$(CROSS)gcc $(FLAGS_LD) -T'$(LD_SCRIPT)' -o 'target/$@' $^ $(LD_LIB)
@echo '-----------------------------------------------------------'
@$(CROSS)size 'target/target.elf'
@$(CROSS)objcopy -O binary 'target/target.elf' 'target/target.bin'
@$(CROSS)objcopy -O ihex 'target/target.elf' 'target/target.hex'
@$(CROSS)objdump -h -S -z 'target/target.elf' > 'target/target.lss'
@$(CROSS)nm -n 'target/target.elf' > 'target/target.sym'
@rm -f target/*.o

$(SRC_C:%.c=target/%.o): target/%.o: %.c
@echo Compiling: $<
@$(CROSS)gcc $(FLAGS_C) -c $< -o $@

clean:
@echo '-----------------------------------------------------------'
@rm -f target/*.*	

.PHONY : all clean

 

ну и собственно сам код, без CMSIS, еще не вкурил как ей пользоваться.

 

/* lpc1343_hello.c */
#define LED_BIT 7
#define DELAY 35E+4

#define GPIO0DIR	0x50008000
#define GPIO0DATA	0x50000000

#define LED_MASK		(GPIO0DATA + (1 << (LED_BIT+2)))
#define LED_SET_DATA	(1 << (LED_BIT+2))
#define LED_CLR_DATA	~(1 << (LED_BIT+2))



void delay(int n)
{
int i;
for(i=0; i < n; i++) {__asm("nop");} 
} 

int main()
{
int *p = (int *)GPIO0DIR; // port 0 // GPIO 0 data direction register
// set pin0_7 as output
*p |= (1 << LED_BIT);
//int *led = (int *)(GPIO0DATA + (1 << (LED_BIT+2))); // port 0 bit 7
int *led = (int *)LED_MASK;

while (1) 
{
	// *led = 0xFFFFFFFF;//~0;
	*led = LED_CLR_DATA;
	delay(500000);
	//*led = 0;
	*led = LED_SET_DATA;
	delay(500000);
}
return 0;
}

 

да и сейчас другой проект на linux embeded поэтому раскуриваю маны по линуксу

Изменено пользователем IgorKossak
[codebox] !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...