当前位置: 首页 > news >正文

嵌入式交叉编译与烧录-基于STM32实战

嵌入式交叉编译与烧录-基于STM32实战

1.CMake和Makefile以及CMakeLists.txt相关知识

1.1关于三个名词的理解。

  1. CMakeLists.txt——唯一与开发者交互

    • 它是一个文本文件,里面写的是CMake语法的高级代码。
    • 它的核心作用是:用更人性化的语句(比如add_executable),声明项目叫什么名字、包含哪些.c源文件、要链接哪些库、头文件在哪里。
    • 开发者通常只需要会修改文件即可,不需要从零手写。
  2. CMake——一个连接CMakeLists.txt和Makefile的软件

    • 它不是脚本,而是一个软件程序(在终端里敲的cmake命令)。
    • 它的主要作用是:读取 CMakeLists.txt,并根据当前系统环境(Linux/Mac/Windows)和指定的工具链,自动生成底层的 Makefile。
  3. Makefile——面向编译管理工具的文件

    • 它是由 CMake 自动生成的、面向编译管理工具的文件。
    • 它里面极其繁琐地记录了哪一个.c文件依赖哪一个.h文件,以及编译它需要执行哪一条具体的 arm-none-eabi-gcc 编译命令。
    • 因为它太难手写,所以现代开发都交由CMake自动生成。

1.2三者之间的关系。

总的来说,这三者是层层递进的关系,流程是开发者编写CMakeLists.txt——>CMake读取后生成Makefile——>编译器根据Makefile进行编译——>生成.elf文件(最终编译的结果)。但是这三者的目的仅仅是在为编译器做准备工作,相当于在写最终的执行方案Makefile,只是Makefile太过于复杂,所以用了中间工具CMake读取MakeLists.txt生成Makefile.

2.核心开发流程(四个阶段)


  1. 配置阶段(找到那个.cmake文件)
    • 目的:生成Makefile。
    • 命令:cmake -DCMAKE_TOOLCHAIN_FILE=…/cmake/gcc-arm-none-eabi.cmake …
    • 关键:指定了“交叉编译器工具链”,告诉 CMake 我们是为 ARM Cortex-M 芯片编译,而非PC。
cmake-DCMAKE_TOOLCHAIN_FILE=../cmake/gcc-arm-none-eabi.cmake..
  1. 编译阶段
    • 目的:将 C 语言源码翻译成芯片能懂的机器码。
    • 命令:cmake --build .
    • 关键:属于“增量编译”。如果只修改了 main.c,只会重新编译改变的文件,节省时间。如果清空了build文件夹,则需要重新运行“配置阶段”命令。
cmake--build.//注意目录转换到build文件夹下(这里统一存放编译生成的.elf/.map文件等等)
  1. 产物分析

    • .elf 文件:包含完整的机器码和调试信息,用于烧录和 GDB 调试。
    • .map 文件:内存映射文件,记录了每个函数和变量在 Flash/RAM 中的具体绝对地址与大小(例如:main 函数成功定位在 Flash 的 0x080004b0 地址)。
  2. 烧录运行

    • 目的:将固件写入芯片并让它跑起来。
    • 命令:openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c “program CM_LED.elf reset exit”
    • 关键:使用 OpenOCD 工具。program 负责写入,必须加上 reset 芯片才会重新启动并执行新程序。
openocd-finterface/stlink.cfg-ftarget/stm32f1x.cfg-c"program CM_LED.elf resetexit

3.注意

3.1注意编译环境

上述编译过程均是基于linux环境下进行,因此在STM32CubeMX中选择CMake或者Makefile。在windows环境下交叉编译可以借助现成的编译器,比如CLion和STM32CubeMX结合使用,本例中是将STM32CubeMX生成的模板代码进行添加相应功能后在CMakeLists.txt文件中添加相应逻辑。

3.2注意工具链的位置和文件管理

在工程目录下创建一个build文件夹,每次重新编译前将该文件夹清空,然后编译的产物全部放在一个文件夹中,方便调试,把工具和结果分开防止分不清。

http://www.jsqmd.com/news/1151226/

相关文章:

  • MemRef Dialect:内存引用与多维数组抽象
  • 终极虚幻引擎脚本系统指南:5个核心功能解锁游戏Mod开发新境界
  • Redis 缓存雪崩的防护思路
  • 食品配料分析:鸿蒙AI应用开发实战——让配料表“开口说话“
  • 抖店选品上货软件怎么判断值不值得用看它能不能减少返工
  • FMCW 激光雷达技术解析:对比 ToF 的 3 大核心优势与 2 项关键挑战
  • Web安全中的点击劫持与防护措施
  • 终极指南:如何用免费工具轻松恢复加密压缩包密码
  • 热释胶带在LED芯片维修中的5步应用:避免静电与热损伤实操
  • VMware新增EXSI虚拟机
  • Python 数据可视化之 Matplotlib——从基础到高级图表
  • gRPC服务间通信优化技巧
  • 掌握Go语言并发模型与通道使用技巧指南
  • 缠论可视化分析系统:基于C++的K线结构识别与动态链接库实现
  • 抖店一键铺货软件推荐看什么合规运营最关心这4个细节
  • 基于大数据+Hadoop运动健康数据分析平台设计与实现任务书
  • 2026高强度螺栓连接怎么配双叠自锁垫圈
  • 抖店客服怎么回复一件代发问题发货售后常用沟通思路
  • Windows 本地配置记录:Codex 重启后识别 Affinity MCP
  • HarmonyOS 小游戏《对战五子棋》开发第20篇 - 棋子设计
  • Python中构建AI分类器的完整步骤指南
  • 06-高级模式与实战项目——19. 实战项目三:电商网站
  • Linux 运维网络、日志、Web 性能
  • 抖店一键铺货工具怎么选新手先看能不能把1688商品安全上架
  • YOLOv8 数字仪表读数:180张数据集构建与 PyQt 界面读数结果实时显示
  • Cocos2d-x开发:CPP、Lua、JS模板与Lua Runtime架构深度解析
  • 工单系统超时自动流转改造:住宅物业报修响应断层底层解决思路
  • MK20DN128VFM5与CMT-8540S-SMT实现嵌入式音频方案
  • 瑞芯微RK3588硬件设计实战:基于NVR参考设计的10层PCB布局与叠层优化
  • 终极指南:Nerd Fonts如何彻底改变终端视觉革命