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

uki

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о uki

  • День рождения 10.05.1984

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. Reset пин первым делом проверяли - тут всё ОК. Впрочем, вторая часть решения оказалась столь же прозаичной: писал не в те биты регистров установки/сброса значения пинов (недописал четыре нуля :))) - что называется, не забывай, что контроллер-то 32-разрядный :)) В итоге, было две глупые ошибки: отсутствие подтяжки Р0.14 и запись не в те биты. Заодно проверил таймер - работает. Хотя непривычно отсутствие прерывания по переполнению таймера, только по сравнению вижу. Всем большое спасибо за помощь! P.S. И стоит, видимо, ULINK приобрести. Или всё-таки LPC-Link должен видеть LPC2119 ?
  2. С P0.14 действительно промашечка вышла: на пине был постоянно 0 (автор платы забыл подтянуть к 3 вольтам), исправили. TD1 тоже на всякий пожарный подтянули, но проблема не исчезла. Что касается попробовать чей-то пример - нашёл только под uVision, попробую сейчас с ним получить нужный hex для прошивки.
  3. Нет, тут "самоделка" (не моя). По принципиальной схеме смотрел, вроде ок всё. Нюанс есть - надо ставить джампер, переключающий между режимом программирования и режимом работы, и если джампер не установлен, прошивальщик действительно поругается. К слову, пишу же я с верификацией, да и память потом вручную просматриваю - с прошивкой совпадает. С одним исключением - в прошивке (формат ihex) каждая строка содержит контрольную сумму, а в памяти устройства - уже без контрольной суммы. Но, насколько понимаю, так и должно быть. Может я невнимально читал даташит, и нужно что-то дополнительное сделать, чтобы загрузка кода пошла с флеш-памяти?
  4. Доброго времени суток! Имеется кастомная плата с контроллером LPC2119, JTAG отсутствует (точнее, есть старенький LPC-LINK, но через него не получается "увидеть" контроллер, в то время как LPCXpresso LPC1114 он благополучно заводит). В итоге LPC2119 есть возможность прошить через последовательный интерфейс (подключается к компу по USB через FTDI чип). Без JTAG-а как без глаз, но куда деваться. Итак, делаю простейший тест - назначаю пин P1.27 на выход и задаю значение (0). Компилирую прошивку в LPCXpresso, закидываю через FlashMagic v.7.85.3570 - и, увы, пин не в том состоянии, в котором ожидалось (т.е. 1). На всякий случай настраиваю PLL, повторяю операцию прошивки - и снова неудача. Листаю документацию, ответа не нахожу. Вариантов, очевидно, несколько: 1) Неправильно инициализирую контроллер 2) Неправильно составляю Makefile 3) Неправильно прошиваю 4) Контроллер дохлый Последний вариант не очень вероятен: сигнатуру-таки прошивальщик считывает (0x0201FF12), версия бутлоадера 1.70 Посему прошу помочь разобрать первые два варианта. Файл с проектом прикрепляю к посту. Среду использую LPCXpresso 7.1.1_125 Компиляторов пробовал два варианта - arm-none-eabi из комплекта с LPCXpresso и arm-elf-4.1.1 Кому неудобно качать архив, приведу код и здесь, благо его немного. main.c #include "lpc21xx.h" // Define main clock frequency (F_OSC) in Hz #define LPCSYS_F_OSC 12000000 // Define PLL multiplier #define LPCSYS_PLL_M 5 // Define PLL divider #define LPCSYS_PLL_P 2 // Calc MSEL bits in PLLCFG #if (LPCSYS_PLL_M > 0) || (LPCSYS_PLL_M < 6) #define MSEL (LPCSYS_PLL_M - 1) #else #error You must define LPCSYS_PLL_M (possible values are 1, 2, 3, 4, 5) #endif // Calc PSEL bits in PLLCFG #if LPCSYS_PLL_P == 1 #define PSEL (0 << 5) #elif LPCSYS_PLL_P == 2 #define PSEL (1 << 5) #elif LPCSYS_PLL_P == 4 #define PSEL (2 << 5) #elif LPCSYS_PLL_P == 8 #define PSEL (3 << 5) #else #error You must define LPCSYS_PLL_P (possible values are 1, 2, 4 and 8) #endif // IRQ flag #define IRQFLAG (1 << 7) // FIQ flag #define FIQFLAG (1 << 6) int main(void) { // TODO: insert code here // Enter an infinite loop, just incrementing a counter volatile static int i = 0; //------------------------------------------------------ // Enable and connect the PLL (Phase Locked Loop) // Set multiplier and divider PLLCFG = MSEL | PSEL; // Enable PLL PLLCON = (1 << 0); // Feed sequence PLLFEED = 0xAA; PLLFEED = 0x55; // Wait for PLL lock (PLOCK bit is set if locked) while (!(PLLSTAT & (1 << 10))); // Connect (and enable) PLL PLLCON = (1 << 0) | (1 << 1); // Feed sequence PLLFEED = 0xAA; PLLFEED = 0x55; //-------------------------------------------------------- PINSEL0 = 0; PINSEL1 = 0; PINSEL2 = 0x0000; IODIR1 |= 0xFF00; // set gpio out //IOSET1 = 0x5300; IOCLR1 = 0xFF00; while(1) { i++; } return 0; } Makefile # MCU name and submodel MCU = arm7tdmi-s SUBMDL = LPC2119 #THUMB = -mthumb #THUMB_IW = -mthumb-interwork ## Create ROM-Image (final) RUN_MODE=ROM_RUN ## Create RAM-Image (debugging) #RUN_MODE=RAM_RUN ## Setup stack size ## WARING!!! If you use newlib stdio then stack shouldn't be less than 0x800 STACK_SIZE = 0x1000 # Output format. (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = test2 # List C source files here. (C dependencies are automatically generated.) # use file-extension c for "c-only"-files SRC = main.c # List C source files here which must be compiled in ARM-Mode. # use file-extension c for "c-only"-files #SRCARM = LpcSystem/LpcSystem.c LpcCanDrv/touLpcCanDrv.c uart.c DbgSyscalls.c flash.c megger.c ad5312.c ad7799.c # canopen/platform.c canopen/objdict.c canopen/nmt.c canopen/sdo.c canopen/sync.c canopen/pdo.c # List C source files here which compiled in ARM-Interrupt-Mode (without -mthumb-interwork) # use file-extension c for "c-only"-files #SRCINT = Interrupt.c #SRCINT = touLpcCanDrv.c # List C++ source files here. # use file-extension cpp for C++-files (use extension .cpp) CPPSRC = # List C++ source files here which must be compiled in ARM-Mode. # use file-extension cpp for C++-files (use extension .cpp) #CPPSRCARM = $(TARGET).cpp CPPSRCARM = # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = # List Assembler source files here which must be assembled in ARM-Mode.. ASRCARM = crt0.S # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) OPT = 0 # Debugging format. # Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. # AVR (extended) COFF requires stabs, plus an avr-objcopy run. #DEBUG = stabs DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. #EXTRAINCDIRS = ./include #EXTRAINCDIRS = ./LpcSystem ./LpcCanDrv # Compiler flag to set the C Standard level. # c89 - "ANSI" C # gnu89 - c89 plus GCC extensions # c99 - ISO C99 standard (not yet fully implemented) # gnu99 - c99 plus GCC extensions CSTANDARD = -std=gnu99 # Place -D or -U options for C here CDEFS = -D$(RUN_MODE) # Place -I options here CINCS = # Place -D or -U options for ASM here ADEFS = -D$(RUN_MODE) # Compiler flags. # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing # # Flags for C and C++ (arm-elf-gcc/arm-elf-g++) CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) CFLAGS += -Wall -Wcast-align -Wcast-qual -Wimplicit CFLAGS += -Wpointer-arith -Wswitch CFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -Wunused CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) # flags only for C CONLYFLAGS = -Wstrict-prototypes -Wmissing-declarations CONLYFLAGS += -Wmissing-prototypes -Wnested-externs CONLYFLAGS += $(CSTANDARD) # flags only for C++ (arm-elf-g++) # CPPFLAGS = -fno-rtti -fno-exceptions CPPFLAGS = # Assembler flags. # -Wa,...: tell GCC to pass this to the assembler. # -ahlms: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] ##ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:.S=.lst),-g$(DEBUG) #Additional libraries. #Support for newlibc-lpc (file: libnewlibc-lpc.a) NEWLIBLPC = MATH_LIB = -lm CPLUSPLUS_LIB = -lstdc++ # Linker flags. # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -nostartfiles -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -lc LDFLAGS += $(NEWLIBLPC) $(MATH_LIB) LDFLAGS += -lc -lgcc LDFLAGS += $(CPLUSPLUS_LIB) LDFLAGS += -Wl,--defsym,STACK_SIZE=$(STACK_SIZE) # Set Linker-Script Depending On Selected Memory #ifeq ($(RUN_MODE),RAM_RUN) #LDFLAGS +=-T$(SUBMDL)-RAM.ld #else #LDFLAGS +=-T$(SUBMDL)-ROM.ld #endif LDFLAGS +=-T LPC2119-ROM.ld # --------------------------------------------------------------------------- # Flash-Programming support using lpc21isp by Martin Maurer # Settings and variables: #LPC21ISP = lpc21isp LPC21ISP = lpc21isp LPC21ISP_PORT = /dev/ttyUSB1 LPC21ISP_BAUD = 38400 LPC21ISP_XTAL = 12000 LPC21ISP_FLASHFILE = $(TARGET).hex # verbose output: ## LPC21ISP_DEBUG = -debug # enter bootloader via RS232 DTR/RTS (only if hardware supports this # feature - see Philips AppNote): LPC21ISP_CONTROL = # --------------------------------------------------------------------------- # Define directories, if needed. ## DIRARM = c:/WinARM/ ## DIRARMBIN = $(DIRAVR)/bin/ ## DIRAVRUTILS = $(DIRAVR)/utils/bin/ # Define programs and commands. #SHELL = sh #CC = arm-elf-gcc #CPP = arm-elf-g++ #OBJCOPY = arm-elf-objcopy #OBJDUMP = arm-elf-objdump #SIZE = arm-elf-size #NM = arm-elf-nm REMOVE = rm -f COPY = cp #CC = arm-none-eabi-gcc.exe #CPP = arm-none-eabi-g++.exe #OBJCOPY = arm-none-eabi-objcopy.exe #OBJDUMP = arm-none-eabi-objdump.exe #SIZE = arm-none-eabi-size.exe #NM = arm-none-eabi-nm.exe TOOLPATH=C:/WORK_RC_2014/GUITAR/arm-elf-4.1.1/bin CC = $(TOOLPATH)/arm-elf-gcc.exe CPP = $(TOOLPATH)/arm-elf-g++.exe OBJCOPY = $(TOOLPATH)/arm-elf-objcopy.exe OBJDUMP = $(TOOLPATH)/arm-elf-objdump.exe SIZE = $(TOOLPATH)/arm-elf-size.exe NM = $(TOOLPATH)/arm-elf-nm.exe # Define Messages # English MSG_ERRORS_NONE = Errors: none MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: MSG_SIZE_AFTER = Size after: MSG_FLASH = Creating load file for Flash: MSG_EXTENDED_LISTING = Creating Extended Listing: MSG_SYMBOL_TABLE = Creating Symbol Table: MSG_LINKING = Linking: MSG_COMPILING = Compiling C: MSG_COMPILING_ARM = "Compiling C (ARM-only):" MSG_COMPILING_INT = "Compiling C (ARM-Interrupt-only):" MSG_COMPILINGCPP = Compiling C++: MSG_COMPILINGCPP_ARM = "Compiling C++ (ARM-only):" MSG_ASSEMBLING = Assembling: MSG_ASSEMBLING_ARM = "Assembling (ARM-only):" MSG_CLEANING = Cleaning project: MSG_LPC21_RESETREMINDER = You may have to bring the target in bootloader-mode now. # Define all object files. COBJ = $(SRC:.c=.o) AOBJ = $(ASRC:.S=.o) COBJARM = $(SRCARM:.c=.o) COBJINT = $(SRCINT:.c=.o) AOBJARM = $(ASRCARM:.S=.o) CPPOBJ = $(CPPSRC:.cpp=.o) CPPOBJARM = $(CPPSRCARM:.cpp=.o) # Define all listing files. LST = $(ASRC:.S=.lst) $(ASRCARM:.S=.lst) $(SRC:.c=.lst) $(SRCARM:.c=.lst) LST += $(CPPSRC:.cpp=.lst) $(CPPSRCARM:.cpp=.lst) # Compiler flags to generate dependency files. ### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. #ALL_CFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. $(CFLAGS) $(GENDEPFLAGS) #ALL_ASFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. -x assembler-with-cpp $(ASFLAGS) ALL_CFLAGS = -mcpu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) # Default target. all: begin gccversion sizebefore build sizeafter finished end build: elf hex lss sym elf: $(TARGET).elf hex: $(TARGET).hex lss: $(TARGET).lss sym: $(TARGET).sym # Eye candy. begin: @echo @echo $(MSG_BEGIN) finished: @echo $(MSG_ERRORS_NONE) end: @echo $(MSG_END) @echo # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) -A $(TARGET).elf sizebefore: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi sizeafter: @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi # Display compiler version information. gccversion : @$(CC) --version # Program the device. program: $(TARGET).hex @echo @echo $(MSG_LPC21_RESETREMINDER) $(LPC21ISP) $(LPC21ISP_CONTROL) $(LPC21ISP_DEBUG) $(LPC21ISP_FLASHFILE) $(LPC21ISP_PORT) $(LPC21ISP_BAUD) $(LPC21ISP_XTAL) # Create final output files (.hex, .eep) from ELF output file. # TODO: handling the .eeprom-section should be redundant %.hex: %.elf @echo @echo $(MSG_FLASH) $@ $(OBJCOPY) -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. # testing: option -C %.lss: %.elf @echo @echo $(MSG_EXTENDED_LISTING) $@ $(OBJDUMP) -h -S -C $< > $@ # Create a symbol table from ELF output file. %.sym: %.elf @echo @echo $(MSG_SYMBOL_TABLE) $@ $(NM) -n $< > $@ # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJINT) $(COBJ) $(CPPOBJ) $(CPPOBJARM) %.elf: $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJINT) $(COBJ) $(CPPOBJ) $(CPPOBJARM) @echo @echo $(MSG_LINKING) $@ $(CC) $(THUMB) $(THUMB_IW) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJINT) $(COBJ) $(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS) # $(CPP) $(THUMB) $(THUMB_IW) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS) # Compile: create object files from C source files. ARM/Thumb $(COBJ) : %.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(THUMB) $(THUMB_IW) $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ # Compile: create object files from C source files. ARM-only $(COBJARM) : %.o : %.c @echo @echo $(MSG_COMPILING_ARM) $< $(CC) -c $(THUMB_IW) $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ # Compile: create object files from C source files. ARM-Interrupt-only $(COBJINT) : %.o : %.c @echo @echo $(MSG_COMPILING_INT) $< $(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ # Compile: create object files from C++ source files. ARM/Thumb $(CPPOBJ) : %.o : %.cpp @echo @echo $(MSG_COMPILINGCPP) $< $(CPP) -c $(THUMB) $(THUMB_IW) $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ # Compile: create object files from C++ source files. ARM-only $(CPPOBJARM) : %.o : %.cpp @echo @echo $(MSG_COMPILINGCPP_ARM) $< $(CPP) -c $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ # Compile: create assembler files from C source files. ARM/Thumb ## does not work - TODO - hints welcome ##$(COBJ) : %.s : %.c ## $(CC) $(THUMB) -S $(ALL_CFLAGS) $< -o $@ # Assemble: create object files from assembler source files. ARM/Thumb $(AOBJ) : %.o : %.S @echo @echo $(MSG_ASSEMBLING) $< $(CC) -c $(THUMB) $(THUMB_IW) $(ALL_ASFLAGS) $< -o $@ # Assemble: create object files from assembler source files. ARM-only $(AOBJARM) : %.o : %.S @echo @echo $(MSG_ASSEMBLING_ARM) $< $(CC) -c $(ALL_ASFLAGS) $< -o $@ # Target: clean project. clean: begin clean_list finished end clean_list : @echo @echo $(MSG_CLEANING) $(REMOVE) $(TARGET).hex $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).elf $(REMOVE) $(TARGET).map $(REMOVE) $(TARGET).obj $(REMOVE) $(TARGET).a90 $(REMOVE) $(TARGET).sym $(REMOVE) $(TARGET).lnk $(REMOVE) $(TARGET).lss $(REMOVE) $(COBJ) $(REMOVE) $(CPPOBJ) $(REMOVE) $(AOBJ) $(REMOVE) $(COBJARM) $(REMOVE) $(COBJINT) $(REMOVE) $(CPPOBJARM) $(REMOVE) $(AOBJARM) $(REMOVE) $(LST) $(REMOVE) $(SRC:.c=.s) $(REMOVE) $(SRC:.c=.d) $(REMOVE) $(SRCARM:.c=.s) $(REMOVE) $(SRCARM:.c=.d) $(REMOVE) $(CPPSRC:.cpp=.s) $(REMOVE) $(CPPSRC:.cpp=.d) $(REMOVE) $(CPPSRCARM:.cpp=.s) $(REMOVE) $(CPPSRCARM:.cpp=.d) $(REMOVE) .dep/* # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter gccversion \ build elf hex lss sym clean clean_list program ld /***********************************************************************/ /* */ /* ROM.ld: Linker Script File */ /* */ /***********************************************************************/ ENTRY(_boot) /*STACK_SIZE=0x400; - should be set in comand line (makefile)*/ /* Memory Definitions */ /* lpc2129 mt */ MEMORY { ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x0001E000 RAM (rw) : ORIGIN = 0x40000000, LENGTH = 0x00004000 } /* Section Definitions */ SECTIONS { /* first section is .text which is used for code */ .text : { *crt0.o (.text) /* Startup code */ *(.text) /* remaining code */ *(.rodata) /* read-only data (constants) */ *(.rodata*) *(.glue_7) *(.glue_7t) } > ROM . = ALIGN(4); /* .ctors .dtors are used for c++ constructors/destructors */ /* added by Martin Thomas 4/2005 based on Anglia Design example */ .ctors : { PROVIDE(__ctors_start__ = .); KEEP(*(SORT(.ctors.*))) KEEP(*(.ctors)) PROVIDE(__ctors_end__ = .); } >ROM .dtors : { PROVIDE(__dtors_start__ = .); KEEP(*(SORT(.dtors.*))) KEEP(*(.dtors)) PROVIDE(__dtors_end__ = .); } >ROM . = ALIGN(4); /* mthomas - end */ _etext = .; PROVIDE (etext = .); /* .data section which is used for initialized data */ .data : AT (_etext) { _data = .; *(.data) SORT(CONSTRUCTORS) /* mt 4/2005 */ } > RAM . = ALIGN(4); _edata = .; PROVIDE (edata = .); /* .bss section which is used for uninitialized data */ .bss (NOLOAD) : { __bss_start = .; __bss_start__ = .; *(.bss) *(COMMON) . = ALIGN(4); } > RAM . = ALIGN(4); __bss_end__ = .; PROVIDE (__bss_end = .); /* .stack ALIGN(256) : */ .stack : { . = ALIGN(256); . += STACK_SIZE; PROVIDE (_stack = .); } > RAM _end = .; PROVIDE (end = .); /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } } crt0.S
  5. DM3730: вопрос по DMA на GPMC

    Здравствуйте! Разбираюсь с процессором DM3730 от Texas Instruments. У него на внешней шине GPMC есть режим Burst Access, позволяющий перегонять данные не по одному слову, а пачками (в том числе с привязкой DMA). В общем и целом у меня получилось сделать диалог между DM3730 и FPGA при помощи этого механизма, но остался неприятный нюанс, а именно большие задержки между этими самыми "пачками". По документации, между одним Burst и другим расстояние задаётся несколькими параметрами (на разные случаи жизни - cycle2cycledelay, cycle2cyclesamecsen, cycle2cyclediffcsen, busturnaround), и все они у меня задавались и по 1, и по 0 тактов, т.е. задержка должна была быть минимальной (на фоне 22-23 тактов на один Burst), либо вовсе отсутствовать. А на деле оказывается, что задержка варьируется от ~20 до ~60 тактов. Почему - загадка. Маловероятно, что тут сказывается инерционность ОС, т.к. это по идее полностью аппаратный механизм. Кто-нибудь сталкивался с этим? Конечно, этому вопросу место скорее на ti.com, чем здесь, но там ответа можно полгода ждать и не дождаться, так что на всякий случай дублирую вопрос тут :)
×
×
  • Создать...