【Makefile】Makefile 编译 Keil 工程(Linux 环境)

本文使用的开发板为 stm32f103C8T6,使用的驱动库为stm32标准库。


目录

一、软件下载

1、stm32 标准库

2、arm-none-eabi 工具链

3、烧录器

二、Keil 工程改造

1、Keil 工程

2、基本 Makefile 工程

3、添加启动文件

4、添加链接脚本

5、去掉 core_cm3.c

三、Makefile 脚本

1、添加环境变量

2、Makefile 脚本

四、烧录


一、软件下载

工程搭建阶段:stm32f10x 标准库

工程编译阶段:arm-none-eabi 工具链、cmake(包含make指令)

程序烧录阶段:ST-Link

1、stm32 标准库

stm32 标准库下载地址:Download | Stm32 Standard Library

2、arm-none-eabi 工具链

arm-none-eabi 交叉编译工具链下载地址:Download | arm-none-eabi

stm32f103C8T6 内不含操作系统,所以需要选择裸机运行的工具链,这里选择arm-none-eabi 工具链。arm-none-eabi 的 “arm”代表支持 arm 架构,“none” 表示不指定目标操作系统,“eabi” 是 Embedded ABI 的缩写。

相比之下,arm-linux-gnueabi 虽然也支持 arm 架构,但面向的是 Linux 操作系统,“gnu” 表示使用的 C 库是 GNU C Library(通常称为 glibc),这是 Linux 系统上常用的标准库。

3、烧录器

ST-Link 下载地址:STSW-LINK004 - STM32 ST-LINK utility - STMicroelectronics

stm32 最合适的烧录器便是 ST-Link。ST-Link 是意法半导体(STMicroelectronics)开发的一种嵌入式调试器和编程器,专门用于STM8和STM32系列的微控制器。ST-Link的功能主要包括:

  1. 在线调试通过SWD(Serial Wire Debug)或JTAG接口连接到目标微控制器,ST-Link允许用户使用集成开发环境(IDE)如STM32CubeIDE、Keil μVision 或 IAR Embedded Workbench进行源代码级别的调试。用户可以设置断点、单步执行、查看和修改内存及寄存器内容。
  2. 固件编程ST-Link可以将编译好的HEX或BIN文件烧录到微控制器的闪存中,完成固件的更新或初次编程。

二、Keil 工程改造

1、Keil 工程

现在使用 Makefile 编译,我们需要将原本的工程进行简化,去掉一些 Keil 平台独有的文件,仅保留源文件和头文件。原 keil 工程结构如下。

  • MODULE:保存自定义模块
  • STM32F10x_LIB:stm32 标准库
  • USER:保存主函数文件、启动文件、stm32系统文件

2、基本 Makefile 工程

MODULE、STM32F10x_LIB 无需做任何变动,USER 仅保留.c源文件、.h头文件,其他的先删除,.s 文件也不要,因为后续编译用的 gcc 编译器,需要使用支持 gcc 编译器的startup汇编文件。筛过一遍的Makefile工程如下(Makefile 文件留到最后写)

3、添加启动文件

解压stm32 标准库的压缩包,在 Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup 下包含了各种环境适配的启动文件。

选择 gcc_ride7 目录下的 startup_stm32f10x_md.s,md 代表了 flash 容量大小为medium density。

后缀flash 容量区间
ld[0, 16KB]
md[32KB, 64KB)
hd[64KB, 128KB)

4、添加链接脚本

链接脚本指示编译生成的各个段应如何被放置在内存中,Keil 存在默认配置,所以使用Keil 时无需关心这些,现在不使用 Keil 则需要通过链接脚本实现。标准库中也提供了链接脚本的模板,使用 everything 搜索 stm32_flash.ld 。下面任意一个均可。

添加到工程后,需要做一点改动,原 Keil 工程中有默认的配置,我们需要应用到链接脚本中。

