Skip to content

L5 CMake 构建系统实践

实验目标

建立 buzzer 模块,为它声明头文件和 stm32cubemx 依赖,再由顶层目标链接并调用。完成后再查看实践参考答案

实践作业:用 CMake 驱动蜂鸣器

背景介绍

我们为你准备了一个初始的 STM32 仓库代码。

请至钉钉文档查看附件《stm32_cmake.zip》。

这是一个用 STM32CubeMX 生成的、包含基础 PWM 配置的 CMake 工程。在这个工程的根目录下,有一个我们预先写好的 buzzer 文件夹,里面包含了控制蜂鸣器发声的底层代码。

目前的文件结构如下:

plaintext
Buzzer_CMake_Lab/
├── CMakeLists.txt         <-- 顶层总控制台 (由CubeMX生成)
├── Core/
│   └── Src/main.c         <-- 你的主程序
└── buzzer/                <-- 我们写好的蜂鸣器模块!
    ├── include/
    │   └── buzzer.h       <-- 蜂鸣器头文件
    └── src/
        └── buzzer.c       <-- 蜂鸣器源文件

你的终极任务是: 用你刚刚学到的 CMake 知识,把这个游离在系统之外的 buzzer 模块变成一个标准的 CMake “目标 (Target)”,把它链接到主程序中,并让你的板子唱出声音!


任务一:在子目录建立“施工图纸”

目前,buzzer 文件夹就像一盘散沙,CMake 根本不知道它的存在。你需要进入 buzzer/ 文件夹,告诉 CMake 如何把里面的 .c 和 .h 文件打包成一个库。

步骤提示:

  1. 在 buzzer/ 目录下,新建一个文件,命名为 CMakeLists.txt

  2. 使用 add_library() 命令,创建一个名为 buzzer_lib 的库目标,并将 src/buzzer.c 加入其中。

  3. 使用 target_include_directories() 命令,告诉 CMake 这个库的头文件在哪里。注意:为了让主程序也能找到 buzzer.h,记得使用 哪个权限关键字?(提示:PUBLIC, PRIVATE 还是 INTERFACE?)

  4. 使用target_link_libraries()命令,为这个需要依赖stm32cubemx库的库目标添加链接指向stm32cubemx


任务二:在顶层总管处“登记造册”

现在你已经造好了 buzzer_lib 这个引擎,接下来需要回到项目的根目录,在顶层的 CMakeLists.txt 中指挥全局,把引擎安装到你的机器(主程序)上。

步骤提示:

  1. 打开根目录下的 CMakeLists.txt

  2. 往下翻,找到 CubeMX 预留的注释区域,或者直接拉到文件的最末尾

  3. 使用 add_subdirectory() 命令,告诉 CMake 去处理 buzzer 文件夹。

  4. 找到你的主程序目标(在 CubeMX 生成的文件中,通常使用 ${CMAKE_PROJECT_NAME} 变量代表目标名)。

  5. 使用 target_link_libraries() 命令,将主程序目标与你的 buzzer_lib 链接起来!

注意:每次用 CubeMX 重新生成代码时,它可能会重写 CMakeLists.txt 的部分内容。为了防止你的代码被删掉,建议将手写的 CMake 代码放在文件最末尾,或者放在 _# USER CODE BEGIN_  _# USER CODE END_ 之间。

添加完成后,记得点击重置缓存按钮 (或者点击右上角带有刷新箭头的 CMake 图标)!如果下面的构建窗口没有报错,说明你成功了!

微信图片_20260226002554_694_1.png


任务三:奏响代码的乐章

万事俱备,只欠东风。现在构建系统已经被你完美打通,你可以像调用标准库一样调用我们写好的蜂鸣器函数了。

步骤提示:

  1. 打开 Core/Src/main.c

  2. 在文件开头的 /* USER CODE BEGIN Includes */ 区域,包含头文件 #include "buzzer.h"。 (如果 CLion 没有画红波浪线,还会自动代码补全,说明你的 CMake 链接完美成功!)

  3. 往下拉,找到 main 函数里的 while (1) 循环。

  4. 在 while (1) 的 /* USER CODE BEGIN 3 */ 区域里,调用发声函数。例如:让蜂鸣器以 1000Hz 响 500ms,然后静音 500ms。(可以搭配 HAL_Delay() 使用)。

  5. 点击右上角的绿色小锤子(Build)并运行(或点击下载按钮通过 Ozone 烧录)。

(附:_buzzer_play_tone(uint16_t freq)_ 函数接受一个频率值,传入 0 表示静音)


进阶挑战

如果你已经成功让蜂鸣器发出“滴——滴——”的声音,恭喜你,你已经熟练掌握了现代 C/C++ 项目管理的精髓!

来点更好玩的: 既然你能控制频率 (freq) 和延时 (HAL_Delay),你完全可以用它来演奏一首简单的曲子! 你可以去网上搜索一下音符对应的频率(比如中音 Do 是 523Hz,Re 是 587Hz)。

尝试在 main.c 里写一个数组存放《两只老虎》或者《超级玛丽》的音高和节拍,写一个 for 循环把它播放出来。如果你做出来了,欢迎带着板子来找学长学姐炫耀!


学长寄语: 刚开始接触 CMake 时,可能会觉得写这些配置文件很繁琐,远不如在 IDE 里右键 "Add files..." 来得直接。但当你以后面对包含数百个文件、多人协同开发的大工程时,你会无比庆幸今天学会了用 CMake 这种高度工程化、模块化的方式来管理代码。加油!

最近更新