嵌入式开发AI协同实战:STM32代码生成与调试全流程

1. 为什么嵌入式开发需要引入AI协同

1.1 从"单打独斗"到"人机配合"的转变

搞嵌入式软件这行的朋友都清楚,STM32程序的开发流程跟纯软件有着本质区别。纯软件写完代码直接跑就行,但嵌入式你得面对寄存器配置、时钟树、中断优先级、外设初始化顺序这些硬件层面的约束。一个GPIO没配对,可能查半天都找不到问题出在哪。我做了十多年嵌入式项目,早期最痛苦的就是查数据手册和参考手册,一个外设动辄几百页,看完还不一定能配对。

AI协同开发的核心价值在于:它能把重复性的、有固定模式的代码生成工作接过去,让你把精力集中在系统架构和调试逻辑上。比如初始化代码、中断服务函数的框架、通信协议的收发逻辑,这些都有很强的模板性,AI生成的质量已经相当可用了。

但这里有个前提:你得知道怎么跟AI配合。直接扔一句"帮我写个STM32的SPI驱动",出来的东西大概率不能用。原因很简单,AI不知道你用的是哪个型号、哪个库、什么时钟频率、接的什么外设。所以协同开发的关键在于"喂信息"的方式和验证的流程。

1.2 AI在嵌入式开发中能做什么、不能做什么

先划清楚边界,这样你才不会在错误的地方浪费时间。

AI擅长的部分:

  • 根据外设参数生成初始化代码框架
  • 解释寄存器位域的含义
  • 生成状态机、环形缓冲区、CRC校验等通用逻辑
  • 帮你审查代码中的潜在问题(比如中断里放了延时)
  • 快速生成测试用例和调试辅助代码

AI不擅长的部分:

  • 替你判断硬件电路是否正确
  • 保证生成的代码在你的具体板子上一次跑通
  • 处理时序要求极其严格的底层驱动(比如软件模拟的窄脉冲)
  • 替代你阅读勘误手册

我个人的经验是:把AI当成一个反应极快但需要明确指令的初级工程师。你给的信息越精确,它输出的质量越高。下面我就把整个协同流程拆开来讲。

2. 协同开发前的准备工作

2.1 项目信息的结构化整理

在打开AI对话窗口之前,你得先把项目的基本信息整理成一份"简报"。这份简报包含以下内容:

信息类别具体内容为什么需要
芯片型号具体到完整型号,如STM32F407VGT6不同型号外设数量和寄存器有差异
开发库标准外设库/HAL库/LL库库不同,代码风格和API完全不同
工具链Keil/IAR/STM32CubeIDE/GCC影响编译选项和启动文件
系统时钟主频、各总线分频初始化代码必须匹配
外设清单用到哪些外设、引脚分配避免引脚冲突
功能需求要实现什么功能、什么协议决定代码架构

这份简报不需要多正式,用文本文件记下来就行。我一般会在项目根目录建一个project_brief.md,每次跟AI对话时把相关内容贴进去。这样做的好处是:对话历史丢了也不怕,简报还在,随时能重新开始。

2.2 开发环境的确认清单

在让AI生成代码之前,确保你的开发环境已经就绪:

  1. 编译器版本确认:不同版本的编译器对C标准的支持不一样。比如你用GCC 10以上,AI生成的代码可以用C11特性;如果用老版本Keil的ARMCC,就得注意别用太新的语法。
  2. 库文件路径配置:HAL库的路径要配好,否则AI生成的#include "stm32f4xx_hal.h"会报找不到文件。
  3. 调试器连接测试:先烧一个点灯程序进去,确认下载和调试通道正常。别等AI代码写完才发现调试器连不上,那就分不清是代码问题还是环境问题了。
  4. 串口打印通道:强烈建议先把串口重定向搞定,printf能用。这是后续调试AI生成代码的最重要手段。

注意:很多人跳过环境确认这一步,结果AI生成的代码编译报错,花大量时间排查,最后发现是库版本不对。先花十分钟确认环境,能省后面几个小时。

2.3 建立代码版本管理习惯

