diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..edbf738 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.6) +include(CMakeForceCompiler) +SET(CMAKE_SYSTEM_NAME "Generic") +SET(CMAKE_SYSTEM_VERSION 1) + +set(TOOLCHAIN_DIR D:/Programy/arm_gcc/bin/) + +CMAKE_FORCE_C_COMPILER(${TOOLCHAIN_DIR}/arm-none-eabi-gcc.exe GNU) +CMAKE_FORCE_CXX_COMPILER(${TOOLCHAIN_DIR}/arm-none-eabi-g++.exe GNU) + + + +project(STM32_RTTY C ASM CXX) + + +add_definitions(-DSTM32F100C8) +add_definitions(-DSTM32F10X_MD_VL) +add_definitions(-DUSE_STDPERIPH_DRIVER) +add_definitions(-D__ASSEMBLY__) + + + +SET(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/arm-gcc-link.ld) +SET(COMMON_FLAGS " -mcpu=cortex-m3 -mthumb -Wall -ffunction-sections -g -O3 -g -nostartfiles ") +SET(CMAKE_CXX_FLAGS "${COMMON_FLAGS} -std=c++11") +SET(CMAKE_C_FLAGS "${COMMON_FLAGS} -std=gnu99") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-Map=${CMAKE_BINARY_DIR}/${PROJECT_NAME}.map -O3 -Wl,--gc-sections -T ${LINKER_SCRIPT}") + +file(GLOB_RECURSE USER_SOURCES "*.c") +file(GLOB_RECURSE USER_SOURCES_CXX "*.cpp") +file(GLOB_RECURSE USER_HEADERS "*.h") +#file(GLOB_RECURSE HAL_SOURCES "stm_lib/src/*.c") + +#add_library(CMSIS +# cmsis_boot/system_stm32f10x.c +# cmsis_boot/startup/startup_stm32f10x_md_vl.c) +include_directories(cmsis + cmsis_boot + stm_lib/inc + .) + +add_executable(${PROJECT_NAME}.elf ${USER_SOURCES} ${USER_SOURCES_CXX} ${USER_HEADERS} ${HAL_SOURCES} ${LINKER_SCRIPT}) + +#target_link_libraries(${PROJECT_NAME}.elf CMSIS) + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_BINARY_DIR}/${PROJECT_NAME}.map") +set(HEX_FILE ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.hex) +set(BIN_FILE ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.bin) +add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -Oihex $ ${HEX_FILE} + COMMAND ${CMAKE_OBJCOPY} -Obinary $ ${BIN_FILE} + COMMENT "Building ${HEX_FILE} \nBuilding ${BIN_FILE}") +set(CMAKE_CXX_STANDARD 11) + +add_custom_target(program + DEPENDS ${PROJECT_NAME}.elf + COMMAND D:/Programy/stlink-1.3.0-win64/bin/st-flash --reset write ${BIN_FILE} 0x08000000 + COMMENT "flashing ${BIN_FILE}") diff --git a/arm-gcc-link.ld b/arm-gcc-link.ld new file mode 100644 index 0000000..e4b4f9a --- /dev/null +++ b/arm-gcc-link.ld @@ -0,0 +1,132 @@ +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +/* Internal Memory Map*/ +MEMORY +{ + rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x00010000 + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00002000 +} + +_eram = 0x20000000 + 0x00002000; +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_fram e*)) + } > rom + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > rom + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + __exidx_end = .; + __etext = .; + + /* _sidata is used in coide startup code */ + _sidata = __etext; + + .data : AT (__etext) + { + __data_start__ = .; + + /* _sdata is used in coide startup code */ + _sdata = __data_start__; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + /* _edata is used in coide startup code */ + _edata = __data_end__; + } > ram + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + _sbss = __bss_start__; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + _ebss = __bss_end__; + } > ram + + .heap (COPY): + { + __end__ = .; + _end = __end__; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > ram + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .co_stack (NOLOAD): + { + . = ALIGN(8); + *(.co_stack .co_stack.*) + } > ram + + /* Set stack top to end of ram , and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram ) + LENGTH(ram ); + __StackLimit = __StackTop - SIZEOF(.co_stack); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds ram limit */ + ASSERT(__StackLimit >= __HeapLimit, "region ram overflowed with stack") +} \ No newline at end of file