我怎么用 AI 一天学完 15 个嵌入式固件源文件
一句话: AI 不只是写代码的工具。把它当老师用——追问每个概念直到彻底搞懂、不让它帮你写而是让它帮你解释——一天能从零吃透一个上万行的嵌入式项目。分享我的学习方法。
系列文章:《AI赋能嵌入式开发》 — DeepSeek看图、AI当老师、AI审查代码、省Token技巧——用AI加速嵌入式开发
📄 含一键部署提示词 ✅ 一天学完15个源文件 📄 双窗口分工法 📄 7条血泪经验
@[TOC]
适合谁读:适合嵌入式开发者、单片机初学者及遇到类似问题的工程师
AI 能写代码,但别让它帮你写
我这段时间用 AI 做嵌入式开发,发现一个现象:
大多数人问 AI:"帮我写一个 I2C 从机驱动"→ AI 写好了 → 贴进去能跑 → 下次还是不会写。
我反过来用:不让 AI 帮我写代码,而是问 AI"这段代码什么意思"。
比如看到这行:
pADI_CLK->CLKCON0 |= BITM_CLOCK_CLKCON0_CLKMUX;不问 AI "帮我配个时钟",而是问:
"
|=这个操作是什么意思?BITM_CLOCK_CLKCON0_CLKMUX是个什么东西?为什么用|=而不是=?"
AI 回答:|=是"只把某一位设成 1,其他位保持不变"。=会覆盖所有位,可能把旁边已经配好的功能全毁掉。BITM_前缀表示这是一个位掩码。
这一行懂了,后面所有|=和&= ~的操作都不用再问了。因为原理是一样的——只改要改的位,不动其他位。
不跳步:每个概念追到彻底明白
嵌入式代码里全是这种"看起来简单但不知道什么意思"的东西:
| 我看到的东西 | 我追问的问题 |
|---|---|
0U | "数字后面加 U 是什么意思?" |
volatile uint8_t g_bTick; | "volatile 到底防止编译器做什么?不加会怎样?" |
NVIC_EnableIRQ(22U) | "22 是哪来的?为什么不用枚举名?中断号到底是怎么对应到向量表的?" |
__disable_irq() | "关中断之后如果忘了开会发生什么?为什么 Flash 写之前必须关中断?" |
BITM_I2C_SSTAT_START | "这个宏展开是什么?START 事件和 REPSTART 有什么区别?" |
大多数教程会说"volatile 防止编译器优化",就完了。
我要追问到:"什么叫编译器优化?假如不加 volatile,编译器会怎么处理?能不能举个例子让我看到区别?"
AI 给了我一个场景:定时器 ISR 里g_bTick = 1,主循环while (g_bTick == 0)等——如果不加 volatile,编译器可能把g_bTick读到寄存器里反复用,永远看不到 ISR 改的新值。程序死循环。
懂了场景,volatile 就永远不会忘了加。
读写分离:一个窗口学,一个窗口做
我是个新手,刚开始看项目的时候连很多基本语法都不熟。
但我发现一个好办法:开两个窗口。
| 窗口 | 干什么 |
|---|---|
| 窗口 1(学习窗口) | 问 AI"这段代码什么意思""为什么这么做"——纯聊、纯学 |
| 窗口 2(工作窗口) | 写代码、改代码、编译、调试 |
为什么要分开?
因为混在一起会打断节奏。学的时候想"要不要试一下",试了发现跑不通,就忘了刚才学到哪了。两个窗口把"学"和"做"隔离开,学习窗口里只关注一件事:搞懂概念。
跟着 CPU 的执行顺序学,不跟着目录学
第一天打开项目,16 个源文件,不知道从哪看起。
AI 告诉我:别按目录读,跟着 CPU 上电的流程走。
上电 → main() → App_Init() → 15 步初始化 → 主循环于是我的学习路线变成了:
1. main.c — 先看懂"程序从哪开始、做了什么事" 2. app_state.c — 状态机是怎么跑的 3. app_monitor.c — 100ms 监控链路 4. mod_tec.c — TEC 温控怎么用状态机代替延时 5. app_cmis.c — I2C 寄存器表 + Page Select 6. drv_i2c_slave.c — I2C 从机中断状态机 7. drv_pi12030.c — SPI 怎么和外设芯片通信 8. drv_timer.c — 硬件定时器怎么触发 100ms 9. drv_adc.c — 8 路模拟采集 10. drv_flash.c — Flash 双备份 + CRC 校验 ...每看完一个文件,AI 会告诉我"这个文件调了哪个驱动,下一个该看那个"。顺着调用链,一天之内 15 个文件全串起来了。
问"为什么",不问"是什么"
这是最关键的区别。
| 问"是什么" | 问"为什么" |
|---|---|
| "ISR 里不能放延时" | "为什么 ISR 里不能放延时?放了会怎样?" |
| "Flash 要双备份" | "为什么不能只存一份?写一半断电了怎么办?" |
| "状态机用枚举" | "为什么用枚举而不是直接写 0 1 2 3?" |
| "BSP 层收口引脚" | "不用 BSP 层会怎样?为什么不能直接调 DioClr?" |
问"是什么"得到一个规则。问"为什么"得到理解。
理解了之后,你不需要死记规则——因为你知道违反规则的后果是什么。
遇到不懂的词立刻停下来
以前看教程,遇到不认识的缩写,我习惯"跳过,先看完再说"。
现在不一样了。看到volatile、|=、BITM_、REPSTART、TMPGD、APC——遇到一个陌生的,立刻问 AI 这是什么意思。
不攒着,不跳过去。"
为什么?因为嵌入式代码的术语是嵌套的——你不懂BITM_,就看不懂|= BITM_,就看不懂寄存器配置,就看不懂整个外设初始化。一个词卡住,后面全部白读。
AI 的好处是你可以无限追问,不用担心"问题太蠢"被嘲笑。
三步总结:我的学习法
| 步骤 | 做什么 | 例子 |
|---|---|---|
| 1 | 跟着 CPU 执行顺序读,不按目录读 | 从main()开始,顺着调用链往下 |
| 2 | 每个不认识的词立刻停下来问 | 0U、volatile、` |
| 3 | 问"为什么"而不是"是什么" | "为什么 ISR 里不能放延时?放了会怎样?" |
AI 在这个过程里的角色不是"代码生成器",而是一个永远不会烦的老师——你可以问它 50 遍同一个问题,从不同角度、用不同比喻,直到你彻底搞懂。
这就是我一天从零学到能理解整个 19 文件嵌入式项目的办法。不是什么天赋,就是不跳步 + 追问到底 + AI 当老师。
实测对比:传统自学: 15个文件 ≈ 2-3周 | AI辅助+追问法: 15个文件 ≈ 1天
有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。
下一篇:含一键部署提示词——DeepSeek看图、AI当老师、AI审查代码、省Token技巧——用AI加速嵌入式开发