Jump to content
Sign in to follow this  
carlogulliani

Как Подключить Файлы В Makefile?

Recommended Posts

Добрый день, подскажите, есть директория с проектом и библиотеками

структура директории

/---------------------
main.c
lib
|
|-------cmsis
|-------mylib
                |
                |--------led
                                |
                                |-------- led.h
                                |-------- led.c
|-------STM32F4xx_StdPeriph_Driver
build
Makefile

Как подключить папку led к линковщику

// led.h
#include <stdio.h>
#include "stm32f4xx.h"
void turnOn();
void turnOff();

// led.c
#include "led.h"
void turnOn()
{
GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}
void turnOff()
{
GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}

// main.c
#include <stdio.h>
#include "stm32f4xx.h"
#include "led.h"
...
// init gpio
...
extern void turnOn();
extern void turnOff();
...
// init sys clock
...
int main(void) {
setSysTick();
while(1)
{
//check the push button
turnOn();
Delay(500);
turnOff();
}
return 0;
}

описание файла Makefile для линковщика и компилятора

# Makefile
# STM32F4-Discovery Makefile for Mac OSX

SRCS=$(wildcard *.c)

# Add assembly source files here or use $(wildcard *.s) for all .s files
S_SRCS = CortexM4asmOps.s


# Project name
PROJ_NAME = test
OUTPATH = build

OUTPATH := $(abspath $(OUTPATH))
BASEDIR := $(abspath ./)
MKDIR_P = mkdir -p


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

# Check for valid float argument
# NOTE that you have to run make clan after
# changing these as hardfloat and softfloat are not
# binary compatible
ifneq ($(FLOAT_TYPE), hard)
ifneq ($(FLOAT_TYPE), soft)
#override FLOAT_TYPE = hard
override FLOAT_TYPE = soft
endif
endif

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

AS=$(BINPATH)arm-none-eabi-as
CC=$(BINPATH)arm-none-eabi-gcc
LD=$(BINPATH)arm-none-eabi-gcc
OBJCOPY=$(BINPATH)arm-none-eabi-objcopy
OBJDUMP=$(BINPATH)arm-none-eabi-objdump
SIZE=$(BINPATH)arm-none-eabi-size

LINKER_SCRIPT = stm32_flash.ld

CPU = -mcpu=cortex-m4 -mthumb

CFLAGS = $(CPU) -c -std=gnu99 -g -O2 -Wall
LDFLAGS = $(CPU) -mlittle-endian -mthumb-interwork -nostartfiles -Wl,--gc-sections,-Map=$(OUTPATH)/$(PROJ_NAME).map,--cref --specs=nano.specs

ifeq ($(FLOAT_TYPE), hard)
CFLAGS += -fsingle-precision-constant -Wdouble-promotion
CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard
else
CFLAGS += -msoft-float
endif

# Default to STM32F40_41xxx if no device is passed
ifeq ($(DEVICE_DEF), )
DEVICE_DEF = STM32F40_41xxx
endif

CFLAGS += -D$(DEVICE_DEF)

vpath %.a lib
vpath %.c lib/mylib


# Includes
INCLUDE_PATHS = -I$(BASEDIR)/inc -I$(BASEDIR)/lib/cmsis/stm32f4xx -I$(BASEDIR)/lib/cmsis/include -I$(BASEDIR)
INCLUDE_PATHS += -I$(BASEDIR)/lib/Conf
INCLUDE_PATHS += -I$(BASEDIR)/lib/STM32F4xx_StdPeriph_Driver/inc

INCLUDE_PATHS += -I$(BASEDIR)/mylib/im
INCLUDE_PATHS += -I$(BASEDIR)/mylib/im/led

# Library paths
LIBPATHS = -L$(BASEDIR)/lib/STM32F4xx_StdPeriph_Driver

# Libraries to link
LIBS = -lstdperiph -lc -lgcc -lnosys

OBJS = $(SRCS:.c=.o)
OBJS += $(S_SRCS:.s=.o)

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

