STM32在Linux系统下的开发方案

发布者:自由思考最新更新时间:2025-10-29 来源: bilibili关键字:STM32  Linux系统  开发方案 手机看文章 扫描二维码
随时随地手机看文章

在Windows下,所需软件为MDK-ARM和STLINK驱动;在Linux下,则是开源stlink工具和ARM-GCC工具链,以及VSCode。


cut-off

以Kubuntu为例:


安装ARM-GCC工具链:


sudo apt install gcc-arm-none-eabi

安装VSCode:


选择deb安装包,下载并安装

https://code.visualstudio.com/


安装ST-Link工具:


选择最新版本,下载deb安装包并安装

https://github.com/stlink-org/stlink


安装完成后,由于快捷方式文件配置信息有错误,不能启动,需要手动修改,在/usr/share/applications打开终端:


kate stlink-gui.desktop

修改为以下内容,并保存:


[Desktop Entry]

Name=stlink

GenericName=Stlink Tools

Comment=Open source STM32 MCU programming toolset

Exec=stlink-gui

Path=/usr/share/stlink

Icon=stlink-gui

Terminal=false

Type=Application

Categories=Development;Electronics;

这次再点击stlink图标,发现可以启动了:

接下来是创建工程,以正点原子阿波罗STM32F429开发板为例:


mkdir arch arch/CMSIS bsp module src

touch Makefile stm32_flash.ld stm32_sram.ld

Makefile:


根据需要,修改ld文件和float_abi(soft/softfp/hard),文件位置


#-------------------------------------------------------------------------------

# File      : Makefile

# This file is compiling ARM Cortex-M project.

#

# Change Logs:

# Date           Author       Notes

# 2021-08-04     LinuxLife    the first version

#-------------------------------------------------------------------------------





#---------------------------------------

# Compile option

#---------------------------------------

toolchain   := arm-none-eabi-

target      := stm32f429


CC      := $(toolchain)gcc

AS      := $(toolchain)as

LD      := $(toolchain)ld

OBJCOPY := $(toolchain)objcopy

OBJDUMP := $(toolchain)objdump

SIZE    := $(toolchain)size


archive     := cortex-m4

float_abi   := soft

fpu         := vfpv4


CC_CONFIG   := -mcpu=$(archive) -mthumb -mfpu=$(fpu) -mfloat-abi=$(float_abi) -O0 -Ic -Igcc -ffunction-sections -fdata-sections

AS_CONFIG   := -mcpu=$(archive) -mthumb -mfpu=$(fpu) -mfloat-abi=$(float_abi) -W -mimplicit-it=thumb

LD_CONFIG   := -T stm32_flash.ld --gc-sections



#---------------------------------------

# source path

#---------------------------------------

INCDIRS :=  arch

arch/CMSIS

bsp

            module/STM32F4xx_StdPeriph_Driver

module/STM32F4xx_StdPeriph_Driver/inc

src


SRCDIRS :=  arch

arch/CMSIS

bsp

module/STM32F4xx_StdPeriph_Driver/src

src


LIBDIRS :=



#---------------------------------------

# get source file

#---------------------------------------

INCLUDE := $(patsubst %, -I %, $(INCDIRS))


# get file

SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.s))

ASMFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.asm))

CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

LIBFILES := $(foreach dir, $(LIBDIRS), $(wildcard $(dir)/*.a))


# get file path

SFILENDIR := $(notdir  $(SFILES))

ASMFILENDIR := $(notdir  $(ASMFILES))

CFILENDIR := $(notdir  $(CFILES))

LIBFILENDIR := $(notdir  $(LIBFILES))


# get object file

SOBJS := $(patsubst %, %, $(SFILENDIR:.s=.o))

ASMOBJS := $(patsubst %, %, $(ASMFILENDIR:.asm=.o))

COBJS := $(patsubst %, %, $(CFILENDIR:.c=.o))

OBJS := $(SOBJS) $(COBJS) $(ASMOBJS)


VPATH := $(SRCDIRS)


.PHONY: clean



#---------------------------------------

# start compiling

#---------------------------------------

$(target).bin : $(OBJS)

$(LD) $(LD_CONFIG) -o $(target).elf $^ $(LIBFILES)


$(OBJCOPY) -O binary -S $(target).elf $@

$(OBJDUMP) -D -m armv7 $(target).elf > $(target).dis


$(SIZE) -d $(target).elf


$(SOBJS) : %.o : %.s

$(AS) $(AS_CONFIG) -o $@ $<


$(ASMOBJS) : %.o : %.asm

$(AS) $(AS_CONFIG) -o $@ $<


$(COBJS) : %.o : %.c

$(CC) $(CC_CONFIG) $(INCLUDE) -c -o $@ $<



#---------------------------------------

# clean object file

#---------------------------------------

clean:

rm *.elf *.dis *.bin *.o

ROM和RAM链接文件,使程序分别在两种存储中运行,前者用于正式产品中,后者用于调试,延长flash使用寿命,根据需要修改地址和容量即可,同时编译时可以检测程序是否过大:


/*

 * file       :stm32_flash.ld

 *

 * abstract   :Linker script for STM32 Device

 *             Set heap size, stack size and stack location according to

 *             application requirements.

 *             Set memory bank area and size if external memory is used.

 *

 * environment:arm-none-eabi-

 */


/* Entry Point */

ENTRY(Reset_Handler)


/* Highest address of the user mode stack */

_estack = 0x2001C000;    /* end of 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 = 0x800; /* required amount of stack */


/* Specify the memory areas */

MEMORY

{

  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K

  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 192K

  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K

}


/* 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) */

    *(.rodata)         /* .rodata sections (constants, strings, etc.) */

    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */

    *(.glue_7)         /* glue arm to thumb code */

    *(.glue_7t)        /* glue thumb to arm code */


    KEEP (*(.init))

    KEEP (*(.fini))


    . = ALIGN(4);

    _etext = .;        /* define a global symbols at end of code */

  } >FLASH



   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH

    .ARM : {

    __exidx_start = .;

      *(.ARM.exidx*)

      __exidx_end = .;

    } >FLASH


  .ARM.attributes : { *(.ARM.attributes) } > FLASH


  /* used by the startup to initialize data */

  _sidata = .;


  /* Initialized data sections goes into RAM, load LMA copy after code */

  .data : AT ( _sidata )

  {

    . = 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


  /* 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


  PROVIDE ( end = _ebss );

  PROVIDE ( _end = _ebss );


  /* User_heap_stack section, used to check that there is enough RAM left */

  ._user_heap_stack :

  {

    . = ALIGN(4);

    . = . + _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/ :

  {


  }

}



/*

 * file       :stm32_sram.ld

 *

 * abstract   :Linker script for STM32 Device

 *             Set heap size, stack size and stack location according to

 *             application requirements.

 *             Set memory bank area and size if external memory is used.

 *

 * environment:arm-none-eabi-

 */


/* Entry Point */

ENTRY(Reset_Handler)


/* Highest address of the user mode stack */

_estack = 0x2001C000;    /* end of RAM */


/* Generate a link error if heap and stack don't fit into RAM */

_Min_Heap_Size = 0x1000;      /* required amount of heap  */

_Min_Stack_Size = 0x1000; /* required amount of stack */


/* Specify the memory areas */

MEMORY

{

  FLASH (rx)      : ORIGIN = 0x20000000, LENGTH = 64K

  RAM (xrw)       : ORIGIN = 0x20010000, LENGTH = 48K

  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K

}

/* 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) */

[1] [2]
关键字:STM32  Linux系统  开发方案 引用地址:STM32在Linux系统下的开发方案

上一篇:STM32CubeIDE软件下载安装、汉化、主题修改、固件下载地址设置
下一篇:STM32 嵌入式编程:一步一步走向成功

推荐阅读最新更新时间:2026-03-23 19:45

基于stm32/linux系统的can总线的电机与485的全方位机器人通讯
之前做的是仿pioneer3at的机器人,做过两个版本,第一版完全仿的,国内机械加工,很多厂不愿意加工这种小活,加工出来的精度不够,很多问题 第二版做出来的问题是带传动,当负载过大时,会产生跳齿等问题,自己画图生产,当时也没认真做效果只能说一般电机使用的是富兴公司的伺服电机 第三版由4个转向电机4个轮毂电机及4个编码器组成 在linux控制电机程序为:https://download.csdn.net/download/jankin_by/10342919 调试最后总出现编码器CRC校验错误,怀疑为linux下多串口通信的问题 改为用单片机直接控制 https://download.csdn.net/
[单片机]
基于<font color='red'>stm32</font>/<font color='red'>linux系统</font>的can总线的电机与485的全方位机器人通讯
快速推进电源解决方案开发过程,STM32数字电源生态系统问市
意法半导体推出了基于网站的数字电源开发生态系统,帮助设计人员用STM32微控制器(MCU)开发数字电源解决方案。 数字电源是能够优化能源效率并通过捕获丰富的数据来实现诊断和安全保护功能的新一类设备,设计人员可以通过数字控制提高功率密度,缩减产品尺寸,降低重量,这对于数据中心、5G基础设施、智能照明和移动设备至关重要。 STM32 D-Power网站 整合了开发数字电源所需的全部资源,包括STM32 Discovery Kit多合一数字电源开发套件、嵌入式软件组件、ST授权合作伙伴Biricha Digital开发的软件工具,演示各种设计和功率值的专用电源板,以及适合从初学者到专业电源设计人员的各种水平开发者的技术文档、视频
[单片机]
快速推进电源解决<font color='red'>方案</font><font color='red'>开发</font>过程,<font color='red'>STM32</font>数字电源生态系统问市
迅为IMX6ull开发Linux系统EC20 4G模块移植
1.4G网络连接 对于嵌入式Linux而言,4G网络连接是一个比较容易实现的功能,大多数的4G模块接口都是MiniPCIE接口,但是深入了解一下就会发现,4G模块的通信接口都是USB,所以4G模块的驱动就是USB驱动,只要USB驱动正常,4G模块在硬件上就能正常通信。下面看一下4G模块的硬件原理图: 在原理图中,U25是4G模块的MiniPCIE接口,然后通信引脚会接到U15的HUB芯片上,所以4G模块会被识别成USB设备,CON5是SIM卡接口,在使用4G模块时,需要先插入SIM卡。在i.MX6UL终结者开发板上使用的EC20 4G模块,如图 2. EC20 4G模块配置 2.1. 添加USB设备信息 要使用EC20 4G
[单片机]
迅为IMX6ull<font color='red'>开发</font>板<font color='red'>Linux系统</font>EC20 4G模块移植
【MINI2440】linux系统下载全流程
一、首先,需要下载BOOT到NOR FLASH 官方资料给出两种硬件下载方式。JTAG串口下载 和 LPT并口下载。 时代发展至今,笔记本已经不支持并口了。导致软件H-JTAG的LPT下载功能不能正常使用。 使用JTAG方式下载boot程序到开发板的NOR FLASH中。 学习视频 https://www.bilibili.com/video/BV17h411o7TK?p=17&spm_id_from=pageDriver 准备好boot文件 开发板是友善之臂的,bootloader使用他们提供的supervivi文件。提供了两个文件,选择128M的进行下载(我是64M的板子,也下载128M的vivi文件)。为了让下载工具识别
[单片机]
【MINI2440】<font color='red'>linux系统</font>下载全流程
4412开发Linux系统编程实战-字符设备控制
在 linux 驱动中字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序。 即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的。 另外,关于驱动部分,迅为电子有专门的驱动实验教程提供给大家学习,大家有了这些基础之后再去学习底层的知识就会很容易了。 在使用手册的第八章,大家可以看到这些 c 程序也是可以在 Android 下面运行的,只不过没有图形界面。 硬件工具 4412开发板PC 机;U 盘或者 TF 卡 软件工具 Ubuntu12.04.2 以及虚拟机;Arm-
[单片机]
4412<font color='red'>开发</font>板<font color='red'>Linux系统</font>编程实战-字符设备控制
tiny4412学习(一)之从零搭建linux系统
硬件平台:tiny4412 系统:linux-3.5-20151029 文件系统:busybox-1.22.1.tar.bz2 编译器: arm-linux-gcc-4.5.1 目的: 使用uboot引导 Linux 系统,并挂接根文件系统,搭建起 linux 开发环境。 由于友善支臂提供的minitools不是开源,使用起来很不舒服。本文将记录从零使用uboot在tiny4412上搭建linux系统的。由于之前只是学了2440,完成这个流程也遇到各种,现在总结如下。其中参考了多篇博客才得以实现,具体涉及的时候会给出链接。 一、准备系统文件 1、安装交叉编译工具链 (1)解压编译器源码 tar arm
[单片机]
tiny4412学习(一)之从零搭建<font color='red'>linux系统</font>
iTOP-4412开发Linux系统下使用wifi模块配置
精英版在 linux 下使用 wifi,需要进行下面的配置: 首先用户在拿到光盘资料以后查看下光盘里面的“linux”- ”root_xxxxxxxx.tar.gz”文件,其中的“xxxxxxxx” 代表linux系统的版本日期, 迅为提供的支持linux下wifi的系统版本是 “root_20150422.tar.gz” ,也就是 2015-04-22 以后的版本(括 20150422)是支持 wifi 模块的。 插上 wifi 模块,启动开发板进到 uboot 命令行,使用 fastboot 烧写光盘提供的支持 wiif 模块的 linux镜像到开发板上,烧写完成后重启开发板进入到 linux 文件系统,如下图:
[单片机]
iTOP-4412<font color='red'>开发</font>板<font color='red'>Linux系统</font>下使用wifi模块配置
linux系统之arm架构的CPU与Cache
【摘要】 【写作原因】 【问题构造】 【分析一】总体流程 【分析二】get_free_pages与mmap 【分析三】CPU与TLB 【分析四】cpu与L1cache 【分析五】cpu与L2cache 【总结】 注意:请使用谷歌浏览器阅读(IE浏览器排版混乱) 【摘要】 无论是arm还是powerpc、mips、x86等,提高memory的访问速度都是cpu提高自身性能的重要手段,cache由此而来;无论是Linux还是windows操作系统,充分利用cpu特性,提高系统性能都是不错选择,就像进程上下文切换中页表的切换是linux对MMU的完美利用。性能是软件永恒的主题,了解MMU对软件
[单片机]
<font color='red'>linux系统</font>之arm架构的CPU与Cache
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved