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,一经查实,立即删除!

相关文章

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

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

JavaWeb--Mybatis

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

OpenTenBase 开发环境搭建及Debug设置

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

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

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

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;还可以…

面试经典150题【61-70】

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

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.流复制…

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时首页加载会造成参数获取…

内容管理平台原来这么好用,优秀企业必备

内容管理平台是企业的强有力支持者&#xff0c;它可以使企业对旗下的各种网站、应用和其他数字内容进行集中管理&#xff0c;有效提高工作效率。对于企业的运营、市场推广和客户服务等各方面都有着重要的影响。今天&#xff0c;我们就来推荐三款值得尝试的内容管理平台。 首先…

论文的引用书写方法

前置操作 1、全选文献 2、在开始选项卡 段落功能区 选择编号功能 3、设置编号格式 [1] 论文的引用 1、光标放在需要引用论文的地方 2、选择引用选项卡 点击交叉引用 3、引用类型为编号项 引用内容为段落编号 选择需要的第几条参考文献

备战蓝桥杯---动态规划的一些思想2

话不多说&#xff0c;直接看题&#xff1a; 1.换根DP&#xff1a; 我们肯定不能对每一个根节点暴力求&#xff0c;我们不妨先求f[1]&#xff0c;我们发现当他的儿子作为根节点时深度和为f[1](n-cnt[i])-cnt[i](cnt[i]表示以i为根的节点数&#xff09;&#xff0c;这样子两遍DFS…

论文阅读:Diffusion Model-Based Image Editing: A Survey

Diffusion Model-Based Image Editing: A Survey 论文链接 GitHub仓库 摘要 这篇文章是一篇基于扩散模型&#xff08;Diffusion Model&#xff09;的图片编辑&#xff08;image editing&#xff09;方法综述。作者从多个方面对当前的方法进行分类和分析&#xff0c;包括学习…

微信小程序-可以用区域

简介 movable-view和movable-area是可移动的视图容器&#xff0c;在页面中可以拖拽滑动。 本篇文章将会通过该容器实现一个常用的拖拽按钮功能。 使用效果 代码实现 side-view.wtml 布局见下面代码&#xff0c;left view为内容区域&#xff0c;right view为操作按钮&a…

【初中up主分享】自己动手,丰衣足食!看我打造的下载利器!

代码如下&#xff1a; import os.path import tkinter as tk import tkinter.ttk as ttk import tkinter.filedialog as tf import pytube from urllib.error import URLError import tkinter.messagebox as tm import requests import io from PIL import ImageTk, Image imp…

软件测试自学和报班学习的区别,各有各的优势和缺点,大家看完之后自己选择喔

时代在进步&#xff0c;人们汲取知识的方式不再是单一的在书本上面&#xff0c;现在网络发达&#xff0c;只需要上网就能找到相关的好多知识&#xff0c;慢慢的大家越来越觉得有了这些知识&#xff0c;只要自己有自制力就完全能够自学到一定的程度。 在自学氛围的影响下&#…

【Python】科研代码学习:五 Data Collator,Datasets

【Python】科研代码学习&#xff1a;五 Data Collator&#xff0c;Datasets Data CollatorDefault data collatorDefaultDataCollatorDataCollatorWithPaddingPadding 其他 Data Collator Datasetsload_dataset其他一些基本操作 Data Collator HF官网API&#xff1a;Data Coll…