引入AI协同后,代码变更频率会明显加快。这时候版本管理不是可选项,是必须项。我的做法是:

  • 每次让AI生成新代码之前,先commit一次当前状态
  • AI生成的代码单独放一个分支或者先注释掉原代码
  • 验证通过后再合并

用Git的话,基本操作就是git add . && git commit -m "before AI gen: xxx"。这样万一AI生成的代码把原有逻辑改坏了,一个git checkout就能回退。我踩过的坑就是:有一次让AI"优化"一个已经调通的中断处理函数,结果它把关键的清除标志位顺序改了,导致中断反复触发。幸好有版本管理,直接回退对比就找到了差异。

3. 与AI协作生成STM32代码的完整流程

3.1 第一步:用自然语言描述需求并生成框架

这一步的关键是"分层次描述"。不要一次性把整个项目扔给AI,而是按模块来。以"用STM32F407的SPI1驱动一个OLED屏幕"为例,我会这样组织提示:

芯片:STM32F407VGT6 库:HAL库 需求:使用SPI1驱动SSD1306 OLED,分辨率128x64 引脚:PA5-SCK, PA7-MOSI, PA4-CS, PA3-DC, PA2-RST 时钟:APB2 84MHz 请生成初始化代码框架,包括GPIO配置、SPI配置、以及OLED的基本驱动函数声明。

这样AI输出的代码基本能直接用。如果你只说"帮我写个OLED驱动",它可能给你I2C的、可能给你软件模拟的、可能引脚完全不对。信息给足,返工就少。

3.2 第二步:代码审查与关键点核对

AI生成的代码不能直接烧录,必须过一遍审查。我重点看这几个地方:

时钟配置核对:AI有时候会按默认值给你配时钟,但你的实际晶振可能不是8MHz。比如它生成的PLL配置是按8MHz HSE算的,你板子上是25MHz晶振,那主频就完全不对了。这个必须对着CubeMX或者手册自己算一遍。

中断优先级:如果涉及多个中断,AI给的优先级分组和具体优先级数值需要你根据实际实时性要求调整。它不知道哪个中断更紧急。

外设使能顺序:有些外设有时钟使能顺序要求,先开时钟再配置寄存器。AI大部分时候能记住,但偶尔会漏。审查时留意__HAL_RCC_XXX_CLK_ENABLE()的位置。

引脚复用配置:GPIO_InitStruct.Alternate这个字段容易出错,SPI1的SCK和MOSI对应的是AF5,AI有时会写错。这个要对着数据手册的复用表核对。

3.3 第三步:编译、烧录与分步验证

代码审查完,编译通过后,不要一次性验证所有功能。我的习惯是分步来:

  1. 先验证GPIO:让LED闪烁或者用逻辑分析仪看引脚有没有输出
  2. 再验证SPI波形:用逻辑分析仪抓SCK和MOSI,确认时钟频率和数据的相位极性对不对
  3. 最后验证OLED显示:前面都对了,屏幕还不亮,那就是初始化命令序列的问题

这个分步验证的思路非常重要。因为AI生成的代码如果一次不工作,你面对的可能是一堆问题叠加。分步验证能把问题隔离在最小范围内。

3.4 第四步:反馈与迭代优化

当某一步验证不通过时,把具体的现象反馈给AI。反馈要包含:

  • 你期望的结果是什么
  • 实际观察到的现象是什么
  • 你做了哪些排查
  • 相关的代码片段

比如:"SPI时钟配置为84MHz分频到10.5MHz,但逻辑分析仪抓到的SCK只有2.6MHz,代码如下...请分析原因。"这种反馈方式,AI能快速定位到分频系数计算的问题。

我实测下来,这种"生成-审查-验证-反馈"的循环,一般两到三轮就能把一个外设驱动调通。比纯手工查手册写代码快不少,尤其是对那些你不熟悉的外设。

4. 核心环节的实操细节与参数计算

4.1 时钟树配置的参数推导

时钟配置是STM32开发中最容易出错的地方,也是AI最容易给出"看起来对但实际不对"的代码的地方。我拿一个具体例子来推一遍。

假设你用STM32F407,外部晶振8MHz,目标主频168MHz。计算过程:

  • HSE = 8MHz
  • 选择PLL源为HSE
  • PLL_M = 8,得到PLL输入 = 8MHz / 8 = 1MHz
  • PLL_N = 336,得到VCO输出 = 1MHz × 336 = 336MHz
  • PLL_P = 2,得到系统时钟 = 336MHz / 2 = 168MHz
  • AHB分频 = 1,HCLK = 168MHz
  • APB1分频 = 4,APB1 = 42MHz(最大42MHz)
  • APB2分频 = 2,APB2 = 84MHz(最大84MHz)

这套参数你要自己会算,因为AI给的PLL_N值不一定对。我遇到过AI给出PLL_N=400的情况,算出来系统时钟200MHz,超过F407的168MHz上限,直接死机。

提示:每次AI生成时钟配置后,自己用计算器把PLL_M、N、P、Q四个参数代进去算一遍,确认各总线频率不超限。这个习惯能帮你避开至少三成的"AI代码跑不起来"问题。

4.2 中断优先级的分组与分配

STM32的中断优先级用4位表示,通过NVIC_PriorityGroupConfig设置分组。常用的分组是NVIC_PriorityGroup_2,即2位抢占优先级、2位响应优先级。

分配原则:

  • 抢占优先级高的可以打断抢占优先级低的中断
  • 响应优先级只在同时挂起时决定谁先执行,不能打断
  • 同一个抢占优先级的中断不能互相打断

实际分配示例:

中断源抢占优先级响应优先级理由
电机控制PWM00最高实时性要求
串口接收10需要及时响应但不致命
定时器计数20一般实时性
按键扫描30最低,人操作慢

AI生成代码时,如果你不指定,它可能把所有中断都设成一样的优先级,那就失去了优先级的意义。所以这部分必须你自己根据系统实时性需求来定,然后告诉AI具体数值。

4.3 DMA传输的配置要点

DMA是提升嵌入式系统效率的关键,但配置项多,AI容易漏。核心配置项包括:

  • 通道选择:不同外设对应不同DMA通道,不能随便选。比如STM32F4的SPI1_TX是DMA2的通道3或5(流3或流5)。
  • 传输方向:外设到内存、内存到外设、还是内存到内存
  • 数据宽度:外设和内存的数据宽度要匹配,否则数据错位
  • 循环模式:连续传输用循环模式,单次传输用普通模式
  • 优先级:多个DMA流同时工作时需要设置

我让AI生成DMA代码时,会明确告诉它:"使用DMA2 Stream3 Channel3,SPI1_TX,内存到外设,8位数据宽度,普通模式,高优先级。"这样它就不会选错通道。

4.4 通信协议的代码生成技巧

对于UART、I2C、SPI这些通信协议,AI生成的代码质量普遍不错,因为它们有固定的模式。但有几个细节要注意:

UART接收:如果用中断接收,要处理接收完成和空闲中断的配合。AI经常只给接收完成中断,但实际项目中空闲中断(IDLE)才是判断一帧结束的关键。这个要主动要求AI加上。

I2C时序:硬件I2C的时序由外设控制,但软件模拟I2C的延时参数需要根据主频计算。AI给的延时循环次数不一定准,需要用示波器实测调整。

SPI的CPOL和CPHA:这两个参数决定了时钟极性和采样边沿,必须跟从机设备匹配。AI默认给的值不一定对,要查从机手册确认。

5. 常见问题排查与避坑经验

5.1 AI生成代码编译报错的典型原因

报错类型常见原因解决方法
未定义标识符库版本不匹配,AI用了新库的API确认库版本,让AI按你的库版本重新生成
重复定义AI把函数定义写在了头文件里把函数体移到.c文件,头文件只留声明
类型不匹配AI混用了uint8_t和uint16_t检查变量类型,统一数据宽度
链接错误缺少启动文件或链接脚本确认工程配置,检查是否漏加源文件

我遇到最多的是库版本问题。比如AI按HAL库最新版生成代码,用了HAL_GPIO_Init的新参数,但你用的是老版本HAL,参数数量对不上。解决办法很简单:在提示里明确告诉AI你的HAL库版本号。

5.2 代码能编译但运行异常的排查思路

这种情况比编译报错更麻烦,因为问题更隐蔽。我的排查顺序是:

  1. 先看时钟:用MCO引脚输出系统时钟,用示波器测频率对不对。时钟不对,后面全白搭。
  2. 再看电源:万用表测各供电引脚电压,确认在正常范围。
  3. 然后看复位:确认复位引脚电平正常,没有反复复位。
  4. 最后看外设:用逻辑分析仪抓通信波形,对比手册时序图。

有一次AI生成的代码,编译烧录都正常,但串口就是没输出。查了半天发现是AI把串口引脚配成了普通GPIO模式,没有配成复用模式。这种问题只能靠逻辑分析仪抓波形才能快速定位。

5.3 中断相关的疑难杂症

中断问题是嵌入式调试中最头疼的。AI生成的代码在中断方面常见的问题有:

  • 忘记清除中断标志:导致中断反复触发,程序卡死在中断里
  • 中断服务函数里做耗时操作:比如在中断里调用HAL_Delay,直接死锁
  • 优先级配置冲突:高优先级中断里等待低优先级中断的资源
  • 共享变量未加volatile:编译器优化导致变量读取异常

注意:AI生成的中断服务函数,一定要检查第一件事是不是清除中断标志,最后一件事是不是正确退出中断。这两个点错了,系统基本就跑飞了。

5.4 外设初始化顺序的坑

STM32的外设初始化有顺序要求,顺序错了可能不工作。通用原则是:

  1. 先使能外设时钟
  2. 再配置GPIO复用
  3. 然后配置外设参数
  4. 最后使能外设

AI有时候会把顺序打乱,比如先配置SPI参数再使能时钟,这样配置不生效。审查代码时留意__HAL_RCC_XXX_CLK_ENABLE()的位置,确保它在所有配置之前。

6. 提升AI协同效率的实用技巧

6.1 建立自己的提示词模板库

跟AI协作多了,你会发现某些提示词模式特别有效。我建议把这些整理成模板,下次直接套用。比如外设初始化模板:

芯片型号:[型号] 使用库:[库名和版本] 外设:[外设名] 引脚分配:[引脚列表] 时钟频率:[总线频率] 特殊要求:[如有] 请生成初始化代码,包含时钟使能、GPIO配置、外设参数配置,并添加中文注释。

这个模板覆盖了AI生成代码所需的关键信息,用熟了之后生成质量很稳定。

6.2 让AI帮你写调试代码

除了生成功能代码,AI在生成调试辅助代码方面也很强。比如:

  • 生成一个通过串口打印寄存器值的函数
  • 生成一个简单的命令行解析器,方便运行时改参数
  • 生成内存使用统计代码
  • 生成看门狗喂狗和超时检测逻辑

这些代码手工写费时间,但AI几秒钟就能生成,而且质量足够用。我经常让AI生成一个dump_registers()函数,调试时随时打印关键寄存器状态,比单步调试快多了。

6.3 用AI做代码审查

把你写好的代码贴给AI,让它帮你找问题。提示词可以这样写:"请审查以下STM32代码,重点检查中断处理、时钟配置、外设初始化顺序、潜在的竞态条件。指出问题并给出修改建议。"

AI在找这类模式化问题方面表现不错。我有一次写了一个SPI收发函数,AI指出我在等待TXE标志时没有加超时机制,如果SPI外设异常会导致死循环。这个提醒很有价值,后来我加上了超时处理。

6.4 版本管理与AI协作的配合

前面提过版本管理的重要性,这里补充一个具体做法:每次AI生成代码后,我会在commit信息里记录用了什么提示词、AI给出了什么方案、验证结果如何。这样积累下来,就形成了一份"AI协作日志",以后遇到类似问题可以翻记录,看当时是怎么解决的。