.PHONY: lib proj

all: dir lib proj
$(SIZE) $(OUTPATH)/$(PROJ_NAME).elf

lib:
$(MAKE) -C lib FLOAT_TYPE=$(FLOAT_TYPE) BINPATH=$(BINPATH) DEVICE_DEF=$(DEVICE_DEF) BASEDIR=$(BASEDIR)

proj: $(OUTPATH)/$(PROJ_NAME).elf

.s.o:
$(AS) $(CPU) -o $(addprefix $(OUTPATH)/, $@) $<

.c.o:
$(CC) $(CFLAGS) -std=gnu99 $(INCLUDE_PATHS) -o $(addprefix $(OUTPATH)/, $@) $<

$(OUTPATH)/$(PROJ_NAME).elf: $(OBJS)
$(LD) $(LDFLAGS) -T$(LINKER_SCRIPT) $(LIBPATHS) -o $@ $(addprefix $(OUTPATH)/, $^) $(LIBS) $(LD_SYS_LIBS)
$(OBJCOPY) -O ihex $(OUTPATH)/$(PROJ_NAME).elf $(OUTPATH)/$(PROJ_NAME).hex
$(OBJCOPY) -O binary $(OUTPATH)/$(PROJ_NAME).elf $(OUTPATH)/$(PROJ_NAME).bin
$(OBJDUMP) -S --disassemble $(OUTPATH)/$(PROJ_NAME).elf > $(OUTPATH)/$(PROJ_NAME).dis

dir:
$(MKDIR_P) $(OUTPATH)

