AIR780E点灯实战:LuatOS二次开发环境搭建与GPIO控制全流程
拿到AIR780E开发板的第一反应大部分人都会和我一样这玩意儿明明是个能跑4G、能打电话、能接MQTT的通信模组结果上来先干“点灯”这种入门活儿是不是有点大材小用但真把点灯流程完整走一遍你会发现它的价值远不止让LED亮一下。点灯背后串联的是驱动安装、固件烧录、脚本上传、串口日志、GPIO控制这一整条二次开发链路。只有这条路彻底打通了后面接传感器、做低功耗、连云平台才有基础。这篇文章就按我实际调试的路线把AIR780E用LuatOS二次开发点灯的完整过程捋一遍环境怎么搭、代码怎么写、坑怎么躲一次说清楚。内容比较基础适合刚入手合宙Cat.1模组、打算直接在模组上跑业务逻辑的开发者。1. 为什么一块4G通信模组要拿来“点灯”1.1 AIR780E到底是什么板子AIR780E是合宙推出的一款LTE Cat.1通信模组主控基于紫光展锐8910平台封装尺寸只有17.7mm × 15.8mm × 2.3mmLCC封装体积跟一枚小硬币差不多。通信能力上它支持LTE Cat.1下行速率最高10Mbps、上行5Mbps虽然跟高端4G模组没法比但应付扫码支付、共享设备、定位终端、智能表计这类场景绰绰有余。关键点在于AIR780E不是一颗纯通信芯片它内部有完整的MCU资源、GPIO、UART、I2C、SPI、ADC、PWM等接口。这意味着你可以把业务逻辑直接跑在模组上而不需要像传统方案那样外挂一颗STM32或者别的单片机去发AT指令。很多人在选型时容易忽视的一点是Cat.1是介于NB-IoT和高速4G之间的折中方案。比NB-IoT响应快、能跑语音比传统4G模组便宜、功耗低。所以它特别适合那些“需要实时在线、但数据量又不大”的设备。1.2 AT指令开发与LuatOS二次开发的取舍在LuatOS出现之前大家玩通信模组基本是“MCU 模组”的套路——MCU跑业务逻辑模组只负责收发数据两者之间用AT指令对话。这套方案成熟稳定但缺点也很明显多一颗MCU成本、PCB面积、功耗都上去了两套固件要分别维护、分别升级串口通信本身有带宽瓶颈复杂业务交互很别扭LuatOS二次开发则完全不同。LuatOS本质上是跑在模组内部的一套嵌入式软件框架用Lua脚本作为开发语言。写好的脚本上传到模组后模组自己就是MCU业务逻辑和通信逻辑在同一颗芯片里跑。我自己用下来的感受是Lua开发效率确实比C高尤其是改逻辑、调参数这种场景不用重新编译改完上传就能跑配合OTA还能远程更新固件和脚本。代价则是资源规划和任务管理要更上心毕竟模组的内存、CPU都有限不能拿它当树莓派用。1.3 点灯在二次开发中扮演的角色点灯是嵌入式界的“Hello World”但在AIR780E二次开发里它的意义比表象大得多。一次成功的点灯等于一次性验证了六件事验证项说明驱动正常USB转串口驱动装好电脑能识别模组烧录正常LuatOS固件能写入模组内部存储脚本上传正常项目脚本能被写入文件系统并加载文件系统正常模组能读取并执行main.lua日志通道正常串口/日志口能输出print信息GPIO输出正常引脚能按代码输出高低电平这六项全部通过意味着整条开发链路是通的。链路一通后面的ADC采集、UART通信、MQTT连接、低功耗管理都是在同一个框架上做加法而已。2. 先把环境和烧录链路捋顺2.1 硬件准备清单正式开始前先把工具备齐。我踩过不少“缺这少那”的坑列一张清单给你参考AIR780E开发板或核心板建议直接买合宙官方EVB引脚引出完整方便接线USB数据线必须支持数据传输。很多Micro-B线只能充电插上后设备管理器里什么都不出现这是最常见的问题来源Windows电脑合宙的工具链在Windows下最省心macOS和Linux需要自己折腾权限和驱动Luatools合宙官方PC端工具负责烧录固件、上传脚本、查看日志LuatOS固件从合宙官网或GitHub下载对应AIR780E的.soc固件文件VS Code写Lua脚本用装个Lua语法插件就够2.2 安装USB转串口驱动AIR780E用的是展锐8910平台Windows需要安装合宙提供的USB转串口驱动否则插上开发板后设备管理器里只会看到一个带感叹号的未知设备。驱动安装没什么技术含量一路Next就行。装完重新插拔USB线设备管理器里应该会识别出两个串口设备——一个是AT指令口一个是日志口。区分方法很简单看端口名里通常带AT或Log字样或者直接用Luatools里的串口列表去看。注意如果设备管理器里一直出现未知设备先换一根USB线再换一个USB口最后才考虑驱动问题。这个排查顺序能解决80%的识别问题。2.3 固件选型要匹配模组型号LuatOS固件文件命名一般像LuatOS-SoC_V1003_AIR780E.soc这种格式。下载时一定要看清楚模块平台AIR780E对应8910平台不能跟其他模组混刷。刷错固件的表现千奇百怪有的开机没反应有的日志疯狂报错最轻的也是功能异常。如果你不确定自己的板子是什么平台可以在合宙官网的“模组型号”页面查或者问客服别猜。2.4 Luatools烧录步骤固件烧录是点灯前必经的一步。Luatools的操作逻辑其实很简单核心就三步打开Luatools切换到“固件烧录”页签选择下载好的.soc固件文件开发板按住BOOT键不放用USB线连接电脑连接后再松开BOOT正常情况下Luatools会识别到进入下载模式的设备自动开始烧录并显示进度条。整个过程大概十几秒看到“下载成功”之类的提示就完成了。如果卡在“等待设备”不动按这个顺序排查换USB线、换USB口优先排查检查设备管理器里驱动是否正常确认是否按住了BOOT键再上电确认Luatools没有被杀毒软件拦截烧录完后把USB重新插拔一下用Luatools打开日志串口模组上电时应该能刷出一串LuatoOS的启动日志出现版本号、内存信息这些说明固件跑起来了。2.5 “烧固件”和“传脚本”是两码事很多新手在这上面卡壳明明烧录成功了为什么板子啥反应没有因为LuatOS的二次开发流程里固件烧录和脚本上传是两步操作。固件相当于操作系统脚本才是你的业务代码。烧录完成后模组里还没有你的main.lua自然什么都跑不起来。需要在Luatools的“脚本上传”页签里选择包含main.lua的项目目录重新连接板子后上传。上传成功的标志同样是进度条走完然后手动给板子重新上电模组就会从文件系统加载main.lua并执行。提示脚本上传时板子不需要进入BOOT下载模式正常上电状态即可。每次改完代码重新上传脚本然后重启就能生效比烧固件频繁得多。3. 点亮LED的第一版Lua脚本3.1 main.lua的最小结构LuatOS项目最核心的文件就是main.lua这是模组上电后的入口脚本。一个最小可运行的main.lua长这样local sys require(sys) -- 你的业务代码写在这里 sys.run()sys.run()是整个Lua虚拟机的事件调度循环必须要有。它会启动任务调度、处理定时器、维护协程切换没有它LuatOS起飞不了。业务代码可以写在require之后、sys.run之前但如果是需要延时的操作就得包在sys.taskInit()里面。原因后面说。3.2 引脚编号怎么选看原理图别猜AIR780E的模组引脚和GPIO逻辑编号不是一回事。模组上印的可能叫“PIN 56”、“PIN 57”但LuatOS的gpio.setup用的是逻辑GPIO编号。这个映射关系必须查开发板的原理图或者模组手册里的引脚功能表。我见过太多人栽在这里代码里写了gpio.setup(7, 0)实际板子上的LED接的是GPIO 27。程序跑得飞起灯纹丝不动。如果你手头没有原理图或者懒得查可以写一个小脚本暴力扫描local sys require(sys) sys.taskInit(function() for i 0, 40 do local pin gpio.setup(i, 0) pin(1) sys.wait(100) pin(0) sys.wait(100) log.info(gpio_scan, test pin:, i) end end) sys.run()这个脚本会按顺序把0到40每个GPIO拉高100ms再拉低你盯着板子看哪颗灯在闪就知道对应的GPIO编号了。重要警告上面这个扫描脚本只适合在你确认安全的情况下跑因为部分GPIO可能连接了电源轨或者关键引脚乱拉电平有风险。正式项目里务必以原理图为准。3.3 完整的点灯代码假设你的LED接在GPIO 27这个编号在合宙很多官方板/模组文档里很常见代码可以这样写local sys require(sys) -- 按你的开发板原理图调整LED对应的GPIO编号 local led_pin 27 -- gpio.setup的第二个参数是初始电平0表示低电平 -- 函数返回一个控制引脚电平的闭包函数 local led gpio.setup(led_pin, 0) log.info(main, AIR780E LuatOS点灯程序启动) sys.taskInit(function() led(1) -- 输出高电平点亮LED sys.wait(1000) -- 延时1秒 led(0) -- 输出低电平熄灭LED sys.wait(1000) log.info(main, 点灯完成) end) sys.run()上传这段脚本到模组重启后观察LED应该会亮1秒、灭1秒然后维持熄灭状态。日志窗口里能看到对应的打印信息。3.4 为什么用sys.taskInit包起来关键问题来了为什么不能直接在main.lua顶层这么写-- 错误示例 led(1) sys.wait(1000) led(0)因为sys.wait是LuatOS的协程延时函数它需要在任务上下文里调用。直接写在顶层相当于在一段普通同步代码里“睡着”了但没人负责在它醒来后恢复执行整个调度器就僵住了。sys.taskInit的作用是创建一个独立的协程任务只有在协程里sys.wait才能暂停当前任务并让出CPU给其他任务延时结束后再自动恢复执行。所以你要记住一条铁律凡是涉及延时的业务逻辑都放进sys.taskInit或者定时器回调里。如果你只是想让LED亮起来不需要延时那直接写成led(1)放在顶层也完全OK。3.5 上传运行后的正确效果代码上传完毕按下模组复位键或者重新上电观察Luatools串口日志。正常情况下你会看到类似这样的信息[I] main AIR780E LuatOS点灯程序启动 [I] main 点灯完成同时板载LED或外接LED按预期变化。如果日志能看到这两行而灯不亮问题就集中在GPIO编号错误、引脚复用冲突或者接线问题排查方向一下子就缩小了。4. 从快闪到呼吸灯GPIO进阶玩法4.1 用定时器替代while循环做周期闪烁简单的闪烁需求其实不用while true死循环用定时器更干净。LuatOS提供sys.timerLoopStart可以周期性地回调一个函数local sys require(sys) local led_pin 27 local led gpio.setup(led_pin, 0) local flip 0 sys.timerLoopStart(function() flip flip 1 local level flip % 2 led(level) log.info(timer, level:, level) end, 500) sys.run()每隔500ms翻转一次LED电平实现快闪效果。定时器的好处是它不占任务其他逻辑可以并行跑。如果需要定时器只执行一次用sys.timerStart想取消定时器用sys.timerStop保存返回的定时器ID。4.2 按键中断配合LED实现状态翻转LED通常要跟按键配合才有意义。LuatOS里GPIO中断的注册方式是通过gpio.setup传入回调函数实现的local sys require(sys) local led_pin 27 local key_pin 18 -- 按键接GPIO18, 具体以原理图为准 local led gpio.setup(led_pin, 0) local led_state 0 -- 注册按键中断, 下降沿触发, 上拉输入 gpio.setup(key_pin, function(val) if val 0 then led_state (led_state 0) and 1 or 0 led(led_state) log.info(key, LED state:, led_state) end end, gpio.PULLUP, gpio.FALLING) sys.run()gpio.setup在输入中断模式下的参数是固定的引脚号、回调函数、上下拉模式、触发边沿。gpio.FALLING表示下降沿触发即按键按下电平从高跳变到低时触发回调。这里有个实战细节实际按键按下会产生抖动如果不做软件消抖可能会触发好几次中断。简单方案是在回调里加个时间戳过滤local last_time mcu.ticks() gpio.setup(key_pin, function(val) if val 0 then local now mcu.ticks() if now - last_time 50 then -- 50ms消抖 -- 业务逻辑 end last_time now end end, gpio.PULLUP, gpio.FALLING)用两次中断的时间差来过滤抖动实测效果稳定。4.3 PWM呼吸灯实现呼吸灯的核心是让LED亮度周期性地变化这需要PWM占空比连续调节。AIR780E有PWM外设LuatOS的pwm库封装了对应接口。下面的代码是一个基础的呼吸灯效果local sys require(sys) sys.taskInit(function() -- 打开PWM通道1, 周期单位以当前固件API文档为准 pwm.open(1, 1000, 0) while true do -- 逐渐变亮 for i 0, 100, 5 do pwm.set_duty(1, i) sys.wait(20) end -- 逐渐变暗 for i 100, 0, -5 do pwm.set_duty(1, i) sys.wait(20) end end end) sys.run()注意不同版本的LuatOSpwm.open的周期参数单位可能不一样有的用微秒有的用纳秒务必对照你刷的固件版本对应的API文档。这也是我反复强调“别背API要查文档”的原因。另外PWM通道往往和其他功能共用引脚如果你发现某个PWM通道输出没反应先查引脚复用关系再查通道能不能用于这个物理引脚。4.4 顺带一提ADC采集离灯不远LED往上走一步就是光感控制。AIR780E自带ADC配合光敏电阻可以实现“环境暗了自动点灯”这种更有实际意义的逻辑。LuatOS读ADC很简单local adc_val adc.read(0) -- 通道0 log.info(adc, value:, adc_val)读取出来的数值是原始ADC值换算成电压需要看ADC参考电压和分辨率在模组硬件手册里都能查到。这也是从点灯往传感器方向过渡时最常遇到的基础操作。5. 实测踩过的四个坑和排查思路5.1 坑一烧录永远卡在“等待设备”和群里很多人交流下来烧录卡住是最普遍的问题。我自己的排查顺序固定如下USB线先换线很多线只能充电不能传数据这是概率最高的原因驱动设备管理器里看有没有串口设备没有就重装驱动BOOT按键确认是按住了BOOT再插USB线顺序不能反串口占用关闭其他占用串口的软件比如串口调试助手、AT指令工具再重新烧录这个顺序按概率从高到低排基本能覆盖90%的烧录失败场景。5.2 坑二脚本上传成功但LED死活不亮脚本上传成功了日志也能打出来就是灯不亮。这种“看似一切正常”的问题最难受。排查思路分两步引脚编号对不对。逻辑GPIO编号和模组物理引脚不是一回事重新对着原理图核一遍或者用扫描脚本暴力找灯。引脚复用有没有冲突。AIR780E很多引脚是复用的同一个引脚可能同时是UART引脚、PWM引脚或者BOOT配置引脚。如果你代码里初始化了某个外设占用了同一个物理引脚GPIO输出会被覆盖电平根本出不来。另外接线极性也要确认有的开发板LED是低电平点亮共阳接法有的是高电平点亮共阴接法。代码里写led(0)如果发现灯反而亮了就把电平反过来。5.3 坑三日志窗口看不到print输出代码明明在跑日志窗口里就是没内容。这个问题通常出在日志串口和波特率上Luatools打开日志口时选择的串口号要正确别选成AT口日志波特率一般固件默认固定Luatools会自动匹配但如果用了第三方串口工具就要手动设置正确波特率部分开发板的日志口和AT口是分立的插上USB后会出现两个串口挨个试一个简单的判断方法模组上电后日志口应该能刷出bootloader的启动信息和Lua解释器的版本信息。如果啥都没有先怀疑串口选择再怀疑线材。5.4 坑四网上的Demo代码跑不通这是最容易被低估的坑。LuatOS迭代速度相当快不同固件版本的API是有差异的。你在某个博客里看到的是V0004时代的代码手里的固件已经是V1003了API变化很正常。遇到这种问题最靠谱的做法是查看当前固件自带的API定义固件包里有对应的.h文件或者文档到合宙的官方Demo仓库找对应模组的最新示例看固件升级日志里标注的API变更说明我自己就遇到过gpio.setup的传参方式在某个版本后发生了调整硬套老代码怎么都不对最后翻升级日志才解决。所以API以手里的固件版本为准不要无脑抄网上的旧代码。6. 点灯只是开始这条二次开发路线接下来还能做什么6.1 让模组联网这才是4G的看家本领AIR780E最大的价值是它的4G Cat.1通信能力。LuatOS封装了MQTT、TCP、UDP、HTTP等常用协议栈代码量少得惊人。举个例子连上MQTT服务器只需要二十几行代码local sys require(sys) local mqtt require(mqtt) sys.taskInit(function() mqttcl mqtt.create(nil, your-broker-address, 1883, device001) mqttcl:connect() mqttcl:subscribe(/test/topic) mqttcl:on(recv, function(topic, data) log.info(mqtt, 收到消息:, topic, data) end) mqttcl:publish(/test/topic, hello from AIR780E) end) sys.run()点灯验证过的开发环境、脚本上传流程、串口日志调试方法在这里全部复用。唯一多出来的环节是网络调试可以用电脑上的MQTT客户端做Broker辅助验证。6.2 从“点灯”到“感知”的最小改造灯作为输出设备已经验证了GPIO输出能力。下一步加一个输入能力就迈进物联网的世界了。比如用ADC接口接个热敏电阻读环境温度或者用UART接一个GPS模块解析经纬度再配合MQTT把数据上报到云平台。整个链条的技术基础都是建立在前面点灯跑通的那套开发流程之上。这也是我为什么反复强调点灯不是走形式——它的价值在于用最低的复杂度验证了最大的开发链路范围。6.3 工程化阶段更要注意的事情从Demo走向产品还有几件事要提前规划任务划分LuatOS是协程调度模型每个sys.taskInit都是一个独立任务。任务太多、协作不当会导致互相饿死建议按功能模块拆分任务用消息队列或者全局状态协调内存管理Lua脚本运行时内存有限字符串拼接、大表要谨慎长字符串优先考虑写入文件系统而不是铺在内存里OTA升级LuatOS支持脚本和固件的OTA远程升级量产设备必须把OTA通道接好否则后续改Bug会变成一场噩梦低功耗策略AIR780E支持PSM和eDRX省电模式如果做电池供电产品这部分功耗调优可以占整个项目一半以上的工时这些方向每一个都能单独写一篇很长的文章。但它们的起点都是你现在手里这块能把一个LED点亮的小板子。我个人的建议是在点灯阶段多花点时间把开发工具、日志调试、引脚管理这些基本功打磨熟练后面做复杂功能时真的能省下好几倍的返工时间。