起始地址可以直接照搬,IROM1 的Size 需要转换一下,0x10000 的单位是字节,需要转换成 KB,0x10000 Byte = 64 KB。 

5、去掉 core_cm3.c

如果标准库中包含 core_cm3.c ,暂时先去掉,实际在编译时,该文件无法编译通过。

ps:如果要保留这个文件,修改方法可以参考这篇文章末尾:如何用gcc+makefile改造STM32Keil项目 - lqxhgd - 博客园 (cnblogs.com)

 

三、Makefile 脚本

1、添加环境变量

解压交叉编译工具链压缩包,并添加环境变量 ARM_NONE_EABI_ROOT,对应的值为 交叉编译工具链 arm-none-eabi 的根目录。同时将 bin 目录添加到环境变量 PATH

2、Makefile 脚本

 Makefile 脚本参考:Linux Makefile Template

四、烧录

 如果编译通过,会在 build 目录下生成 .elf、.bin 以及 .hex 文件,其中 .hex 和 .bin 适用于裸机环境,.elf 适用于包含操作系统的环境。

 打开 ST-Link,连接到开发板,若连接成功可以看到右边的设备信息。

准备开始烧录

烧录成功后 

参考文章:

keil 采用 makefile 实现编译_keil makefile-CSDN博客 

如何用gcc+makefile改造STM32Keil项目 - lqxhgd - 博客园 (cnblogs.com) 

【嵌入式】基于makefile的STM32编译方法探索 - 简书 (jianshu.com) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

App Inventor 2 如何接入ChatGPT:国内访问OpenAI的最佳方式

如何接入OpenAI 由于国内无法访问OpenAI,KX上网可选大陆及香港(被屏蔽)以外才行。因此对于大多数人来说,想体验或使用ChatGPT就不太便利,不过App Inventor 2 为我们提供了相对便利的一种方式,即“试验性质…

基于STM32F407的项目迁移到STM32F427

提示:此文档迁移教程使用的是IAR,有关代码的修改使用的是Vscode,基于STM32F407的项目迁移到STM32F427 基于STM32F407的项目迁移到STM32F427 前言一、硬件区别1.1.区别:1.2.需要注意以下硬件区别: 二、引脚配置三、STM32F4273.1.晶…

安卓高级控件(下拉框、列表类视图、翻页类视图、碎片Fragment)

下拉框 此小节介绍下拉框的用法以及适配器的基本概念,结合对下拉框Spinner的使用说明分别阐述数组适配器ArrayAdapter、简单适配器SimpleAdapter的具体用法与展示效果。 下拉框控件Spinner Spinner是下拉框控件,它用于从一串列表中选择某项&#xff0…

41-4 DDOS攻击防护实战

一、UDP FLOOD攻击 # hping3 -q -n -a <攻击IP> -S -s <源端口> --keep -p <目的端口> --flood <被攻击IP> hping3 --udp -s 6666 -p 53 -a 192.168.1.6 --flood 192.168.1.13 这个命令是使用hping3工具进行UDP Flood攻击的命令。下面是各个选项的作…

Linux--进程概念

目录 基本概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统目录查看 通过ps命令查看 通过系统调用获取进程的PID和PPID 通过系统调用创建进程- fork初始 Linux进程状态 运行状态&#xff08;Running&#xff09;- R 浅度睡眠状态…

工业级3D开发引擎HOOPS:创新与效率的融合!

在当今这个技术日新月异的时代&#xff0c;3D技术已成为推动各行各业发展的重要力量。从工程设计到游戏开发&#xff0c;从虚拟现实到增强现实&#xff0c;3D技术的应用无处不在&#xff0c;它极大地丰富了我们的生活和工作。而在这样的背景下&#xff0c;HOOPS作为一个强大的3…

java学习和项目总结

java&#xff1a; JDK/JRE/JVM三者的关系 JVM&#xff1a;JVM是java进行编译的虚拟机&#xff0c;是Java 能够跨平台运行的核心 。 所有的java程序会首先被编译为.class的类文件&#xff0c;这种类文件可以在虚拟机上执行。也就是说class文件并不直接与机器的操作系统交互&a…