clean:
rm -f $(OUTPATH)/*.o
rm -f $(OUTPATH)/$(PROJ_NAME).elf
rm -f $(OUTPATH)/$(PROJ_NAME).hex
rm -f $(OUTPATH)/$(PROJ_NAME).bin
rm -f $(OUTPATH)/$(PROJ_NAME).dis
rm -f $(OUTPATH)/$(PROJ_NAME).map
# Remove the following line if you don't want to clean the Libraries as well
$(MAKE) clean -C lib

flash:
st-flash write build/$(PROJ_NAME).bin 0x08000000

компилирую библиотеки

make lib
make[1]: `mylib' is up to date.

собираю бинарник

make

выдает ошибку

build/main.o: In function `main':
main.c:37: undefined reference to `turnOn'
main.c:39: undefined reference to `turnOff'
collect2: error: ld returned 1 exit status
make: *** [build/test.elf] Error 1

Если файлы из lib/mylib/led перенести в корень (на уровень, что и main.c), тогда все собирается хорошо

Пробовал также добавить

SRCS=$(wildcard lib/mylib/led/*.c)
ассемблер ругается что нет .o файла
Assembler messages:
Fatal error: can't create /lib/mylib/led/led.o: No such file or directory
make: *** [lib/mylib/led/led.o] Error 1

пытаюсь скомпилировать .o файл

gcc -g -o -c led.c

не может подтянуть другие хедеры

In file included from led.c:1:
./led.h:2:10: fatal error: 'stm32f4xx.h' file not found
#include "stm32f4xx.h"

Edited by carlogulliani

Share this post


Link to post
Share on other sites

В комплекте с MDK 5.15 есть описание команд линковщика, вот что там есть

--libpath=pathlist это для стандартных библиотек

--userlibpath=pathlist для пользовательских библиотек

похоже в секцию

# Library paths

LIBPATHS = -L$(BASEDIR)/lib/STM32F4xx_StdPeriph_Driver

надо добавить

userlibpath=pathlist по анологии с

LIBPATHS

Edited by snn_krs

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By German Churilin
      Добрый день всем! Столкнулся с проблемой, над решением которой бьюсь уже месяц - суть в том, что при пересылке аудио данных с контроллера в внешний цап на выходе цапа звучит белый шум(именно когда летят данные). Уже перепробовал разные конфигурации и параметры, да даже другой цап ставил - всё равно та же самая проблема. Может кто сталкивался, или у кого есть идеи почему так происходит?
      Контроллер stm32f407ve китайский, но вроде как рабочий, цап - pcm1606, вытащенный из двд-плеера.

      код инициализации i2s
      RCC_PLLI2SCmd(DISABLE); RCC_I2SCLKConfig(RCC_I2S2CLKSource_PLLI2S); RCC_PLLI2SConfig(200,5); RCC_PLLI2SCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY) == RESET){}; //WS - word clock output GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_SPI2); GPIO_StructInit(&gpioInit); gpioInit.GPIO_Pin = GPIO_Pin_9; gpioInit.GPIO_Mode = GPIO_Mode_AF; gpioInit.GPIO_OType = GPIO_OType_PP; gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL; gpioInit.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOB, &gpioInit); //BCLK - shift clock output GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2); gpioInit.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOB, &gpioInit); //SD - serial audio data GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2); gpioInit.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOC, &gpioInit); //MCO - master clock output GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_SPI2); gpioInit.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOC, &gpioInit); I2S_StructInit(&i2sInit); i2sInit.I2S_CPOL = I2S_CPOL_Low; i2sInit.I2S_Mode = I2S_Mode_MasterTx; i2sInit.I2S_MCLKOutput = I2S_MCLKOutput_Enable; i2sInit.I2S_Standard = I2S_Standard_Phillips; i2sInit.I2S_AudioFreq = I2S_AudioFreq_48k; i2sInit.I2S_DataFormat = I2S_DataFormat_24b; I2S_Init(SPI2, &i2sInit); SPI2->I2SPR = (uint16_t)((uint16_t)512 | (uint16_t)12 | (uint16_t)1); //for 48k Fs SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); I2S_Cmd(SPI2, ENABLE);  
      код инициализации dma
      DMA_InitTypeDef dmaInit; NVIC_InitTypeDef nvicInit; DMA_DeInit(DMA1_Stream4); DMA_Cmd(DMA1_Stream4, DISABLE); while(DMA_GetCmdStatus(DMA1_Stream4) == ENABLE){}; __ISB(); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); //To dmaInit.DMA_PeripheralBaseAddr = (uint32_t) &(SPI2->DR); //From dmaInit.DMA_Memory0BaseAddr = (uint32_t)&AUDIO_SAMPLE; dmaInit.DMA_BufferSize = 20480; dmaInit.DMA_Channel = DMA_Channel_0; dmaInit.DMA_DIR = DMA_DIR_MemoryToPeripheral; dmaInit.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dmaInit.DMA_MemoryInc = DMA_MemoryInc_Enable; dmaInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dmaInit.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; dmaInit.DMA_Mode = DMA_Mode_Circular; dmaInit.DMA_Priority = DMA_Priority_High; dmaInit.DMA_FIFOMode = DMA_FIFOMode_Enable; dmaInit.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; dmaInit.DMA_MemoryBurst = DMA_MemoryBurst_Single; dmaInit.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; while(DMA_GetCmdStatus(DMA1_Stream4) == ENABLE); DMA_Init(DMA1_Stream4, &dmaInit); DMA_ITConfig(DMA1_Stream4, DMA_IT_TC | DMA_IT_HT, ENABLE); //configure interrupt nvicInit.NVIC_IRQChannel = DMA1_Stream4_IRQn; nvicInit.NVIC_IRQChannelPreemptionPriority = 0; nvicInit.NVIC_IRQChannelSubPriority = 0; nvicInit.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvicInit); DMA_Cmd(DMA1_Stream4, ENABLE); while(DMA_GetCmdStatus(DMA1_Stream4) != ENABLE){}; AUDIO_SAMPLE просто wav скопированный через hex редактор и живущий в памяти контроллера, крутиться по кругу. Вроде как, в теории всё должно работать(снизу скрин из pulseview - снято логическим анализатором), к сожалению осциллограф пока что не приобрёл, так что проверить правильность частот не представляется возможнымб но всё же всё вроде как красиво.
      Формат i2s на контроллере совпадает с форматом на цапе - первый бит передаётся через 1 тик sck после смены ws
       
      П.С. подозреваю сразу вопросы про MSB/LSB - wav файл сам по себе little-endian, собственно как и контроллер, то есть тут не должно быть проблем, а i2s стандарт передаёт MSB первым, соответственно если у меня в памяти записано 0x64, 0x61, 0x61, 0x66, 0x02, 0x00, 0x85... то, судя по скрину всё передаётся правильно? или я что то не понимаю в этом всём? Но не в этом суть - в один момент тоже подумал что порядок не тот, но, к сожалению, попытки свапать байты местами(и побайтово, и по словам) не дали ни какого результата

    • By admin
      В ролике показано как скомпилировать и установить библиотеку OpenCV 4.1.0 на Raspberry Pi 3.
      Используйте промокод CXEMNET и получите скидку 10% в магазине https://www.seeedstudio.com/ при покупке от 150$!
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-Pi-3-Model-B--p-3037.html малинка
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-PI-VGA666-DPI-dtoverlays-Module.html модуль vga666
      https://www.seeedstudio.com/category/Raspberry-pi-c-1010/Raspberry-Pi-Camera-Module-V2-p-2800.html камера
      Команды из видео.
      Открыть настройки raspberry Pi: 
      sudo raspi-config
      Далее выбираем Advanced Options → Expand Filesystem. Перезагружаемся.

      Установка требуемых пакетов:
      sudo apt-get install cmake cmake-curses-gui libgtk2.0-dev
      sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libx264-dev libxvidcore-dev
      sudo apt-get install libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
      sudo apt-get install gfortran libatlas-base-dev
      Увеличение размера файла подкачки. 
      sudo nano /etc/dphys-swapfile
      Находим строчку CONF_SWAPSIZE=100
      И увеличиваем число например до 1024.
      Перезапускаем службу.
      sudo /etc/init.d/dphys-swapfile stop
      sudo /etc/init.d/dphys-swapfile start
      Создаем папку opencv в домашнем каталоге и переходим в нее
      cd /home/pi
      mkdir opencv
      cd opencv
      Скачиваем архивы с исходниками с помощью утилиты wget
      wget https://github.com/opencv/opencv/archive/4.1.0.zip -O opencv_source.zip
      wget https://github.com/opencv/opencv_contrib/archive/4.1.0.zip -O opencv_contrib.zip
      Распаковываем архивы.
      unzip opencv_source.zip
      unzip opencv_contrib.zip
      И теперь можно их удалить
      rm opencv_source.zip
      rm opencv_contrib.zip
      Теперь переходим в папку opencv-4.1.0 и создаем в ней папку build
      cd opencv-4.1.0
      mkdir build
      cd build
      Настраиваем параметры сборки. Обратите внимание на путь до дополнительных модулей!
      cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_C_EXAMPLES=OFF \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv/opencv_contrib-4.1.0/modules \
      -D BUILD_EXAMPLES=ON \
      -D BUILD_DOCS=ON \
      -D ENABLE_NEON=ON ..
      Компиляция в 1 поток
      make -j1

      Компиляция в 4 потока (только если у вас хорошее охлаждение малинки)
      make -j4

      Установка библиотеки
      sudo make install

      Настройка динамического связывания
      sudo ldconfig

      Проверка работоспособности библиотеки.
      python3
      import cv2
      cv2.__version__

      В результате, библиотека должна выдать номер версии, которую вы установили.
    • By rmatveev
      Вливаюсь в среду программирования MBED OS с платой STM32F429I-DISC1 и вот что заметил:
      1) Почему-то PWM у меня нормально заработал только на ножке PF_6. Я перебрал, конечно, не все порты, которые поддерживают работу с PWM, но другие, которые я попробовал, не заработали.
      2) Пытался сконфигурировать некоторые порты в качестве цифрового выходи и тоже фигушки. Нормально заработали только те, что подключены к зеленому и красному светодиодам (PG_13 и PG_14). На некоторых ножках был какой-то неведомый мне меандр, какие-то не захотели переходить в низкоомное состояние.

      В качестве базы я использовал код DISCO-F429ZI_LCDTS_demo (это из примеров по этой плате с работой ЖК индикатора и тачскрина).

      Что может быть не так? Может быть какие-нибудь библиотеки, подключаемые при работе тачскрина и/или дисплея занимают большую часть портов и не позволяют их использовать по усмотрению программиста? Или я еще что-то не понимаю в архитектуре ARM? (Сам я прихожу из AVR-ов)
    • Guest Александр
      By Guest Александр
      Добрый день
      Проблема с оценочной платой STM32F4-DISCOVERY в части работы USART
      суть вопроса
      по USART шлется и принимается блоки данных по 3 байта (в принципе сколько угодно) при этом если подключен USB разъем ST-LINKа то все работает должным образом (данные снуют туда сюда без проблем), но при отключении USB ST-LINKа данные из платы STM32F4-DISCOVERY идут а вот принимать данные плата отказывается (естественно подаю внешнее питание +5 вольт на одноименный контакт). Если кто сталкивался с подобной проблемой прошу хотя бы направить в сторону железа или софта.
      На плате STM32F4-DISCOVERY убраны перемычки SB11(T_NRST) и SB12(T_SWO) а так же отпаян резистор R68 (MCO). Плата при этом прошивается без проблем, и стартует при внешнем питании(не от USB ST-LINKа) тоже без каких то заморочек.
      код прикладывать на данный момент не вижу смысла там все просто, при чем при подключении USB ST-LINKа программа работает.
      Проект пишется на IARe, конфигурация формируется в STM32Cube.
      Заранее спасибо за ответ
    • By admin
      Честный обзор миникомпьютера OMEGA 2. Характеристики, подключение и работа с командной строкой. Отправляем твит и компилируем свое приложение прямо на миникомпьютере.
      Ссылка на миникомпьютер: https://www.indiegogo.com/projects/omega2-5-linux-computer-with-wi-fi-made-for-iot
      Ссылка на документацию: https://docs.onion.io/omega2-docs/
      Ссылка на opkg пакеты: http://repo.onion.io/omega2/
  • Сообщения

    • После замены в САДП микросхемы К157ДА1 на другую, более раннего производства (была февраля 93 года, стала апрель 90го), ситуация устаканилась и стало всё нормально.  Ради смеха - пропишите на кассетнике трек В.Кузьмина "Симона" и послушайте результат с САДП и без (с фиксированным подмагничиванием). 
    • Стив - долго не был, мог бы и перечислить остатки и новые. Меня интересуют БП от 30 до 60 Вольт, на 3 - 4 Ампера , штуки 4 - 5 одинаковых.
    • Ардуина может и от 18650 питаться, главное гуглить научиться! вот, первая же ссылка Опять же, Ардуины разные бывают, все зависит от задач, которые она будет выполнять: может самой "слабенькой"-недорогой хватит... Чтобы аккумулятора подольше хватало, Ардуину нужно будет почаще отправлять в сон. Да, заряжать конденсатор и через него открывать. Подбирается емкость за пару минут А вообще, чтобы электромагнит замка жил подольше, то время импульса должна быть менее секунды - опять же подбирается, но уже когда замок будет установлен...  
    • Насколько я знаю, Василий перестал силовые трансы мотать.
    • Есть ещё один способ контроля (достаточно точного) привязки подвешенного к плюсу питания напряжения к общему. Нужен только один простой ОУ с rr и четыре одинаковых резистора. Оставлю решение до вечера.
    • Я не пью уже давно ничего крепкого, в отличии от тебя. Мне нельзя. Я при должности. В любой момент могут позвонить- идти, людей выручать. Не веришь мне- докажи обратное? А не сможешь доказать!  Ещё ни один человек не доказал что есть такое государство, как РФ. И не докажет никогда.
×
×
  • Create New...