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

news2025/1/17 14:09:44

本文使用的开发板为 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) 

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

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

相关文章

AI整体架构设计4:理解AI云原生

泛AI架构设计这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计,包括业务数据治理、模型训练与管理、模型部署与调度。整体基于云原生技术,旨在通过开源领域的LLMOps或者MLOps技术,充分运用低代码平台构建高性能、高效率和敏捷…

Spring Cloud Gateway 网关

一. 什么是网关(Gateway) 网关就是一个网络连接到另一个网络的关口。 在同一个项目或某一层级中,存在相似或重复的东西,我们就可以将这些相似重复的内容统一提取出来,向前或向后抽象成单独的一层。这个抽象的过程就是…

简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.有无预编译 优点 缺点 2.SQL执行的快慢 3.能否被SQL注入 4.参数输入方式 5.总结 1.有无预编译 #{}是有预编译的而${}是没有预编译的&…

深度学习之基于Yolov3的行人重识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…

基础2 JAVA图形编程桌面:探索图形程序的抽象实现

嘿,大家好!我非常高兴又一次有机会与大家相聚,分享新的知识和经验。对于热爱编程和探索新技术的朋友们来说,今天的内容绝对不容错过。我为大家准备了一个详尽的视频教程:《基础2 JAVA 图形编程:主程序调用…

软件协作开发方法论

引言 作为程序员,你是否有过这样的经历?软件发版前,你需要把你的代码合并到主分支,拉取主分支代码后,发现有数十个文件冲突,你开始小心翼翼地解决冲突,有些其实你也不知道咋处理,几…

Spring Cloud Alibaba-08-SMS短信服务

Lison <dreamlison163.com>, v1.0.0, 2024.5.1 Spring Cloud Alibaba-08-SMS短信服务 短信服务介绍 短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。 产品优势:覆盖全面、高并发处理、消息堆积处理、开发管理简单、智能监控调度 产品功能:短…

linux 排查java内存溢出(持续更新中)

场景 tone.jar 启动后内存溢出,假设pid 为48044 排查 1.确定java程序的pid(进程id) ps 或 jps 都可以 ps -ef | grep tone jps -l 2.查看堆栈信息 jmap -heap 48044 3.查看对象的实例数量显示前30 jmap -histo:live 48044 | head -n 30 4.查看线程状态 jstack 48044

5.23 学习总结

一.项目优化&#xff08;语音通话&#xff09; 实现步骤&#xff1a; 1.用户发送通话申请&#xff0c;并处理通话请求&#xff0c;如果同意&#xff0c;为两个用户之间进行连接。 2.获取到电脑的麦克风和扬声器&#xff0c;将获取到的语音信息转换成以字节数组的形式传递。 …

宇宙“超级地球”系列,你知道几个?

在宇宙中&#xff0c;可能存在着类地行星&#xff0c;这样的行星可能同样也拥有适宜生命存在的条件。银河系大约有60亿颗类地行星。 开普勒442b 这是脱离太阳系以后&#xff0c;人类发现的第二颗离地球最近的类地行星。开普勒442b这颗类地行星位于天鹅座&#xff0c;离地球约有…

机器学习势系列教程(3):cp2k的安装

大家好&#xff0c;我是小马老师。 本文继续介绍机器学习势相关内容&#xff1a;cp2k的安装。 和abacus一样&#xff0c;cp2k也是一款开源的第一性原理模拟软件&#xff0c;模拟的数据也可作为机器学习势的训练数据集。 cp2k安装方法也很多&#xff0c;常见的有docker安装、…

数据可视化第十天(爬虫爬取某瓣星际穿越电影评论,并且用词云图找出关键词)

开头提醒 本次爬取的是用户评论&#xff0c;只供学习使用&#xff0c;不会进行数据的传播。希望大家合法利用爬虫。 获得数据 #总程序 import requests from fake_useragent import UserAgent import timefuUserAgent()headers{User-Agent:fu.random }page_listrange(0,10) …

AI绘画Stable diffusion小白入门:文生图精讲,超全干货一定要看!

大家好&#xff0c;我是设计师阿威 今天&#xff0c;我们将深入了解Stable diffusion的文生图功能&#xff0c;让你也能生成满意的图片&#xff01; 如上图&#xff0c;这是Stable diffusion的文生图界面&#xff0c;这个界面总体可以分为五个区域&#xff1a; 模型区&#xf…

NegativePrompt:利用心理学通过负面情绪刺激增强大型语言模型

【摘要】大型语言模型 (LLM) 已成为各种应用不可或缺的一部分&#xff0c;从传统的计算任务到高级人工智能 (AI) 应用。这种广泛的应用促使社会科学等各个学科对 LLM 进行了广泛的研究。值得注意的是&#xff0c;研究表明 LLM 具有情商&#xff0c;可以通过积极的情绪刺激进一步…

UNION的使用

UNION的使用 给出将多条查询语句组合成单个结果集&#xff0c;两个表对应的列数和数据类型必须相同 UNION操作符&#xff1a; 返回两个查询结果集的并集&#xff0c;并去除重复记录 UNION ALL操作符 返回两个查询的结果集的并集。不去掉两个结果集的重复部分&#xff0c;重…

为什么说change Buffer写缓冲区,仅适用于辅助索引页

change buffer: 写缓冲区&#xff0c;是针对于二级索引页的更新优化措施。 change Bufer作用:在进行DML操作的时候&#xff0c;如果请求的是辅助索引(非唯一索引)并且没有在缓冲池中&#xff0c;并不会立刻将磁盘页加载到缓冲池&#xff0c;而是在CB记录缓冲变 更&#xff0c…

JVM(7):虚拟机性能分析和故障解决工具之jstat工具

1 jstat(JVM Statistics Monitoring Tool)作用 监视虚拟机各种运行状态信息&#xff0c;可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据 2 命令格式 jstat [options vmid [interval[count]]] 参数解释 第一个参数&#xff1a;options 代…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

CSS学习笔记之中级教程(三)

14、CSS 下拉菜单 14.1 示例1&#xff1a;普通弹窗 思路&#xff1a;弹窗内容先隐藏display: none;&#xff0c;:hover时候修改弹窗部分的 display: block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><me…

IT学习笔记--Kafka

Kafka概述: 定义: Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要应用于大数据实时处理领域。 消息队列消息队列的两种模式: 点对点模式: 消息生产者生产消息发送到Queue中&#xff0c;然后消息消费者从Queue中取出并且消费消息。 消息被消费以后&#…