【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的功能主要包括:
- 在线调试:通过SWD(Serial Wire Debug)或JTAG接口连接到目标微控制器,ST-Link允许用户使用集成开发环境(IDE)如STM32CubeIDE、Keil μVision 或 IAR Embedded Workbench进行源代码级别的调试。用户可以设置断点、单步执行、查看和修改内存及寄存器内容。
-
固件编程: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)
相关文章:

【Makefile】Makefile 编译 Keil 工程(Linux 环境)
本文使用的开发板为 stm32f103C8T6,使用的驱动库为stm32标准库。 目录 一、软件下载 1、stm32 标准库 2、arm-none-eabi 工具链 3、烧录器 二、Keil 工程改造 1、Keil 工程 2、基本 Makefile 工程 3、添加启动文件 4、添加链接脚本 5、去掉 core_cm3.c 三…...
Django的视图层——1HttpResponse对象详解
在django.http模块中定义了HttpResponse对象的APIHttpRequest对象由Django自动创建,HttpResponse对象由程序员创建在每一个视图函数中必须返回一个HttpResponse对象,当然也可以是HttpResponse子对象 1.不用模板,直接返回数据 from django.http import HttpRespons…...

企业活动想找媒体报道宣传怎样联系媒体?
在那遥远的公关江湖里,有一个传说,说的是一位勇士,手持鼠标和键盘,踏上了寻找媒体圣杯的征途。这位勇士,就是我们亲爱的市场部门小李,他的任务是为公司即将举行的一场盛大的企业活动找到媒体的聚光灯。 小李的故事,开始于一张空白的Excel表格,上面列着各大媒体的名称,旁边是一片…...

基于ChatGPT+RPA的融资融券业务担保资产风险评价
原载《会计之友》2024年第2期 作者简介 李闻一 男,湖北洪湖人,华中师范大学经济与工商管理学院教授、博士生导师,会计学科带头人,研究方向:财务共享、公司金融、风险管理 黄怡凡 女,湖北公安人…...
2. CSS选择器与伪类
2.1 基本选择器回顾 在开始介绍CSS3选择器之前,我们先回顾一下CSS的基本选择器。这些选择器是所有CSS开发的基础。 2.1.1 元素选择器 元素选择器用于选中指定类型的HTML元素。 /* 选中所有的<p>元素 */ p {color: blue; }2.1.2 类选择器 类选择器用于选中…...

tcpdump源码分析
进入tcpdump.c(函数入口)之前,先看一些头文件netdissect.h里定义了一个数据结构struct netdissect_options来描述tcdpump支持的所有参数动作,每一个参数有对应的flag, 在tcpdump 的main 里面, 会根据用户的传入的参数来…...

搭建Harbor镜像仓库
前言 1、系统版本:CentOS9 2、harbor版本:v2.9.4 3、提前安装好docker和docker-compose,参考地址。我这里安装的版本是docker:26.1.3 docker-compose:v2.27.1 安装步骤 下载安装包 1、下载地址:ha…...

【C/C++】Makefile文件的介绍与基本用法
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...

PHP生成二维码+二维码包含logo图片展示
composer require chillerlan/php-qrcode 用到的扩展自己安装(注:只生成二维码只要开gd扩展就行) 仅生成二维码看这个: use chillerlan\QRCode\QRCode;public function QRCode(){$qrcode new QRCode();$url "http://ww…...

vue项目打包教程
如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件;在vue项目目录下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: 文件…...

制作电子画册速成攻略,快来试试
当今社会,数字媒体日益普及,电子画册作为一种崭新的展示方式,受到了越来越多人的青睐。它不仅形式新颖,互动性强,而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗?我来教你吧。 接下来&…...
【java程序设计期末复习】chapter7 内部类和异常类
内部类和异常类 内部类 ava支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。 注意 (1)内部类的类体中不可以声明类变量和类方法。 (2)外嵌类的类体中可以用内部类…...

Windows下安装配置深度学习环境
Windows下安装配置深度学习环境 1. 准备工作 1.1 环境准备 操作系统:win10 22H2 GPU:Nvidia GeForce RTX 3060 12G 1.2 安装Nvidia驱动、cuda、cuDNN 下载驱动需要注册并登录英伟达账号。我这里将下面用到的安装包放到了百度网盘,可以关注微信…...

如何使用ssh将vscode 连接到服务器上,手把手指导
一、背景 我们在开发时,经常是window上安装一个vscode编辑器,去连接一个虚拟机上的linux,这里常用的是SSH协议,了解其中的操作非常必要。 二、SSH协议 SSH(Secure Shell)是一种安全协议,用于…...
Tomcat调优参数
JVM优化 Tomcat是一个Web容器,所有的jar其实都共享Tomcat中的JVM参数,所以Tomcat的JVM参数优化至关重要。 Tomcat的JVM参数是在启动脚本中设置的,如想要设置最大堆内存和最小堆内存时: 在windows的启动脚本catalina.bat中的set &q…...

云计算和大数据处理
文章目录 1.云计算基础知识1.1 基本概念1.2 云计算分类 2.大数据处理基础知识2.1 基础知识2.3 大数据处理技术 1.云计算基础知识 1.1 基本概念 云计算是一种提供资源的网络,使用者可以随时获取“云”上的资源,按需求量使用,并且可以看成是无…...

VAE-变分自编码器(Variational Autoencoder,VAE)
变分自编码器(Variational Autoencoder,VAE)是一种生成模型,结合了概率图模型与神经网络技术,广泛应用于数据生成、表示学习和数据压缩等领域。以下是对VAE的详细解释和理解: 基本概念 1. 自编码器&#…...
Android Room 使用模版
文章目录 一、配置依赖 plugins {id kotlin-kapt }android {compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17}kotlinOptions {jvmTarget 17} }dependencies {implementation("androidx.room:room-runtime:2.4.2&…...

Linux/Ubuntu 中安装 ZeroTier,实现内网穿透,2分钟搞定
相信很多人都有远程连接家中设备的需求,如远程连接家中的NAS、Windows等服务,所以会涉及到一个内网穿透工具的使用,如果没有公网IP的情况下,推荐大家使用ZeroTier,这是一款强大的内网穿透工具。 mac和windows版的操作…...

java技术:oauth2协议
目录 一、黑马程序员Java进阶教程快速入门Spring Security OAuth2.0认证授权详解 1、oauth服务 WebSecurityConfig TokenConfig AuthorizationServer 改写密码校验逻辑实现类 2、oauth2支持的四种方式: 3、oauth2授权 ResouceServerConfig TokenConfig 4、…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...