L5 CMake 构建系统实践
实验目标
建立 buzzer 模块,为它声明头文件和 stm32cubemx 依赖,再由顶层目标链接并调用。完成后再查看实践参考答案。
实践作业:用 CMake 驱动蜂鸣器
背景介绍
我们为你准备了一个初始的 STM32 仓库代码。
这是一个用 STM32CubeMX 生成的、包含基础 PWM 配置的 CMake 工程。在这个工程的根目录下,有一个我们预先写好的 buzzer 文件夹,里面包含了控制蜂鸣器发声的底层代码。
目前的文件结构如下:
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 文件打包成一个库。
步骤提示:
在
buzzer/目录下,新建一个文件,命名为CMakeLists.txt。使用
add_library()命令,创建一个名为buzzer_lib的库目标,并将src/buzzer.c加入其中。使用
target_include_directories()命令,告诉 CMake 这个库的头文件在哪里。注意:为了让主程序也能找到buzzer.h,记得使用 哪个权限关键字?(提示:PUBLIC, PRIVATE 还是 INTERFACE?)使用
target_link_libraries()命令,为这个需要依赖stm32cubemx库的库目标添加链接指向stm32cubemx
任务二:在顶层总管处“登记造册”
现在你已经造好了 buzzer_lib 这个引擎,接下来需要回到项目的根目录,在顶层的 CMakeLists.txt 中指挥全局,把引擎安装到你的机器(主程序)上。
步骤提示:
打开根目录下的
CMakeLists.txt。往下翻,找到 CubeMX 预留的注释区域,或者直接拉到文件的最末尾。
使用
add_subdirectory()命令,告诉 CMake 去处理buzzer文件夹。找到你的主程序目标(在 CubeMX 生成的文件中,通常使用
${CMAKE_PROJECT_NAME}变量代表目标名)。使用
target_link_libraries()命令,将主程序目标与你的buzzer_lib链接起来!
注意:每次用 CubeMX 重新生成代码时,它可能会重写 CMakeLists.txt 的部分内容。为了防止你的代码被删掉,建议将手写的 CMake 代码放在文件最末尾,或者放在 _# USER CODE BEGIN_ 和 _# USER CODE END_ 之间。
添加完成后,记得点击重置缓存按钮 (或者点击右上角带有刷新箭头的 CMake 图标)!如果下面的构建窗口没有报错,说明你成功了!

任务三:奏响代码的乐章
万事俱备,只欠东风。现在构建系统已经被你完美打通,你可以像调用标准库一样调用我们写好的蜂鸣器函数了。
步骤提示:
打开
Core/Src/main.c。在文件开头的
/* USER CODE BEGIN Includes */区域,包含头文件#include "buzzer.h"。 (如果 CLion 没有画红波浪线,还会自动代码补全,说明你的 CMake 链接完美成功!)往下拉,找到
main函数里的while (1)循环。在
while (1)的/* USER CODE BEGIN 3 */区域里,调用发声函数。例如:让蜂鸣器以 1000Hz 响 500ms,然后静音 500ms。(可以搭配HAL_Delay()使用)。点击右上角的绿色小锤子(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 这种高度工程化、模块化的方式来管理代码。加油!