From 18194afa8766adc69309bde914d4c630563075bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= <henrik.tjader@gmail.com> Date: Thu, 24 Mar 2016 21:03:15 +0100 Subject: [PATCH] Added makefile, linker script and GDB-init --- .gdbinit | 8 ++ .gitignore | 5 +- Makefile | 100 ++++++++++++++++++++++++ README.md | 2 +- stm32f4_flash.ld | 192 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 303 insertions(+), 4 deletions(-) create mode 100644 .gdbinit create mode 100644 Makefile create mode 100644 stm32f4_flash.ld diff --git a/.gdbinit b/.gdbinit new file mode 100644 index 0000000..83f2541 --- /dev/null +++ b/.gdbinit @@ -0,0 +1,8 @@ +define reload +kill +monitor jtag_reset +load +end + +target extended localhost:4242 +load diff --git a/.gitignore b/.gitignore index 910b5ec..1e5e2dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ Debug Lab4-serial.elf.launch -stm32f4_flash.ld .cproject .settings serial.elf.launch .project -kuppe.elf -kuppe.hex +*.elf +*.hex src/.main.c.swp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f0a9f58 --- /dev/null +++ b/Makefile @@ -0,0 +1,100 @@ +TARGET=stm32f4.hex +EXECUTABLE=stm32f4.elf + +CC=arm-none-eabi-gcc +LD=arm-none-eabi-ld +#LD=arm-none-eabi-gcc +AR=arm-none-eabi-ar +AS=arm-none-eabi-as +CP=arm-none-eabi-objcopy +OD=arm-none-eabi-objdump + +BIN=$(CP) -O ihex + +#DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DMANGUSTA_DISCOVERY -DUSE_USB_OTG_FS -DHSE_VALUE=8000000 +#DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F40XX -DHSE_VALUE=8000000 +DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F40XX -DSTM32F4XX -DHSE_VALUE=16000000 + +MCU = cortex-m4 +MCFLAGS = --specs=nosys.specs --specs=nano.specs -lc -lnosys -mcpu=$(MCU) -mthumb -mlittle-endian -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb-interwork -std=gnu90 -ffunction-sections -fdata-sections -g -Wall +STM32_INCLUDES = -ILibraries/CMSIS/Include/ \ + -ILibraries/STM32F4xx_StdPeriph_Driver/inc/ \ + -ILibraries/Device/STM32F4xx/Include/ \ + -Isrc/ \ +#Not using USB + #-ILibraries/STM32_USB_Device_Library/Class/hid/inc \ + #-ILibraries/STM32_USB_Device_Library/Core/inc/ \ + #-ILibraries/STM32_USB_OTG_Driver/inc/ + +# Optimize for size +#OPTIMIZE = -Os +# No optimization at all +OPTIMIZE = -O0 + +CFLAGS = $(MCFLAGS) $(OPTIMIZE) $(DEFS) -I./ -I./ $(STM32_INCLUDES) -Wl,-gc-sections,-T,stm32f4_flash.ld +AFLAGS = $(MCFLAGS) +#-mapcs-float use float regs. small increase in code size + +#STM32_USB_OTG_SRC = Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c \ +#Not using USB + #Libraries/STM32_USB_OTG_Driver/src/usb_core.c \ + #Libraries/STM32_USB_OTG_Driver/src/usb_dcd.c \ + +#Not using USB +#STM32_USB_DEVICE_SRC = + #Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c \ + #Libraries/STM32_USB_Device_Library/Core/src/usbd_core.c \ + #Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c + +SRC = src/main.c \ + src/stm32f4xx_it.c \ + src/system_stm32f4xx.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/misc.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_adc.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_can.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_crc.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_aes.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_des.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_tdes.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dac.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dcmi.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_exti.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_flash.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_fsmc.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash_md5.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash_sha1.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_iwdg.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rng.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_sdio.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_syscfg.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_tim.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c \ + Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_wwdg.c + + +STARTUP = src/startup_stm32f40xx.s + +OBJDIR = . +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) +OBJ += Startup.o + +all: $(TARGET) + +$(TARGET): $(EXECUTABLE) + $(CP) -O ihex $^ $@ + +$(EXECUTABLE): $(SRC) $(STARTUP) + $(CC) $(CFLAGS) $^ -o $@ + +clean: + rm -f Startup.lst $(TARGET) $(TARGET).lst $(OBJ) $(AUTOGEN) $(TARGET).out $(TARGET).hex $(TARGET).map $(TARGET).dmp $(TARGET).elf diff --git a/README.md b/README.md index eb0cd26..e2e9595 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Compile with regular GNU make: Modify the Makefile and linker scripts to suit your requirements. -Possibly change the memory size in stm32_linker.ld, +Possibly change the memory size in stm32_flash.ld, included libraries in the Makefile. Connect your MCU and connect st-link. diff --git a/stm32f4_flash.ld b/stm32f4_flash.ld new file mode 100644 index 0000000..7ca28c6 --- /dev/null +++ b/stm32f4_flash.ld @@ -0,0 +1,192 @@ +/* +***************************************************************************** +** +** File : stm32_flash.ld +** +** Abstract : Linker script for STM32F407VG Device with +** 1024KByte FLASH, 128KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed "as is", without any warranty +** of any kind. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of 128K RAM */ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K + /*FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K*/ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K + MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K + CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + /* MEMORY_bank1 section, code must be located here explicitly */ + /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ + .memory_b1_text : + { + *(.mb1text) /* .mb1text sections (code) */ + *(.mb1text*) /* .mb1text* sections (code) */ + *(.mb1rodata) /* read-only data (constants) */ + *(.mb1rodata*) + } >MEMORY_B1 + + /* Remove information from the standard libraries */ + /*/DISCARD/ :*/ + /*{*/ + /*libc.a ( * )*/ + /*libm.a ( * )*/ + /*libgcc.a ( * )*/ + /*}*/ + + .ARM.attributes 0 : { *(.ARM.attributes) } +} +/* Nice to have */ +__isr_vector_size__ = SIZEOF(.isr_vector); +__text_size__ = SIZEOF(.text); +__data_size__ = SIZEOF(.data); +__bss_size__ = SIZEOF(.bss); -- GitLab