通用AI写代码有个名场面——“幻觉”。它自信满满地给你写一行寄存器配置,寄存器名字看着挺像那么回事,但翻遍整本手册,根本不存在。
Demo和量产,差的不是功能,是代码的厚度。
一个量产级的外设驱动,初始化函数里要做的事远不止“配几个寄存器”:
- 初始化开始前,先复位外设到默认状态,清理上次运行的残留配置
- 时钟使能后,加短暂延时等时钟稳定
- 引脚复用之前,检查引脚当前状态
- 每个关键寄存器写入后,回读验证
- 对外接口用完整的错误码体系,不是所有异常都返回-1
这些东西,不是靠“聪明”能凭空想出来的。它们是固件库里沉淀的工程规范。
把HAL库、SDK文档一起喂给AI,它生成的代码就带上这些规范:知道GPIO初始化前要调__HAL_RCC_GPIOB_CLK_ENABLE(),知道IIC初始化要先复位再配置,知道每个关键操作后面要检查HAL_StatusTypeDef返回值。
提示词:让opencode生成结构清晰的文件目录
量产级思维和Demo思维,就隔着这些细节。这些细节,全在固件库里。
导入数据手册和固件库之后,AI有了“锚点”。它不是在黑暗里摸索,是拿着精确的硬件规格写代码。寄存器名字有没有写错?跟手册对得上。分频系数算没算错?跟时钟树推导一致。
把手册导入之后,AI变成了什么?
它会从手册里自动提取:
- 传感器上电后需要1ms稳定时间
- IIC地址0x44是7位地址,实际发送要左移
- IIC标准模式100KHz,对应SCLL和SCLH需要根据PCLK1频率计算
- 如果目标引脚默认被调试接口占用,需要先关闭复用功能
这些信息分散在手册十几个不同章节里。以前你得来回翻,AI一次性全部关联起来。它生成代码的时候,不是凭记忆在写,是拿着你的“硬件档案”在写。
前面已经给出了创建STM32的文件目结构,结果如下,按照提示放入相关文件,就可以让agent指哪打哪,有的放矢,不瞎编胡造。
下一篇专栏文章预告:不手动下一行代码,如何用Opencode 实现彩灯控制程序