在Debian上使用IDE编程STM32F4x

Buz*_*age 1 c embedded arm makefile stm32

这是我在这个网站上的第一个问题,我不确定我的英文..

我想知道是否有办法在不使用任何IDE的情况下对Nucleo STM32F446RE进行编程(通过USB,而不是通过JTAG).

出于培训目的,我想只使用文本编辑器(我使用kate),Makefile和命令行进行编程.

我已经找到/安装的内容:

  • gcc-arm-none-eabi(6-2017-q2-update)

它包含,我认为,我们需要编译所有(但我不认为那里有asm编译器).

在C和makefile中有代码示例(我不完全理解).它似乎编译得很好(我尝试了"最小"的例子).

这是我使用的示例:

#ifndef __NO_SYSTEM_INIT
void SystemInit()
{}
#endif

void main()
{
    for (;;);
}
Run Code Online (Sandbox Code Playgroud)

这是Makefile:

# Selecting Core
CORTEX_M=4

# Use newlib-nano. To disable it, specify USE_NANO=
USE_NANO=--specs=nano.specs

# Use seimhosting or not
USE_SEMIHOST=--specs=rdimon.specs
USE_NOHOST=--specs=nosys.specs

CORE=CM$(CORTEX_M)
BASE=../..

# Compiler & Linker
CC=arm-none-eabi-gcc
CXX=arm-none-eabi-g++

# Options for specific architecture
ARCH_FLAGS=-mthumb -mcpu=cortex-m$(CORTEX_M)

# Startup code
STARTUP=$(BASE)/startup/startup_ARM$(CORE).S

# -Os -flto -ffunction-sections -fdata-sections to compile for code size
CFLAGS=$(ARCH_FLAGS) $(STARTUP_DEFS) -Os -flto -ffunction-sections -fdata-sections
CXXFLAGS=$(CFLAGS)

# Link for code size
GC=-Wl,--gc-sections

# Create map file
MAP=-Wl,-Map=$(NAME).map

NAME=minimum
STARTUP_DEFS=-D__STARTUP_CLEAR_BSS -D__START=main

LDSCRIPTS=-L. -L$(BASE)/ldscripts -T nokeep.ld
LFLAGS=$(USE_NANO) $(USE_NOHOST) $(LDSCRIPTS) $(GC) $(MAP)

$(NAME)-$(CORE).axf: $(NAME).c $(STARTUP)
    $(CC) $^ $(CFLAGS) $(LFLAGS) -o $@

clean: 
    rm -f $(NAME)*.axf *.map *.o
Run Code Online (Sandbox Code Playgroud)

我修改它以设置cortex-m4而不是cortex-m0.运行后,make命令我得到minimum.mapminimum.axf文件.

但我不知道如何在设备中加载目标代码.(没有minimum.o文件是正常的吗?)

old*_*mer 5

我会用C代码称这样的东西为最小例子,在这种情况下无限循环不是必需的,但是受到你的启发.

vectors.s

.thumb

.globl _start
_start:
    .word 0x20002000
    .word reset
    .word done
    .word done

.thumb_func
reset:
    bl centry
    b done
.thumb_func
done:
    b done
Run Code Online (Sandbox Code Playgroud)

so.c

void centry ( void )
{
    for(;;) continue;
}
Run Code Online (Sandbox Code Playgroud)

flash.ld

MEMORY
{
    rom : ORIGIN = 0x08000000, LENGTH = 0x1000
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}
SECTIONS
{
    .text : { *(.text*) } > rom
    .rodata : { *(.rodata*) } > rom
    .bss : { *(.bss*) } > ram
}
Run Code Online (Sandbox Code Playgroud)

建立

arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-gcc -O2 -c -mthumb so.c -o so.o
arm-none-eabi-ld -T flash.ld vectors.o so.o -o so.elf
arm-none-eabi-objdump -D so.elf > so.list
Run Code Online (Sandbox Code Playgroud)

检查

08000000 <_start>:
 8000000:   20002000    andcs   r2, r0, r0
 8000004:   08000011    stmdaeq r0, {r0, r4}
 8000008:   08000017    stmdaeq r0, {r0, r1, r2, r4}
 800000c:   08000017    stmdaeq r0, {r0, r1, r2, r4}

08000010 <reset>:
 8000010:   f000 f802   bl  8000018 <centry>
 8000014:   e7ff        b.n 8000016 <done>

08000016 <done>:
 8000016:   e7fe        b.n 8000016 <done>

08000018 <centry>:
 8000018:   e7fe        b.n 8000018 <centry>
 800001a:   46c0        nop         ; (mov r8, r8)
Run Code Online (Sandbox Code Playgroud)

可能不需要但是阅读文档,人们使用0x08000000,技术上它是0x00000000,stm32系列将0x08000000映射到0x00000000,如基于引导引脚的文档中所述.检查需要显示向量表是第一件事,你告诉工具链这些是向量表中的拇指地址(设置为lsbit).可以将向量表中的C入口函数(main()不是必需的,这只是一个约定)作为重置函数.我没有.data和.bss初始化,所以像这样的东西不允许使用.data也不假设.bss变量为零,必须在你读之前写.向引导程序(和链接程序脚本)添加更多代码将允许这样做.

arm-none-eabi-objcopy so.elf -O binary so.bin
Run Code Online (Sandbox Code Playgroud)

将创建一个二进制文件,根据您使用的工具可能会用于加载程序.如果这是核板,您可以将该文件复制到虚拟USB驱动器.很明显,这个程序不会显示任何有趣的东西.使用openocd或其他SWD调试器软件(如果你有一个核板,你不需要任何其他硬件),你可以停止并重新启动程序,试图看它运行.

您可以阅读文档以查看地址以及如何对外围设备进行编程.

thumb2只是拇指的扩展,您可以坚持使用传统的拇指或将cortex-m4或armv7m添加到命令行(cpu/arch)以尝试减少指令数量,但需要权衡更大的指令.

毫无疑问,那里有工具,但编写自己的程序与串行引导加载程序接口以将程序下载到设备中相当容易.