构建项目需要以下步骤:
安装gcc arm none eabi工具链
它可能是
found on Launchpad
或位于
ARM
下载Linux安装tarball、extract和
add the /bin folder in the extracted folder to the PATH environment variable
。
2、安装配套软件包
从您的发行版中安装CMake、构建基本libusb-1.0.0-dev CMake、stlink和OpenOCD。
3、为工具链创建CMake文件
对于STM32F412 MPU,我将我的放在下面:
include(CMakeForceCompiler)
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(COMMON_FLAGS "-march=armv7e-m -mtune=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb -mthumb-interwork -Og -ffunction-sections -fdata-sections -fno-move-loop-invariants")
set(LINKER_SCRIPTS "-T ${CMAKE_SOURCE_DIR}/ldscripts/STM32F412RG.ld -T ${CMAKE_SOURCE_DIR}/ldscripts/sections.ld -T ${CMAKE_SOURCE_DIR}/ldscripts/libs.ld")
set(CMAKE_CXX_FLAGS "${COMMON_FLAGS} -std=c++11" CACHE INTERNAL "")
set(CMAKE_C_FLAGS "${COMMON_FLAGS} -std=gnu99" CACHE INTERNAL "")
set(CMAKE_ASM_FLAGS "${COMMON_FLAGS}" CACHE INTERNAL "")
set(CMAKE_EXE_LINKER_FLAGS "-W -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -nostartfiles --specs=nosys.specs -ffunction-sections -fdata-sections -fno-move-loop-invariants ${LINKER_SCRIPTS}" CACHE INTERNAL "")
include_directories(BEFORE SYSTEM "/usr/lib/arm-none-eabi/include/")
list(APPEND TOOLCHAIN_EXTRA_LIBDIR
"/usr/lib/arm-none-eabi/lib/armv7e-m/fpu"
)
link_directories(${TOOLCHAIN_EXTRA_LIBDIR})
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)
4、添加/复制链接器脚本
4.1节。ld公司
__stack = ORIGIN(RAM) + LENGTH(RAM);
_estack = __stack;
__Main_Stack_Size = 1024 ;
PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ;
__Main_Stack_Limit = __stack - __Main_Stack_Size ;
PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ;
_Minimum_Stack_Size = 256 ;
PROVIDE ( _Heap_Begin = _end_noinit ) ;
PROVIDE ( _Heap_Limit = __stack - __Main_Stack_Size ) ;
ENTRY(_start)
SECTIONS
{
.isr_vector : ALIGN(4)
{
FILL(0xFF)
__vectors_start = ABSOLUTE(.) ;
__vectors_start__ = ABSOLUTE(.) ;
KEEP(*(.isr_vector))
KEEP(*(.cfmconfig))
*(.after_vectors .after_vectors.*)
__vectors_end = ABSOLUTE(.) ;
} >FLASH
.inits : ALIGN(4)
{
__data_regions_array_start = .;
LONG(LOADADDR(.data));
LONG(ADDR(.data));
LONG(ADDR(.data)+SIZEOF(.data));
LONG(LOADADDR(.data_CCMRAM));
LONG(ADDR(.data_CCMRAM));
LONG(ADDR(.data_CCMRAM)+SIZEOF(.data_CCMRAM));
__data_regions_array_end = .;
__bss_regions_array_start = .;
LONG(ADDR(.bss));
LONG(ADDR(.bss)+SIZEOF(.bss));
LONG(ADDR(.bss_CCMRAM));
LONG(ADDR(.bss_CCMRAM)+SIZEOF(.bss_CCMRAM));
__bss_regions_array_end = .;
KEEP(*(.init))
KEEP(*(.fini))
. = ALIGN(4);
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array_sysinit .preinit_array_sysinit.*))
KEEP(*(.preinit_array_platform .preinit_array_platform.*))
KEEP(*(.preinit_array .preinit_array.*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH
.flashtext : ALIGN(4)
{
*(.flashtext .flashtext.*)
} >FLASH
.text : ALIGN(4)
{
*(.text .text.*)
*(.rodata .rodata.* .constdata .constdata.*)
*(vtable)
KEEP(*(.eh_frame*))
*(.glue_7)
*(.glue_7t)
} >FLASH
.ARM.extab : ALIGN(4)
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
. = ALIGN(4);
__exidx_start = .;
.ARM.exidx : ALIGN(4)
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > FLASH
__exidx_end = .;
. = ALIGN(4);
_etext = .;
__etext = .;
.data_CCMRAM : ALIGN(4)
{
FILL(0xFF)
*(.data.CCMRAM .data.CCMRAM.*)
. = ALIGN(4) ;
} > CCMRAM AT>FLASH
_sidata = LOADADDR(.data);
.data : ALIGN(4)
{
FILL(0xFF)
_sdata = . ;
__data_start__ = . ;
*(.data_begin .data_begin.*)
*(.data .data.*)
*(.data_end .data_end.*)
. = ALIGN(4);
_edata = . ;
__data_end__ = . ;
} >RAM AT>FLASH
.bss_CCMRAM (NOLOAD) : ALIGN(4)
{
*(.bss.CCMRAM .bss.CCMRAM.*)
} > CCMRAM
.bss (NOLOAD) : ALIGN(4)
{
__bss_start__ = .;
_sbss = .;
*(.bss_begin .bss_begin.*)
*(.bss .bss.*)
*(COMMON)
*(.bss_end .bss_end.*)
. = ALIGN(4);
__bss_end__ = .;
_ebss = . ;
} >RAM
.noinit_CCMRAM (NOLOAD) : ALIGN(4)
{
*(.noinit.CCMRAM .noinit.CCMRAM.*)
} > CCMRAM
.noinit (NOLOAD) : ALIGN(4)
{
_noinit = .;
*(.noinit .noinit.*)
. = ALIGN(4) ;
_end_noinit = .;
} > RAM
PROVIDE ( end = _end_noinit );
PROVIDE ( _end = _end_noinit );
PROVIDE ( __end = _end_noinit );
PROVIDE ( __end__ = _end_noinit );
._check_stack : ALIGN(4)
{
. = . + _Minimum_Stack_Size ;
} >RAM
.b1text : ALIGN(4)
{
*(.b1text)
*(.b1rodata)
*(.b1rodata.*)
} >FLASHB1
.eb0text : ALIGN(4)
{
*(.eb0text)
*(.eb0rodata)
*(.eb0rodata.*)
} >EXTMEMB0
.eb1text : ALIGN(4)
{
*(.eb1text)
*(.eb1rodata)
*(.eb1rodata.*)
} >EXTMEMB1
.eb2text : ALIGN(4)
{
*(.eb2text)
*(.eb2rodata)
*(.eb2rodata.*)
} >EXTMEMB2
.eb3text : ALIGN(4)
{
*(.eb3text)
*(.eb3rodata)
*(.eb3rodata.*)
} >EXTMEMB3
.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) }
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.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) }
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
__stack_end__ = _estack;
__RAM_segment_end__ = __stack ;
__vectors_load_start__ = __vectors_start;
__vectors_load_end__ = __vectors_end;
_start = main;
4.2图书馆。ld公司
4.3 STM32F412RG。ld公司
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 0K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
MEMORY_ARRAY (xrw) : ORIGIN = 0x20002000, LENGTH = 32
}
5、说明书
-
创建CMake项目-此示例取自引导加载程序
cmake_minimum_required(VERSION 3.10)
set(BL "BOOTLOADER")
set(${BL}_VERSION_MAJOR 1)
set(${BL}_VERSION_MINOR 4)
set(${BL}_VERSION_REVISION 1)
set(${BL}_SOVERSION 1)
list(APPEND ${BL}_DEFINES
USE_HAL_DRIVER
STM32F412Rx
)
set(LINKER_FLAGS_BL "-Xlinker -Map=bl.map -Ttext 0x08020000")
list(APPEND ${BL}_inc
${CMAKE_CURRENT_SOURCE_DIR}/inc/
${CMAKE_CURRENT_SOURCE_DIR}/drivers/CMSIS/Include
${CMAKE_CURRENT_SOURCE_DIR}/drivers/CMSIS/Device/ST/STM32F4xx/Include
${CMAKE_CURRENT_SOURCE_DIR}/drivers/STM32F4xx_HAL_Driver/Inc
${CMAKE_CURRENT_SOURCE_DIR}/drivers/STM32F4xx_HAL_Driver/Inc/Legacy
${CMAKE_CURRENT_SOURCE_DIR}/middlewares/ST/STM32_USB_Device_Library/Core/Inc
${CMAKE_CURRENT_SOURCE_DIR}/middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc
${CMAKE_CURRENT_SOURCE_DIR}/application/rtfw/Inc
${CMAKE_CURRENT_SOURCE_DIR}/../shared/inc
${CMAKE_CURRENT_SOURCE_DIR}/../3rdParty/include
${CMAKE_BINARY_DIR}/generated/
)
list(APPEND ${BL}_sources
${CMAKE_CURRENT_SOURCE_DIR}/../shared/src/stm32_startup.s
${CMAKE_CURRENT_SOURCE_DIR}/src/system_stm32f4xx.c
${CMAKE_CURRENT_SOURCE_DIR}/drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c
${CMAKE_CURRENT_SOURCE_DIR}/drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c
${CMAKE_CURRENT_SOURCE_DIR}/drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c
${CMAKE_CURRENT_SOURCE_DIR}/drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
)
list(APPEND ${BL}_libDirs
)
list(APPEND ${BL}_libs
)
include_directories(${${BL}_inc})
link_directories(${${BL}_libDirs})
add_executable(${BL}
${${BL}_sources}
${TOOLCHAIN_EXTRA_OBJECTS}
)
target_compile_definitions(${BL} PRIVATE ${${BL}_DEFINES})
target_link_libraries(${BL} PRIVATE ${${BL}_libs})
set_target_properties(${BL} PROPERTIES
LINK_FLAGS "${LINKER_FLAGS_BL}"
OUTPUT_NAME "${BL}_${GIT_COMMIT_TAG}_${GIT_COMMIT_HASH}"
VERSION "${${BL}_VERSION_MAJOR}.${${BL}_VERSION_MINOR}.${${BL}_VERSION_REVISION}"
SOVERSION "${${BL}_SOVERSION}"
SUFFIX ".elf"
)
-
通过对象复制从ELF文件创建bin/文件
-
连接您的程序员(p.e。
ST-LINK
)
-
使用如下配置打开OpenOCD
echo "use the st link v2 cfg"
source [find interface/stlink-v2.cfg]
transport select hla_swd
echo "set target to stm32f4x"
source [find target/stm32f4x.cfg]
reset_config srst_only
$_TARGETNAME configure -event gdb-attach {
echo "Debugger attaching: halting execution"
reset halt
gdb_breakpoint_override hard
}
$_TARGETNAME configure -event gdb-detach {
echo "Debugger detaching: resuming execution"
resume
}
-
快乐猎虫