这个习惯坚持几个月后,你会发现自己的提示词越来越精准,AI生成的代码一次通过率明显提高。因为你知道哪些信息必须给、哪些坑要提前避开。

7. 一个完整的协同开发实例复盘

7.1 需求描述与初始生成

假设要做一个"基于STM32F103的温湿度采集并通过串口上报"的小项目。我给的初始提示是:

芯片:STM32F103C8T6 库:HAL库 需求:DHT11采集温湿度,每2秒通过USART1上报一次,波特率115200 引脚:PA0-DHT11数据线,PA9-USART1_TX,PA10-USART1_RX 系统时钟:72MHz 请生成完整的main函数框架和DHT11驱动。

AI生成的代码包含了DHT11的时序函数、主循环逻辑、串口初始化。整体框架没问题,但有几个细节需要调整。

7.2 审查发现的问题

审查时我发现了三个问题:

  1. DHT11的延时函数用的是HAL_Delay,但DHT11的时序要求微秒级延时,HAL_Delay是毫秒级,完全不够。需要改用__NOP()循环或者定时器实现微秒延时。
  2. 串口发送用的是阻塞式HAL_UART_Transmit,发送期间会阻塞主循环。对于这个简单项目可以接受,但如果后续要加其他任务,建议改成DMA发送。
  3. DHT11读取失败时没有重试机制,一次失败就返回错误。实际DHT11偶尔会读取失败,应该加两到三次重试。

7.3 反馈与修改

把这三个问题反馈给AI后,它重新生成了微秒延时函数(用SysTick或者DWT实现)、DMA发送配置、以及带重试的读取逻辑。第二轮生成的代码基本可用,烧录后串口正常输出温湿度数据。

这个实例说明:AI生成的代码框架可用,但细节需要你把关。你的嵌入式经验越丰富,能发现的问题越多,最终代码质量越高。AI不是替代你的经验,而是放大你的效率。

7.4 最终代码的优化方向

项目跑通后,还可以继续让AI帮忙优化:

  • 把DHT11驱动改成状态机方式,避免阻塞主循环
  • 加入数据校验和异常处理
  • 把串口协议改成带帧头和校验的格式,提高可靠性
  • 加入低功耗模式,采集间隔进入睡眠

这些优化AI都能给出不错的方案,你只需要判断哪些适合当前项目阶段。我的原则是:先跑通,再优化。不要一开始就追求完美架构,那样容易陷入过度设计。

8. 协同开发中的思维转变

用AI协同开发STM32程序,最大的变化不是写代码快了,而是你的角色变了。以前你是"写代码的人",现在你是"审代码的人"和"提需求的人"。这个转变需要适应。

提需求的能力变得比写代码的能力更重要。你得学会把模糊的想法拆解成AI能理解的具体指令。这个能力其实也是嵌入式工程师的核心能力之一,只是以前用在跟同事沟通上,现在用在跟AI沟通上。

审查代码的能力也变得更重要。AI生成的代码看起来往往很"像样",注释齐全、格式规范,但可能藏着逻辑错误。你得有足够经验看穿这些表面功夫,找到真正的问题。

我个人的体会是:AI协同不会让嵌入式开发变得简单,但会让它变得更快。前提是你自己得懂,不懂的话AI给的错误你也看不出来。所以基础还是要打牢,AI只是加速器,不是替代品。

最后分享一个我常用的小技巧:每次开始新的AI协作会话时,先让AI复述一遍你的需求,确认它理解对了再让它生成代码。这个"确认理解"的步骤能避免很多因为理解偏差导致的返工。花三十秒确认,省三十分钟排查,这笔账很划算。

相关新闻

从单次LLM调用到完整Agent:Harness Runtime架构选型与工程实践

从单次LLM调用到完整Agent:Harness Runtime架构选型与工程实践

1. 从一次裸调用说起:为什么单次 LLM 调用撑不起一个 Agent 很多人第一次接触 Agent 开发,都是从一段几十行的脚本开始的:拼一个 prompt,调一次模型接口,拿到返回文本,解析一下,结束。这个模式在…