相关新闻

ArcGIS克里金插值完整实战指南:从数据准备到竞赛出图

ArcGIS克里金插值完整实战指南:从数据准备到竞赛出图

做数学建模这几年,我最大的一个感受是:数据插值这件事,十道题里有八道会碰到,但真正能把它做明白的队伍不多。无论是气象站的降水数据、土壤重金属采样点、还是环境监测站的污染物浓度,题目给你的永远是一堆离散点&…

2026/10/4 6:54:41 阅读更多 →
C++函数与指针完全攻略:从参数传递到内存模型一次搞懂

C++函数与指针完全攻略:从参数传递到内存模型一次搞懂

我刷同济大学CMOOC的时候,第五、六讲是第一个真正让我停下来反复琢磨的地方。前面几讲学数据类型、学循环,代码行数少,逻辑也直白;到了第五讲“函数”和第六讲“指针与引用”,画风突然就变了——你要从“写代码”切换到…

2026/10/4 6:53:40 阅读更多 →
Vensim系统动力学仿真:从下载安装到实战建模全指南

Vensim系统动力学仿真:从下载安装到实战建模全指南

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

2026/10/4 6:53:40 阅读更多 →

最新新闻

Git分支管理规范:六类分支职责、合并方向与git flow落地指南

Git分支管理规范:六类分支职责、合并方向与git flow落地指南