认识NXP新型微处理器:MCX工业和物联网微控制器

目录 概述 1 MCX工业和物联网微控制器介绍 2 MCX 系列微控制器类型 2.1 MCX N系列微控制器 2.1.1 主要特征 2.1.2 MCX N系列产品 2.1.3 MCX N9xx和N5xx MCU选型表 2.2 MCX A系列微控制器 2.2.1 主要特征 2.2.2 MCX A系列产品 2.2.3 MCX A MCU的架构 2.3 MCX W系…

144.栈和队列:有效的括号(力扣)

题目描述 代码解决 class Solution { public:bool isValid(string s) {// 如果字符串长度为奇数&#xff0c;不可能是有效的括号字符串if(s.size() % 2 ! 0) return false;// 使用栈来存放括号stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size();…

C# run Node.js

C# run nodejs Inter-Process Communication&#xff0c;IPC Process类 启动Node.js进程&#xff0c;通过标准输入输出与其进行通信。 // n.js// 监听来自标准输入的消息 process.stdin.on(data, function (data) {// 收到消息后&#xff0c;在控制台输出并回复消息console.l…

2024最新 Jenkins + Docker 实战教程(三) - 在Jenkins服务器上运行java项目

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Kafka SASL_SSL集群认证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka SASL_SSL安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详…

【js刷题:数据结构链表之环形链表】

环形链表 一、题目二、实现思路1.判断是否有环2.如何找到环状链表的入口节点 三、解题代码 一、题目 二、实现思路 主要有两点&#xff0c;首先我们要判断这个链表是否有环&#xff0c;其次我们要找到这个环的入口节点。 1.判断是否有环 定义一个快指针fast和慢指针slow 快指…

基于.NetCore和ABP.VNext的项目实战二:Swagger

Mag.Blog.Swagger层添加Volo.Abp.AspNetCore和Swashbuckle.AspNetCore包,引用实体层.Domain 添加模块类MagBlogSwaggerModule.cs,依赖MagBlogDomainModule模块,并且重写ConfigureServices和OnApplicationInitialization方法 namespace Mag.Blog.Swagger {[DependsOn(typeof…

【机器学习】在电子商务(淘*拼*京*—>抖)的应用分析

机器学习与大模型&#xff1a;电子商务的新引擎 一、电子商务的变革与挑战二、机器学习与大模型的崛起三、机器学习与大模型在电子商务中的应用实践个性化推荐精准营销智能客服库存管理与商品定价 四、总结与展望 随着互联网的飞速发展&#xff0c;电子商务已经成为我们生活中不…

c++ 实现 梯度下降线性回归模型

理论与python实现部分 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation c代码 没能力实现反向传播求梯度&#xff0c;只能自己手动算导数了 #include <bits/stdc.h> #include <time.h> using namespace std;//y_hat X * W b // linreg 函数&#xff1a…

Unity射击游戏开发教程:(24)创造不同的敌人

在这篇文章中,我们将讨论添加一个可以承受多次攻击的新敌人和一些动画来使事情变得栩栩如生。敌人没有任何移动或射击行为。这将有助于增强未来敌人的力量。 我们将声明一个 int 来存储敌人可以承受的攻击数量,并将其设置为 3。

深度学习之基于Matlab卷积神经网络(CNN)手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是计算机视觉领域的一个重要问题&#xff0c;也是深度学习应用的一个典型场景。卷…

基于消息中间件的异步通信机制在系统解耦中的优化与实现

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

Docker Compose快速入门

本教程旨在通过指导您开发基本Python web应用程序来介绍Docker Compose的基本概念。 使用Flask框架&#xff0c;该应用程序在Redis中提供了一个命中计数器&#xff0c;提供了如何在web开发场景中应用Docker Compose的实际示例。 即使您不熟悉Python&#xff0c;这里演示的概念也…