2026/10/20 16:20:52 阅读更多 →
7代CPU装Win7核显驱动实战:改INF与镜像注入全流程指南

7代CPU装Win7核显驱动实战:改INF与镜像注入全流程指南

简介:针对Intel 7代CPU(如i5-7500、i7-7700)在Windows 7下安装集成显卡驱动的实际需求,这份资源面向需要解决系统兼容性问题的IT运维人员与装机用户。压缩包共收录660个文件,大小约354.69MB,包含Inf与Sys驱…

2026/10/20 16:20:52 阅读更多 →
AI Agent架构详解:从感知、规划到记忆与执行的工程实践

AI Agent架构详解:从感知、规划到记忆与执行的工程实践

1. 从“会聊天的模型”到“能办事的Agent”:我为什么要啃架构 去年帮一个做电商的朋友看他们的客服系统,他们接了一个大模型接口,本意是想让AI自动处理退换货咨询。结果上线第一周就翻车了:用户问“我上周买的鞋能退吗”&#xff…

2026/10/20 16:20:52 阅读更多 →

最新新闻

SLAM技术工程化实践:激光与视觉惯性里程计复现与调参指南

SLAM技术工程化实践:激光与视觉惯性里程计复现与调参指南

简介:本资源为高博《自动驾驶与机器人中的SLAM技术》源码修改版,面向自动驾驶、机器人及SLAM方向的开发者与深蓝学院学员,提供经定制调整的可运行代码,帮助读者从传感器数据、建图算法到优化模块直观理解完整实现流程。压缩包约23…

2026/10/20 17:09:34 阅读更多 →
机器学习与深度学习:区别、原理与实战指南

机器学习与深度学习:区别、原理与实战指南

机器学习、深度学习这两个词,这几年几乎已经被说烂了。但真被问到“区别到底是什么、我该先学哪个、实际项目里怎么用”,能一句话讲清楚的人并不多。作为常年跟数据打交道的人,我习惯把机器学习理解成“按菜谱学做菜”:你告诉系统…

2026/10/20 17:09:34 阅读更多 →
accountaccessor.dll报错怎么办?免费安全的系统修复方法

accountaccessor.dll报错怎么办?免费安全的系统修复方法

先说实话:accountaccessor.dll 这种系统组件报错,80% 以上的“免费下载”方案,反而是把电脑推向更坑的深渊。我在日常帮人修电脑的过程里,隔三差五就能遇到这类问题。很多人第一反应就是打开搜索,找到一堆“dll下载站”…

2026/10/20 17:09:34 阅读更多 →
ROS2数据手套遥操作:用滑动窗口滤波消除机械手舵机抖动

ROS2数据手套遥操作:用滑动窗口滤波消除机械手舵机抖动

第一次在 ROS2 里把数据手套的读数直接转发给机械手,我发现了一个有点尴尬的现象:我戴着手套慢慢张开手,机械手指却在那里高频哆嗦。屏幕上显示的弯曲角度曲线粗看还行,放大一看每一帧都在 5 上下跳动,这个噪声落到舵机…

2026/10/20 17:09:34 阅读更多 →
客服机器人主动发券唤醒沉睡客户:购买意图识别与实战拆解

客服机器人主动发券唤醒沉睡客户:购买意图识别与实战拆解

我接手这个需求的时候,第一反应是:客服机器人不是用来回答问题的吗?怎么还要主动发券?但实际业务场景里,这种“看似越权”的需求往往是增长团队最后捞人的一根稻草。电商平台积压了大量沉睡客户——买过几次、加过购物…

2026/10/20 17:09:34 阅读更多 →
从码农到扫地机器人掌门:跨界创业的底层系统思维

从码农到扫地机器人掌门:跨界创业的底层系统思维

很多人看到“从码农到扫地茅掌门,再到越野追梦人”这个标题,第一反应都是问同一句:你到底是写代码的、造机器人的,还是玩越野车的? 我的回答是:三个都做过,但没有任何一个是靠“换工作”换来的…

2026/10/20 17:08:33 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →