C 在Debian上无IDE编程STM32F4x
这是我在这个网站上的第一个问题,我不确定我的英语 我想知道是否有一种方法可以通过USB,而不是不使用任何IDE的JTAG对NucleoSTM32F446RE进行编程 出于培训目的,我只想使用文本编辑器编程,我使用kate、Makefiles和命令行 我已找到/安装的内容: gcc arm none eabi 6-2017-q2-update 我认为,它包含了我们需要编译的所有内容,但我认为其中没有asm编译器 这里有一个C语言的代码示例,以及我不完全理解的makefiles。它似乎编译得很好,我尝试了最小的例子 以下是我使用的示例:C 在Debian上无IDE编程STM32F4x,c,makefile,arm,embedded,stm32,C,Makefile,Arm,Embedded,Stm32,这是我在这个网站上的第一个问题,我不确定我的英语 我想知道是否有一种方法可以通过USB,而不是不使用任何IDE的JTAG对NucleoSTM32F446RE进行编程 出于培训目的,我只想使用文本编辑器编程,我使用kate、Makefiles和命令行 我已找到/安装的内容: gcc arm none eabi 6-2017-q2-update 我认为,它包含了我们需要编译的所有内容,但我认为其中没有asm编译器 这里有一个C语言的代码示例,以及我不完全理解的makefiles。它似乎编译得很好,我
#ifndef __NO_SYSTEM_INIT
void SystemInit()
{}
#endif
void main()
{
for (;;);
}
下面是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
我修改它是为了设置cortex-m4而不是cortex-m0。
运行make命令后,我得到minimum.map和minimum.axf文件
但我不知道如何在设备中加载目标代码。没有最小的.o文件是正常的吗 我将这种情况称为C代码的一个最小示例,在这种情况下,无限循环不是必需的,而是受您的启发 向量
.thumb
.globl _start
_start:
.word 0x20002000
.word reset
.word done
.word done
.thumb_func
reset:
bl centry
b done
.thumb_func
done:
b done
所以,c
flash.ld
MEMORY
{
rom : ORIGIN = 0x08000000, LENGTH = 0x1000
ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
.rodata : { *(.rodata*) } > rom
.bss : { *(.bss*) } > ram
}
建造
检查
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)
将创建一个二进制文件,根据您使用的工具,该文件可用于加载程序。如果这是一个核仁板,你可以复制该文件到虚拟usb驱动器。显然,这个节目不会显示任何有趣的内容。使用openocd或其他SWD调试器软件如果您有一个核子板,您不需要任何其他硬件,您可以停止并重新启动程序,以尝试查看其运行
您可以阅读文档以查看地址以及如何对外围设备进行编程
thumb2只是thumb的扩展,您可以坚持使用传统的thumb,或者将cortex-m4或armv7m添加到命令行cpu/arch中,以尝试减少指令数量,但也可以选择较大的指令
毫无疑问,这里有一些工具,但是编写自己的程序与串行引导加载程序接口,将程序下载到设备中是相当容易的。我将这样的东西称为C代码的一个最小示例,在这种情况下,无限循环不是必需的,而是受您的启发 向量
.thumb
.globl _start
_start:
.word 0x20002000
.word reset
.word done
.word done
.thumb_func
reset:
bl centry
b done
.thumb_func
done:
b done
所以,c
flash.ld
MEMORY
{
rom : ORIGIN = 0x08000000, LENGTH = 0x1000
ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
.rodata : { *(.rodata*) } > rom
.bss : { *(.bss*) } > ram
}
建造
检查
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)
将创建一个二进制文件,根据您使用的工具,该文件可用于加载程序。如果这是一个核仁板,你可以复制该文件到虚拟usb驱动器。显然,这个节目不会显示任何有趣的内容。使用openocd或其他SWD调试器软件如果您有一个核子板,您不需要任何其他硬件,您可以停止并重新启动程序,以尝试查看其运行
您可以阅读文档以查看地址以及如何对外围设备进行编程
thumb2只是thumb的扩展,您可以坚持使用传统的thumb,或者将cortex-m4或armv7m添加到命令行cpu/arch中,以尝试减少指令数量,但也可以选择较大的指令
毫无疑问,这里有一些工具,但是编写自己的程序与串行引导加载程序接口,将程序下载到设备中是相当容易的。gcc编译到汇编程序,然后启动汇编程序来生成对象。您确实有一个汇编器。请看部件的数据表,它描述了编程SWD和串行/uart调试器的基本方法。可能是usb,我没看。如果您使用的是NucleoBoard,则只需将文件复制到虚拟thumb驱动器。SWD是一个不需要在设备上运行完整/调试程序的接口。对于那些不培训任何内容的培训目的,我建议整个工具链。IDE和eclipse一样并不重要,因为您可以仅将其用作文本编辑器,并仅使用make launcher.gcc编译为assembler,然后启动assembler生成对象。您确实有一个汇编器。请看部件的数据表,它描述了编程SWD和串行/uart调试器的基本方法。可能是usb,我没看。如果您使用的是NucleoBoard,则只需将文件复制到虚拟thumb驱动器。SWD是一个不需要在设备上运行完整/调试程序的接口。对于那些不培训任何内容的培训目的,我建议整个工具链。像eclipse这样的IDE并不重要,因为您可以将其仅用作文本编辑器,并仅用于生成启动器。哦,是的,它可以工作!谢谢!为了更好地理解它,我阅读了文档和这首短裙。我想我现在已经准备好编译自己的应用程序了。再次谢谢你是的,很有效!谢谢!为了更好地理解它,我阅读了文档和这首短裙。我想我现在已经准备好编译自己的应用程序了。再次感谢