简介:面向开发团队的Git分支流程开发规范文档,提供了一套标准化的分支管理方案,其核心价值是解决多人在同一仓库协作时的分支混乱与合并冲突问题。资源共包含一个Word文档,压缩包仅239KB,内容精炼,便于随时…

2026/10/4 7:34:03 阅读更多 →
MRAM与Cortex-M7结合:工业设备掉电保护与无限次写入方案

MRAM与Cortex-M7结合:工业设备掉电保护与无限次写入方案

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

2026/10/4 7:34:03 阅读更多 →
C语言多文件链表模块化开发实战

C语言多文件链表模块化开发实战

1. 为什么“多.c文件链表”是C语言工程能力的分水岭刚学完单个.c文件里写个链表,很多人会觉得“不就malloc几个节点、改改next指针嘛”,但真正把链表拆到多个源文件里编译链接,才是从“能跑通”迈向“能干活”的关键一跃。我带过几十个嵌入式…

2026/10/4 7:34:03 阅读更多 →
AI编程工具插件加载失败的根源与解决路径

AI编程工具插件加载失败的根源与解决路径

1. “plugins”不是功能菜单,而是现代AI编程工具的神经突触你点开Cursor、ZCode、Codex这些工具的设置页,看到“Plugins”那一栏时,大概率会下意识把它当成VS Code里那种“装了就能用”的扩展商店——点安装、重启、生效。但实际踩过坑的人很…

2026/10/4 7:34:03 阅读更多 →
MATLAB Arduino支持包本质与协议级故障排查指南

MATLAB Arduino支持包本质与协议级故障排查指南

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

2026/10/4 7:34:03 阅读更多 →
24天16万行代码:用Claude Code从零构建K12教育产品的实战工作流

24天16万行代码:用Claude Code从零构建K12教育产品的实战工作流

1. 先聊聊这个项目到底在做什么24 天,630 次提交,16 万行代码。这三个数字放在一起,任何一个写过代码的人都会先愣一下——平均每天 26 次提交、6600 多行代码产出,而且是在不到一个月的时间里从零搭出一个 K12 教育产品。如果这是…

2026/10/4 7:33:03 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →