00在linux环境下搭建stm32开发环境

文章目录

  • 前言
  • 一、环境搭建
    • 1.arm-none-eabi-gcc
    • 2.openocd
  • 三、创建stm32标准库工程
    • 1.创建工程目录
    • 2.修改stm32_flash.ld文件
    • 3.写makefile文件
    • 4.修改core_cm3.c
    • 5.写main函数并下载到板子上
  • 最后

前言

我在那天终于说服自己将系统换成了linux系统了,当换成了linux系统后我发现,keil5这个软件实在是太香了,在linux系统下面没有keil5软件,当然我可以选择使用cubeIDE,但是我写stm32都是使用的是标准库进行编写的,要我再去学HAL库实在是太麻烦了。

然后我研究了一个星期后终于搞定这个环境了,所以我准备写一片文章来从头开始搭建stm32的环境,因为我又把ubuntu换成了kubuntu了,所以可以重头开始搭建了。

一、环境搭建

1.arm-none-eabi-gcc

这个工具是我们需要使用的编译工具,就和我们在linux中编译C语言程序一样,需要使用一个编译工具,这个工具可以编译arm芯片对应的机器码并生成hex文件,所以我们首先要安装一下这个工具。

在官网中下载适合系统的压缩包:arm-none-eabi-gcc

1.png

我这选择的是这个安装包,然后等待下载。

2.png

下载完成后就看到有这个压缩包,我们先解压一下这个压缩包:

tar -jxvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2

解压出来的文件名字太长了,我们需要给它改个名字并且放在根目录下:

mv gcc-arm-none-eabi-10.3-2021.10 ~/gcc-arm-none-eabi

3.png

然后将这个文件中的bin目录添加到环境变量中

vim ~/.zshrc

在最后一行添加:

export PATH=$PATH:/home/lavender_edgar/gcc-arm-none-eabi/bin

4.png

我这用的是zsh终端,你们如果用bash终端的话是使用:

vim ~/.bashrc

然后使用下面的命令重启一下即可:

source ~/.zshrc

如果是bash的就使用:

source ~/.bashrc

在终端中敲入arm后按下tab键就可以看到有很多的补全,这就代表着安装成功了

5.png

2.openocd

这个工具可以将hex文件通过下载器下载到单片机中,这个工具支持很多的下载工具。

首先先在官网上下载这个工具:openocd

6.png

下载完成后进行解压:

tar -jxvf openocd-0.12.0.tar.bz2

然后还是一样的移动改名

mv openocd-0.12.0 ~/openocd

在开始之前我们需要做几个步骤,首先安装libtool

sudo apt install libtool-bin

7.png

然后安装一下HIDAPI库,这个是CMSIS需要的库

sudo apt-get install libhidapi-dev

openocd/contrib中的60-openocd.rules复制一份到/etc/udev/rules.d/中,如果不进行这个操作可能下载不进去,在复制时记得加上sudo

之后安装一下libusb++-dev即可:

sudo apt-get install libusb++-dev

然后我们进入到刚才解压的目录中,执行下面的命令生成makefile文件

sudo ./configure 

如果出现下面的错误代表着你没有安装make

8.png

执行sudo apt install make就可以了,安装完成后继续执行

sudo ./configure 

然后就能生成makefile文件

10.png

然后我们使用下面命令进行编译

sudo make

然后再执行

sudo make install

这样我们就安装好了openocd了,我们可以在/usr/local/share/openocd/scripts/target看到芯片配置文件

11.png

/usr/local/share/openocd/scripts/interface可以看到下载器配置文件

12.png

但还没有结束,因为刚才我们执行sudo ./configure时出现了一个表

13.png

可以看到只有两个适合的,我们需要添加一下stlink,这样才能支持,所以我们需要执行一下

sudo ./configure --enable-stlink

我在执行的时候出现了这样一个问题

14.png

这是因为少了一个pkg-config,如果你也没有就需要使用下面的代码进行下载

sudo apt install pkg-config

然后在进行生成就会发现在stlink后是ok了

15.png

然后再进行makemake install就可以了。

三、创建stm32标准库工程

1.创建工程目录

当环境安装完成后我们就可以创建stm32标准库的工程文件了,其实创建和在keil5中是一样的,只不过有些文件需要进行一下改变。

首先到官网下载标准库文件:标准库

16.png

然后创建一个文件夹用来存放项目文件,然后就可以开始移动了,这里可以直接使用图形化界面来进行移动要简单一点,这里我的项目格式如下:

├── doc
├── lib
│   ├── CMSIS
│   │   ├── core_cm3.c
│   │   ├── core_cm3.h
│   │   ├── startup
│   │   │   ├── startup_stm32f10x_cl.s
│   │   │   ├── startup_stm32f10x_hd.s
│   │   │   ├── startup_stm32f10x_hd_vl.s
│   │   │   ├── startup_stm32f10x_ld.s
│   │   │   ├── startup_stm32f10x_ld_vl.s
│   │   │   ├── startup_stm32f10x_md.s
│   │   │   ├── startup_stm32f10x_md_vl.s
│   │   │   └── startup_stm32f10x_xl.s
│   │   ├── stm32f10x.h
│   │   ├── system_stm32f10x.c
│   │   └── system_stm32f10x.h
│   └── FWlib
│       ├── inc
│       │   ├── misc.h
│       │   ├── stm32f10x_adc.h
│       │   ├── stm32f10x_bkp.h
│       │   ├── stm32f10x_can.h
│       │   ├── stm32f10x_cec.h
│       │   ├── stm32f10x_crc.h
│       │   ├── stm32f10x_dac.h
│       │   ├── stm32f10x_dbgmcu.h
│       │   ├── stm32f10x_dma.h
│       │   ├── stm32f10x_exti.h
│       │   ├── stm32f10x_flash.h
│       │   ├── stm32f10x_fsmc.h
│       │   ├── stm32f10x_gpio.h
│       │   ├── stm32f10x_i2c.h
│       │   ├── stm32f10x_iwdg.h
│       │   ├── stm32f10x_pwr.h
│       │   ├── stm32f10x_rcc.h
│       │   ├── stm32f10x_rtc.h
│       │   ├── stm32f10x_sdio.h
│       │   ├── stm32f10x_spi.h
│       │   ├── stm32f10x_tim.h
│       │   ├── stm32f10x_usart.h
│       │   └── stm32f10x_wwdg.h
│       └── src
│           ├── misc.c
│           ├── stm32f10x_adc.c
│           ├── stm32f10x_bkp.c
│           ├── stm32f10x_can.c
│           ├── stm32f10x_cec.c
│           ├── stm32f10x_crc.c
│           ├── stm32f10x_dac.c
│           ├── stm32f10x_dbgmcu.c
│           ├── stm32f10x_dma.c
│           ├── stm32f10x_exti.c
│           ├── stm32f10x_flash.c
│           ├── stm32f10x_fsmc.c
│           ├── stm32f10x_gpio.c
│           ├── stm32f10x_i2c.c
│           ├── stm32f10x_iwdg.c
│           ├── stm32f10x_pwr.c
│           ├── stm32f10x_rcc.c
│           ├── stm32f10x_rtc.c
│           ├── stm32f10x_sdio.c
│           ├── stm32f10x_spi.c
│           ├── stm32f10x_tim.c
│           ├── stm32f10x_usart.c
│           └── stm32f10x_wwdg.c
├── makefile
├── stm32_flash.ld
└── user├── main.c├── stm32f10x_conf.h├── stm32f10x_it.c└── stm32f10x_it.h

其中最主要的文件是启动文件,这个启动文件是在这个路径中进行查找:STM32F10x_StdPeriph_Lib_V3.6.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO,你可以把他们全部拷贝,也可以只用一个。

当然一个一个的移动实在是太麻烦了,所以我写了一个sh脚本,大家可以一键移动:

#!/bin/zsh# 如果你是使用bash可以在上面改为!/bin/bashlocal=$(sudo find /home/ -name 'STM32F10x_StdPeriph_Lib_V3.6.0')
name=test1         # 这个修改为你的工程名字
start_name=startup_stm32f10x_hd.s    # 修改这个移动对应的启动文件,如果要移动全部文件可以写为*.sfile_lib=(./$name/lib ./$name/lib/CMSIS ./$name/lib/FWlib ./$name/lib/CMSIS/startup)file_user=(./$name/user)echo $local
echo $name# 创建目录
mkdir ./$name ./$name/doc
for i in ${file_lib}
domkdir $i
donefor i in ${file_user}
domkdir $i
done# 创建文件
touch ./$name/makefile
touch ./$name/user/main.c# 移动文件
cp $local/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/$start_name ./$name/lib/CMSIS/startup
cp $local/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/*.(c|h) ./$name/lib/CMSIS/
cp $local/Libraries/CMSIS/CM3/CoreSupport/* ./$name/lib/CMSIS/
cp -r $local/Libraries/STM32F10x_StdPeriph_Driver/inc ./$name/lib/FWlib
cp -r $local/Libraries/STM32F10x_StdPeriph_Driver/src ./$name/lib/FWlib
cp $local/Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h ./$name/user
cp $local/Project/STM32F10x_StdPeriph_Template/stm32f10x_it.h ./$name/user
cp $local/Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c ./$name/user
cp $local/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM3210E-EVAL_XL/stm32_flash.ld ./$name/

我很久没有写shell了,这个脚本不是很完美,大家可以感根据自己的想法进行改写。

2.修改stm32_flash.ld文件

我之前在这踩了很多次坑,所以这里需要非常的注意,我们这使用的stm32_flash.ld文件是移植STM32F103ZG芯片的,因为这个ld文件和c8t6的文件差不多,所以我们选择这个作为我们的链接脚本,但并不是移植完就可以使用的,我们还需要给它修改一下。

这个是原始的链接文件:

17.png

我们需要修改的内容其实就是在最前面就可以了。

首先我们要将_estack = 0x20018000;修改为_estack = ORIGIN(RAM) + LENGTH(RAM);,然后将

FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1M
RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 96K

修改为:

FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 64K
RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 20K

然后就可以了,修改完成的内容如下:

18.png

修改完成后我们就可以开始写makefile文件了。

3.写makefile文件

上面的脚本执行完后会生成一个makefile文件,我们直接用vim进行写入就可以了,脚本我是参考了很多文章写出来的,这里就不讲解了,直接用我写好的就可以了:

TARGET=test	# 这里是项目名,改就可以
CC=arm-none-eabi-gcc
OBJCOPY=arm-none-eabi-objcopy
RM=rm -f
CORE=3
CPUFLAGS=-mthumb -mcpu=cortex-m$(CORE)
INCFLAGS=-I $(shell pwd)/lib/CMSIS -I $(shell pwd)/lib/FWlib/inc -I $(shell pwd)/user
LDFLAGS = -T stm32_flash.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group
CFLAGS=$(INCFLAGS) -D STM32F10X_HD -D USE_STDPERIPH_DRIVER -Wall -g
START_SRC=$(shell find ./ -name 'startup_stm32f10x_hd.s')
START_OBJ=$(START_SRC:%.s=%.o)
C_SRC=$(shell find ./ -name '*.c')
C_OBJ=$(C_SRC:%.c=%.o)
INTERRFACE_CFG=/usr/local/share/openocd/scripts/interface/stlink-v2.cfg      # 这里就是下载器的配置文件,可以在前面提到的文件夹中找到对应下载器的配置文件
TARGET_CFG=/usr/local/share/openocd/scripts/target/stm32f1x.cfg 
$(TARGET):$(START_OBJ) $(C_SRC)$(CC) $^ $(CPUFLAGS) $(LDFLAGS) $(CFLAGS) -o $(TARGET).elf$(OBJCOPY) $(TARGET).elf $(TARGET).bin$(OBJCOPY) $(TARGET).elf -Oihex $(TARGET).hex
$(START_OBJ):$(START_SRC)$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) -o $@
$(C_OBJ):%.o:%.c$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) -o $@
clear:$(RM) $(shell find ./ -name '*.o') $(TARGET).*# 这个是一键下载,如果不是stlink下载器可以改对应的变量
download:openocd -f $(INTERRFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c "flash write_image erase $(PWD)/$(TARGET).bin" -c reset -c shutdown

4.修改core_cm3.c

这个文件是需要进行修改一下的,如果你不进行修改就会报错

19.png

这个错误需要你打开core_cm3.c文件,然后在第736行和753行的=r中添加一个&,这样就不会报错了

20.png

5.写main函数并下载到板子上

这一步大家应该都会吧,这里我写的main函数是点亮PB0的LED灯来进行测试

#include "stm32f10x.h"int main(){GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);while(1){GPIO_WriteBit(GPIOB, GPIO_Pin_0, 0);}return 0;
}

然后执行make,当编译完成后就可以执行make downlocal进行下载了。

编译的效果图:

21.png

下载的效果图:

22.png

实物的效果:

23.jpg

最后

使用linux对stm32的开发的环境搭建就讲完了,如果大家有其他错误出现可以发在评论区,我这随时可以回答的,大家也可以关注一下我的csdn、博客园和我自己的论坛,链接放在下面了

Lavender Edgar的博客
博客园
CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何清除keep-alive缓存

在 Vue.js 中&#xff0c;使用 <keep-alive> 组件可以将组件保留在内存中&#xff0c;以避免重复渲染和销毁&#xff0c;从而提高性能。如果需要手动清除 <keep-alive> 组件的缓存&#xff0c;可以通过两种方法来实现&#xff1a; 通过 $destroy 方法销毁组件&…

UE5.1_使用技巧(常更)

UE5.1_使用技巧&#xff08;常更&#xff09; 1. 清除所有断点 运行时忘记蓝图中的断点可能会出现运行错误的可能&#xff0c;务必运行是排除一切断点&#xff0c;逐个排查也是办法&#xff0c;但是在事件函数多的情况下会很复杂且慢节奏&#xff0c;学会一次性清除所有很有必…

JavaWeb--Mybatis

一&#xff1a;Mybatis概述 1.Mybatis概念 MyBatis 是一款优秀的 持久层框架 &#xff0c;用于简化 JDBC 开发&#xff1b; MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code&#xff0c;并且改名为 MyB…

OpenTenBase 开发环境搭建及Debug设置

最近有个 OpenTenBase开源核心贡献挑战赛 领导建议大家都去试试&#xff0c;我也去凑了下热闹&#xff0c;发现能力有限一时半会是搞不明白了&#xff0c;最多也就是能搞搞文档翻译&#xff0c;或者写点操作手册啥的。 不过不管怎么样&#xff0c;先把开发环境搭上&#xff0c;…

R语言的数据类型与数据结构:向量、列表、矩阵、数据框及操作方法

R语言的数据类型与数据结构&#xff1a;向量、列表、矩阵、数据框及操作方法 介绍向量列表矩阵数据框 介绍 R语言拥有丰富的数据类型和数据结构&#xff0c;以满足各类数据处理和分析的需求。本文将分享R语言中的数据类型&#xff0c;包括向量、列表、矩阵、数据框等&#xff…

【深度学习模型】6_3 语言模型数据集

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.3 语言模型数据集&#xff08;周杰伦专辑歌词&#xff09; 本节将介绍如何预处理一个语言模型数据集&#xff0c;并将其转换成字符级…

vue组件之间通信方式汇总

方式1&#xff1a;props和$emit props和$emit仅仅限制在父子组件中使用 1.props&#xff1a;父组件向子组件传递数据 1.1 代码展示 <template><div><!-- 这是父组件 --><div>父组件中的基本数据类型age的值是:{{this.age}}</div><div>…

giffgaff怎么充值?giffgaff怎么续费?

-性价比高&#xff1a;0月租&#xff0c;免费接收短信&#xff0c;充值一次&#xff0c;接码可以用20年以上&#xff08;仅需半年保号一次&#xff09;&#xff0c;可能是国内性价比最高的接码实体卡&#xff01;-安全&#xff1a;实体卡无须担心因号码被风控&#xff0c;还可以…

springboot+vue,上传图片,回显,以及报错404的问题

最近遇到一个问题&#xff0c;上传图片到服务器以后&#xff0c;回显不了&#xff0c;报错404&#xff1b; 历时三天终于找到解决办法&#xff1a; 1.后端代码&#xff1a; RestController RequestMapping("file") SuppressWarnings({"unchecked","…

面试经典150题【61-70】

文章目录 面试经典150题【61-70】61.旋转链表86.分隔链表104. 二叉树的最大深度100.相同的树226.翻转二叉树101.对称二叉树105.从前序与中序遍历序列构造二叉树106.从后序和中序遍历序列构造二叉树117.填充每个节点的下一个右侧节点指针II114.二叉树展开为链表 面试经典150题【…

留学|谈PS|耶鲁大学管理学院招生办执行主任谈个人PS

仅仅为了共同学习与分享 内容提要:在一篇个人自述中&#xff0c;我们要求申请人将他们的过去和未来有机地结合起来。我们把这种自传叫作“职业目标”自传。它为我们提供了确凿的信息&#xff0c;同时也可以确定申请人是否具有对自己及其职业的综合性反思能力。通常的情况是&am…

PostgreSQL 流复制

文章目录 1.流复制介绍2.异步流复制2.1.主库部署2.2.备库部署2.3.测试 3.同步复制3.1.主库部署3.2.备库部署3.3.测试 4.主备切换 开源中间件 # PostgreSQLhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/postgresql/postgres-stream/1.流复制…

Linux运维_Bash脚本_编译安装Mesa-23.3.6(OpenGL)

Linux运维_Bash脚本_编译安装Mesa-23.3.6(OpenGL) Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您可以在…

为什么main方法在Java中代表主线程?

main 方法在 Java 等编程语言中确实代表着程序的入口点&#xff0c;也就是程序开始执行的地方。当我们启动一个 Java 应用程序时&#xff0c;JVM&#xff08;Java 虚拟机&#xff09;会首先查找 main 方法&#xff0c;并从那里开始执行程序。 关于为什么 main 方法代表主线程&a…

unity学习(53)——选择角色界面--分配服务器返回的信息

好久没写客户端了&#xff0c;一上手还不太适应 1.经过测试&#xff0c;成功登陆后&#xff0c;客户端请求list_request&#xff0c;成功返回&#xff0c;如下图&#xff1a; 可见此时model第三个位置的参数是1.也成功返回了所有已注册角色的信息。 2.之前已知创建的角色信息…

141 Linux 系统编程18 ,线程,线程实现原理,ps –Lf 进程 查看

一 线程概念 什么是线程 LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下) 进程&#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的PCB&#xff0c;但没有独立的地址空间(共享) 区别&#xff1a;在于是否共…

html前端的几种加密/解密方式

HTML前端的加密解密方式有以下几种&#xff1a; 一、base64加密 Base64编码&#xff1a;Base64是一种将二进制数据转换为可打印字符的编码方式。在前端&#xff0c;可以使用JavaScript的btoa()函数进行Base64编码&#xff0c;使用atob()函数进行解码。 var str "hello…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数&#xff0c;例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数&#xff0c;在小程序端的时候测试并无问题&#xff0c;但是发行到H5时首页加载会造成参数获取…

掌握mysql,看完这篇文章就够了

1.mysql 学习数据库就是学习数据库管理系统&#xff08;一个数据管理系统可以管理多个数据库&#xff09; 安装 安装版本&#xff1a;mysql -installter -community-5.7.41.0.msl 流程 1.custom自定义安装 2.选择安装MySQl Server 5.7.41 - x64 3.默…

c++ 常用新特性总结【c++11】,【c++14】,【c++17】,【c++20】

文章目录 常用的c11新特性1.自动推导类型(auto)2.lambda表达式3.智能指针4.范围for循环5.右值引用 - 移动语义6.类型别名7.constexpr8.static_assert(静态断言)9.nullptr10.列表初始化11.继承构造函数12.显示虚函数重载(override)13.final14.变长模板参数15.新的容器与算法16.强…