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

    

zemlemer

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
  1. Добрый день. У меня возникли некоторые сложности при использовании Code Composer Studio 8.1. Есть плата от Spectrum Digital. На ней стоит OMAPL137. По проекту нужно будет использовать только DSP часть. Если в настройках проекта поставить EVM6747 - Gel файл грузится, правда не тот что хотелось, но хоть что-то. Попытка выставить в натроойках Device - TMS320C6747 и прописать в Debug Configuration ->Initialization script тот-же gel (evmc6747_dsp.gel) - не грузится и ругается на памать (что не удивительно). Похоже, что та же ситуация с линкером. В опциях проекта прописывается линкеровский cmd, п при полной пересброрке он автоматом генерит новый и пытается подключить оба.
  2. STM32F4: SPI2 через DMA

    Цитата(AHTOXA @ Nov 10 2016, 18:51) И от этого все FF-ы превращаются в нули? От лишнего клока вначале? Естественно. Вместо команды на чтение идет неизвестно что. Цитата(k155la3 @ Nov 11 2016, 18:09) У Вас Код. . . SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); . . . Попробуйте оставить только один канал DMA для проверки - который работает с флеш. Если не секрет, что за флеш используется ? M25P80.
  3. STM32F4: SPI2 через DMA

    Цитата(AHTOXA @ Nov 9 2016, 08:09) Для побайтового доступа надо установить MBURST в 16 (не знаю, чему это соответствует в терминах StdPeriphLib). Вот топик, где я с этим разбирался: ссылка (читать до конца, там есть тонкие моменты с выравниванием). Оказалось все гораздо проще. Если выставить chip select до старта spi, то ловится лишний клок.
  4. STM32F4: SPI2 через DMA

    Цитата(rtfcnf @ Nov 8 2016, 08:57) Попробуйте определить массивы для DMA, с атрибутом __attribute__((aligned(32))) мой массив uint8_t spi1_rx[ADS131_DATA_SIZE] __attribute__((aligned(32))); Без изменений, к сожалению.
  5. STM32F4: SPI2 через DMA

    Добрый день. Вроде не первый раз пишу для STM и вроде по букварю, но нарвался. Есть STM32F405. К нему через SPI2 присоединена флеша на spi. Читаю из порта данные флеши вручную - корректно. Как только читаю по DMA - в приемном буфере нули. Код инициализации порта: CODE // 1. Clock setup: spi port and pins RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // 2. Pins setup GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // SCK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOB, &GPIO_InitStructure); // MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOC, &GPIO_InitStructure); // MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2); // SCK GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2); // MISO GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2); // MOSI // NSS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_12); // 3. SPI setup setFlashNssHigh(); SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // SPI_CPOL_Low SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //SPI_CPHA_1Edge SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // SPI_BaudRatePrescaler_2 SPI_BaudRatePrescaler_4;// SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_Cmd(SPI2, ENABLE); Читаю данные: CODE setTerminalMessage(info, "Reading data"); setFlashNssLow(); spiByteExchange(READ_DATA); // command spiByteExchange(0x00); // address spiByteExchange(0x00); // address spiByteExchange(0x00); // address for(i = 0; i < 20; i++){ rcvByte = spiByteExchange(0x00); setTerminalMessage(info, "Data[%02d] - %02x", i, rcvByte); } setFlashNssHigh(); Получаю FF на выходе, что корректно. Также корректно читается ID flash памяти. Пытаюсь инициализировать DMA CODE DMA_Cmd(DMA1_Stream3, DISABLE); DMA_Cmd(DMA1_Stream4, DISABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE); SPI_Cmd(SPI2, DISABLE); DMA_DeInit(DMA1_Stream4); while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE); DMA_DeInit(DMA1_Stream3); while (DMA_GetCmdStatus(DMA1_Stream3) != DISABLE); memset((void *)gl_rcvFlashBuffer, 0, DMA_BUFF_SZ); memset((void *)gl_trnFlashBuffer, 0, DMA_BUFF_SZ); gl_trnFlashBuffer[0] = READ_DATA; // PAGE_PROGRAM; // 1. DMA Clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); // 2. Interrupt NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn; // Only rx interrupt NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 2. DMA Structure // DMA_InitTypeDef DMA_InitStructure; // 2.2. Common DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR)); // 2.3. TX DMA DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)gl_trnFlashBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = DMA_BUFF_SZ; DMA_Init(DMA1_Stream4, &DMA_InitStructure); // 2.3. RX DMA DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)gl_rcvFlashBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = DMA_BUFF_SZ; DMA_Init(DMA1_Stream3, &DMA_InitStructure); // 2.4. Enabling only rx interrupt DMA_ITConfig(DMA1_Stream3, DMA_IT_TC , ENABLE); DMA_ClearFlag(DMA1_Stream3, DMA_FLAG_TCIF3); DMA_ClearFlag(DMA1_Stream4, DMA_FLAG_TCIF4); DMA_Cmd(DMA1_Stream3, ENABLE); // Enable the DMA SPI RX Stream DMA_Cmd(DMA1_Stream4, ENABLE); // Enable the DMA SPI TX Stream SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); setTerminalMessage(info, "Starting"); setFlashNssLow(); gl_FlashDmaOn = true; SPI_Cmd(SPI2, ENABLE); while(true == gl_FlashDmaOn); setTerminalMessage(info, "Done"); setTerminalMessage(info, "DMA read data"); for(i = 0; i < 50; i++){ setTerminalMessage(info, "Data[%02d] - %02x", i, gl_rcvFlashBuffer[i]); } Код прерывания: CODE void DMA1_Stream3_IRQHandler(void) { if(DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3)!= RESET){ DMA_ClearITPendingBit(DMA1_Stream3, DMA_IT_TCIF3); // Clear NSS gl_FlashDmaOn = false; setFlashNssHigh(); } } Буфера объявлены как #define DMA_BUFF_SZ (256 + 4) static uint8_t gl_trnFlashBuffer[DMA_BUFF_SZ]; static uint8_t gl_rcvFlashBuffer[DMA_BUFF_SZ]; volatile bool_t gl_FlashDmaOn = false; По осциллогафу на chip select DMA отрабатывает корректно, в приемном буфере - нули. Есть ли мысли? Может надо как-то выравнивать буфер? Или забыл что?
  6. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(demiurg_spb @ Oct 23 2016, 00:21) Я каждый раз задаюсь вопросом: в чём был смысл такого решения при создании сишной библиотеки? Смыслов несколько. У меня статически выделен массив для передачи строки в терминал, а стандартные работают с динамическим перераспределением памяти. Использовать malloc или realloc нужно когда совсем припрет. Мне не нужны все возможности printf или sprintf (кто-нить использовал \b или \v или ..... ), но все лишнее намертво прилепится к выходному бинарнику.
  7. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(iiv @ Oct 21 2016, 22:03) если у вас одинарная точность, sprintf хочет %f или %e или %g, а если двойная, то да, с "l" надо писать. Знаю. Просто va_arg не работает с float, поэтому перед передачей я преобразовывал в double а после - обратно во float.
  8. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(scifi @ Oct 20 2016, 20:22) Я невнимательно посмотрел. Если линкуется целочисленная версия, не будет вот этих странных чисел. Обратите внимание на выравнивание стека по границе 8 байт. Помню, это приводило к чудесам в плавучке. Вроде к линковщике секция с правильным ALIGN, или я не правильно понял. Код  ._user_heap_stack :   {     . = ALIGN(4);     PROVIDE ( end = . );     PROVIDE ( _end = . );     PROVIDE ( __end__ = . );     . = . + _Min_Heap_Size;     . = . + _Min_Stack_Size;     . = ALIGN(4);   } >RAM Вообще ситуация еще более печальна. Задавая вопрос, я просто упростил сложившуюся ситуацию. На самом деле я пишу небольшую библиотеку для отладочного вывода. Парсер разбора форматной строки - va_arg - корректно работает с целочисленными переменными. Т.е. intarg = va_arg(ap, int32_t); отрабатывает корректно. Как только речи идет о передаче плавучки - doublearg = va_arg(ap, double); - передается мусор. Если передать float через *((int32_t*)&floatarg и передать через va_arg(ap, int32_t); - передается правильно.
  9. Вывод float в arm-none-eabi-gcc для stmf4

    Цитата(scifi @ Oct 20 2016, 18:26) В командную строку линкера нужно добавить "-u _printf_float". Первоисточник. На самом деле пробовал с -u _printf_float и с -u _sprintf_float с одинаковым результатом.
  10. Вывод float в arm-none-eabi-gcc для stmf4

    Добрый день. Я меня возникли некоторые проблемы с выводом в терминал значений с плавающей точкой. Самый обычный sprintf прекрасно работает с целыми числами и отказывается работать с float. Например CODE float flttest = 123.45678; sprintf(TestArray, "-= %lf =-", flttest); Terminal("Test1: STR %s", TestArray); uint16_t integer= 12345; sprintf(TestArray, "*- %d -*", integer); Terminal("Test2: STR %s", TestArray); При этот вывод: 003 INFO: Test1: STR -= 403099659660755.687500 =- 004 INFO: Test2: STR *- 12345 -* Основные ключи компилятора: arm-none-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mlittle-endian -mthumb-interwork -ffunction-sections -fdata-sections -Wl,--gc-sections Основные ключи линкера: arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Xlinker -Map="project.map" -L/opt/gcc-arm-none-eabi-5_4/arm-none-eabi/lib/armv7e-m/fpu/ --specs=rdimon.specs -T/Core/STM32F4XX_FLASH.ld Кто-либо сталкивался с подобным?
  11. STM32F103 и I2S

    Добрый день. Возникла следующая проблема: I2S в режиме slave не работает. Вроде пишу все по правилам: CODE I2S_InitTypeDef I2S_InitStructure; #define I2S_CODEC SPI2 // 1. Clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // 2. Pins GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // wclk | bclk | sd GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 4. I2S setup SPI_I2S_DeInit(I2S_CODEC); I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveRx; //I2S_Mode_SlaveTx; I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips; I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; // I2S_DataFormat_16bextended I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_Default; I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; I2S_Init(I2S_CODEC, &I2S_InitStructure); I2S_Cmd(I2S_CODEC, ENABLE); setTerminalMessage(info, "Starting test DAC"); SPI_I2S_ReceiveData(I2S_CODEC); for(;;) { setTerminalMessage(info, "Tp0"); while (SPI_I2S_GetFlagStatus(I2S_CODEC, SPI_I2S_FLAG_RXNE) == RESET); setTerminalMessage(info, "Tp1"); setTerminalMessage(info, "Data received - %04x", SPI_I2S_ReceiveData(I2S_CODEC)); } Программа взвисает на приеме: SPI_I2S_FLAG_RXNE не выставляется. При этом кодек испавно подает WCLK и BCLK и выглядят они как phillips прописал: ровно 16 BCLK на каждый перепад WCLK. Никто с подобным не сталкивался?
  12. Makefile мечты

    ЦитатаЗЫ. Вам в первом же ответе дали ссылку на makefile из scmRTOS. Там сделано как раз то, что вы хотите. Хотя с VPATH может и ваш вариант сработает. Спасибо. С VPATH заработало. Большое спасибо всем откликнувшимся.
  13. Makefile мечты

    Возможно, я не совсем корректно (или совсем некорректно) сформулировал вопрос. Есть следующая структура каталогов проекта. Core/ STM32F10x_StdPeriph_Driver/ Project/ Makefile Я написал для нее следующий makefile. CODEPROJECT=RadioModem RM= rm -f MKDIR = mkdir -p OBJDIR = $(CURDIR)/obj TOOLCHAIN = /opt/gcc-arm-none-eabi-4_9 TOOLCHAIN_BIN = $(TOOLCHAIN)/bin/ TOOLCHAIN_LIB = $(TOOLCHAIN)/arm-none-eabi/lib/ TOOLCHAIN_INC = $(TOOLCHAIN)/arm-none-eabi/include/ CXX = $(TOOLCHAIN_BIN)arm-none-eabi-g++ CC = $(TOOLCHAIN_BIN)arm-none-eabi-gcc AS = $(TOOLCHAIN_BIN)arm-none-eabi-as LD = $(TOOLCHAIN_BIN)arm-none-eabi-ld CP = $(TOOLCHAIN_BIN)arm-none-eabi-objcopy OD = $(TOOLCHAIN_BIN)arm-none-eabi-objdump SZ = $(TOOLCHAIN_BIN)arm-none-eabi-size # Interrupts vector table VECTOR = $(CURDIR)/Core/src/startup_stm32f10x_hd.S # Linker script LDSCRIPT = $(CURDIR)/Core/stm32_flash.ld LDFLAGS = -T$(LDSCRIPT) -L$(TOOLCHAIN_LIB) -nostartfiles -Xlinker --gc-sections -Wl,-Map,$(PROJECT).map -mcpu=cortex-m3 -mthumb #assembler flags ASFLAGS = -x assembler-with-cpp -Wall -c -fmessage-length=0 -mcpu=cortex-m3 -mthumb # compiler flags CFLAGS = -mthumb -mcpu=cortex-m3 -Os -fno-builtin -Wall -std=gnu99 INC := -I$(CURDIR)/STM32F10x_StdPeriph_Driver/inc/ INC += -I$(CURDIR)/Core/inc/ INC += -I$(CURDIR)/Project/inc/ INC += -I$(TOOLCHAIN_INC) DEFINITIONS := -DSTM32F10X_HD DEFINITIONS +=-DUSE_STDPERIPH_DRIVER DEFINITIONS +=-DMAGOR_VER=0 DEFINITIONS +=-DMINOR_VER=1 CFLAGS+= $(DEFINITIONS) CFLAGS+= $(INC) # System sources ASRC := $(VECTOR) CSRC := $(wildcard $(CURDIR)/STM32F10x_StdPeriph_Driver/src/*.c) CSRC += $(wildcard $(CURDIR)/Core/src/*.c) # Project sources CSRC += $(CURDIR)/Project/src/main.c CSRC += $(CURDIR)/Project/src/stm32_it.c COBJ := $(CSRC:.c=.o) AOBJ := $(ASRC:.S=.o) #COBJ := $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o))) #AOBJ := $(addprefix $(OBJDIR)/, $(notdir $(ASRC:.S=.o))) all: $(PROJECT).elf $(PROJECT).bin $(PROJECT).lst $(PROJECT).lst: $(PROJECT).elf $(OD) -h -S $(PROJECT).elf > $(PROJECT).lst $(SZ) --format=berkeley $(PROJECT).elf $(PROJECT).bin: $(PROJECT).elf $(CP) -O binary $(PROJECT).elf $@ $(PROJECT).elf: $(OBJDIR) $(AOBJ) $(COBJ) $(CC) $(LDFLAGS) $(AOBJ) $(COBJ) -o $@ $(OBJDIR): $(MKDIR) $(OBJDIR) %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ %.o: %.S $(CC) -c $(ASFLAGS) $< -o $@ clean: rm -f $(PROJECT) $(COBJ) $(AOBJ) rm $(PROJECT).elf $(PROJECT).lst $(PROJECT).map $(PROJECT).bin rm -rf obj .PHONY: clean Данный makefile абсолютно рабочий. И он меня почти всем устраивает. Но, у меня возникло желание не загромождать каталоги Core, STM32F10x_StdPeriph_Driver и Project объектными файлами при компиляции. Как только я заменяю кострукцию COBJ := $(CSRC:.c=.o) AOBJ := $(ASRC:.S=.o) на COBJ := $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o))) AOBJ := $(addprefix $(OBJDIR)/, $(notdir $(ASRC:.S=.o))) сразу пропадают из видимости make-а правила построения объектников из исходников. Меня это немного смущает. Как можно написать кострукцию зависимости *с и *S файлов, разбросанным по разным каталогам, чтобы правило %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ %.o: %.S $(CC) -c $(ASFLAGS) $< -o $@ работало корректно? Спасибо.
  14. Добрый день. Хочется странного. На данный момент есть вполне рабочий makefile со следующим кодом. CODE # C source files CFILES = $(filter %.c, $(SRC)) # Assembly source files ASMFILES = $(filter %.S, $(SRC)) # Object files COBJ = $(CFILES:.c=.o) SOBJ = $(ASMFILES:.S=.o) OBJ = $(SOBJ) $(COBJ) ##### OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC)) #all: $(SRC) $(PROJECT).elf $(PROJECT).bin $(PROJECT).lst $(PROJECT).lst: $(PROJECT).elf $(OD) -h -S $(PROJECT).elf > $(PROJECT).lst $(SZ) --format=berkeley $(PROJECT).elf $(PROJECT).bin: $(PROJECT).elf $(CP) -O binary $(PROJECT).elf $@ $(PROJECT).elf: $(OBJ) $(CC) $(LDFLAGS) $(OBJ) -o $@ $(COBJ): %.o: %.c $(CC) -c $(FEATURES) $(INC) $(CFLAGS) $< -o $@ $(SOBJ): %.o: %.S $(CC) -c $(ASFLAGS) $< -o $@ $(SRC) - полное имя файла, включая путь. Данная конструкция нормально собирает проект. Хочется, чтобы объектные файлы лежали в отдельном каталоге: например /obj/. Написал следующую конструкцию: CODE # Object files COBJ := $(addprefix $(OBJDIR)/,$(notdir $(CSRC:.c=.o))) AOBJ := $(addprefix $(OBJDIR)/,$(notdir $(ASRC:.S=.o))) $(PROJECT).lst: $(PROJECT).elf $(OD) -h -S $(PROJECT).elf > $(PROJECT).lst $(SZ) --format=berkeley $(PROJECT).elf $(PROJECT).bin: $(PROJECT).elf $(CP) -O binary $(PROJECT).elf $@ $(PROJECT).elf: OBJDIR $(AOBJ) $(COBJ) $(CC) $(LDFLAGS) $(AOBJ) $(COBJ) -o $@ OBJDIR: $(MKDIR) $(OBJDIR) $(AOBJ): $(OBJDIR)/%.o : %.S $(CC) -c $(ASFLAGS) $< -o $@ $(COBJ): $(OBJDIR)/%.o : %.c $(CC) -c $(FEATURES) $(INC) $(CFLAGS) $< -o $@ При этом получаю ругань на то, что отсутствует цель для ассемблерного файла (.S). Для "сишных", как я понимаю, тоже нет цели. Как мне уговорить make "увидеть" цель для компиляции ассемблерных и сишных исходников? Спасибо.
  15. Ага. Теперь нормально собралось. Всем откликнувшимя - огромное спасибо.