STM32F4硬件AES加解密:寄存器级状态机与PKCS#7填充实践
简介本资源是一套面向嵌入式开发工程师与STM32进阶学习者的AES加解密实战测试工程聚焦STM32F4系列如YS-F4Pro开发板在资源受限环境下实现安全通信的核心能力。程序完整集成HAL库加密驱动含stm32f4xx_hal_cryp_ex.c、ARM CMSIS-DSP算法表arm_common_tables.c等、定时器与I2C外设支持并通过USART1PB6/PB7实现不定长串口数据接收结合PKCS#7填充/解填充机制确保AES-128 ECB/CBC模式下加解密的完整性与可复现性。压缩包共775个文件主体为368个C源码、142个头文件h、70个汇编启动文件s及46个IAR链接脚本icf辅以调试配置、映射文件与HEX固件总大小21.3MB结构符合标准MDK/IAR双平台工程规范。目前已有258人学习下载提供开箱即用的完整测试框架、典型外设协同逻辑、填充算法实现细节及多格式输出验证路径是理解MCU级密码学落地与安全通信开发的关键参考工程。1. STM32F4 AES加解密测试程序为什么一个“能跑通”的例程反而最容易掩盖硬件加速器的致命误用你烧录完 STM32F4 的 AES 测试程序串口打印出Encrypt OK和Decrypt OK心里一松——加密功能稳了。但三个月后在量产固件里同一段 AES-CBC 加密后的密文和 PC 端 OpenSSL 解出来的对不上更诡异的是把密钥长度从 128bit 改成 256bit程序不报错却开始输出全零密文。这不是代码逻辑 bug而是你根本没意识到STM32F4 的硬件 AES 外设不是“开箱即用”的黑匣子它有一套严格的状态机约束、寄存器时序依赖和数据对齐铁律——而绝大多数“能跑通”的测试程序恰恰是靠巧合比如固定长度、小端对齐、未清标志位蒙混过关。这份 STM32F4 AES 加解密测试程序的价值正在于它把所有隐性依赖显性化它用最简路径暴露硬件加速器的真实行为边界让你在量产前就看清——AES 不是函数调用而是一场与寄存器握手协议的精密协作。搞懂它不是为了多写几行代码而是为了在系统级联调时一眼识别出是密钥调度错了还是 DMA 传输撕裂了输入块。2. 硬件 AES 外设的本质不是协处理器而是状态驱动的密码流水线STM32F4 系列以 F407/F429 为代表集成的 AES 外设常被误称为“硬件加速模块”。但它的底层模型远比“加速”二字复杂它本质上是一个四阶段同步流水线 独立状态机 双缓冲寄存器组的组合体。理解这一点是读懂所有寄存器操作和时序要求的前提。2.1 寄存器视图AES 外设不是内存映射的“函数表”而是带锁的通道AES 外设在内存映射中占据 0x5006_0000 ~ 0x5006_003C 地址空间共 16 个 32-bit 寄存器。但关键在于并非所有寄存器可随时读写。例如AES_CRControl Register写入即触发操作但必须在AES_SR[2]BUSY 标志为 0 时才能安全写入AES_DINRData Input Register每次写入会将 32-bit 数据推入内部 FIFO但若 FIFO 满AES_SR[1] 1再写将导致数据丢失且不报错AES_DOUTRData Output Register仅当AES_SR[3]CCE flag置位后才有效否则读取返回未定义值。提示AES_SRStatus Register是唯一可实时反映硬件状态的“真相之源”。任何操作前不查SR等于闭眼开车。2.2 状态机流转一次加密不是“start → done”而是五步握手硬件 AES 的执行流程由AES_CR[EN]启动但实际完成需经历完整状态跃迁步骤触发条件状态寄存器变化关键约束1. 初始化写AES_CR[EN]1AES_SR[2]BUSY→ 1必须确保AES_SR[0]CCF为 0否则上次结果未读取2. 密钥加载写AES_KEYRii0~3AES_SR[4]KEYVALID→ 1128bit 密钥写KEYR0~3256bit 需额外写KEYR4~7F4293. 输入填充循环写AES_DINR4次AES_SR[1]WRERR可能置位每次写入后需等待AES_SR[1]清零FIFO 空闲4. 运算执行最后一次DINR写入后自动启动AES_SR[2]保持 1 直至完成典型耗时128bit ECB 约 42 个 AHB 周期72MHz 下 ≈ 0.6μs5. 输出读取AES_SR[3]CCE置位读AES_DOUTR4次清零 CCE必须按顺序读取 DOUTR0~3跳读或重读会导致后续块错位这个状态机没有中断自动管理——CCE置位后若不及时读取DOUTR下一块输入会覆盖未读数据且CCE不会再次置位造成静默丢包。2.3 数据对齐为什么“memcpy 到 buffer”会失败AES 硬件要求输入/输出数据严格按128-bit16 字节块对齐且每个块内字节序为小端Little-Endian。这意味着若你用uint8_t plain[32]存放明文直接memcpy(AES-DINR, plain, 16)是错误的正确做法是将plain[0..15]按字32-bit拆分为 4 个uint32_t并手动字节翻转因为DINR寄存器期望的是[word0][word1][word2][word3]而word0对应明文的byte0~3但硬件内部按小端解析所以word0实际应为plain[3]24 | plain[2]16 | plain[1]8 | plain[0]。// 正确的 16-byte 明文到 DINR 加载小端对齐 void aes_load_input(const uint8_t *in) { uint32_t w0 __REV(*(uint32_t*)(in 0)); // __REV: ARM CMSIS 内联汇编字节翻转 uint32_t w1 __REV(*(uint32_t*)(in 4)); uint32_t w2 __REV(*(uint32_t*)(in 8)); uint32_t w3 __REV(*(uint32_t*)(in 12)); AES-DINR w0; while(AES-SR AES_SR_WRERR); // 等待 FIFO 空闲 AES-DINR w1; while(AES-SR AES_SR_WRERR); AES-DINR w2; while(AES-SR AES_SR_WRERR); AES-DINR w3; while(AES-SR AES_SR_WRERR); }这段代码的关键不在__REV而在于每次写DINR后都检查WRERR。很多“能跑通”的例程省略了这一步只因测试数据短、CPU 慢恰好 FIFO 未满——一旦数据流变快如接 UART DMAWRERR就会悄然置位后续数据被丢弃而程序毫无感知。3. 串口接收不定长数据如何让 AES 硬件不卡死在“半块”上STM32F4 的 AES 外设只处理完整 128-bit 块。但串口接收的数据天然不定长如 JSON 报文、AT 指令这就引出一个核心矛盾硬件 AES 要求整块喂入而应用层数据是流式到达。常见错误是“攒够 16 字节再加密”但这在实时系统中不可行——你无法预知下个字节何时来而 AES 外设又不能中途暂停。3.1 真实场景还原UART DMA AES 的三重时序陷阱典型架构是UART RX 引脚 → DMA Channel → RAM Buffer → CPU 检查长度 → 启动 AES。陷阱就藏在“CPU 检查长度”这一步若 DMA 设置为Circular ModeBuffer 满后自动回绕但 CPU 无法知道“当前有效数据起始位置”若设置为Normal ModeDMA 传输完成中断TCIF触发时CPU 才开始处理但此时 Buffer 中可能只有 13 字节——AES 拒绝处理非 16 字节块更糟的是若你强行用 13 字节调用 AES补零则解密端必须知道补了多少零而标准 PKCS#7 填充需在加密前完成硬件 AES 不做填充只做纯运算。解决方案不是“等”而是预分配 边界检测 填充卸载UART DMA Buffer 设为 2×16 字节32B启用Half TransferHTIF和Transfer CompleteTCIF双中断HTIF 触发时检查已接收字节数n若n 16立即取前 16 字节送 AES剩余n-16字节移至 Buffer 开头若n 16不启动 AES等待 TCIFTCIF 触发时对剩余n字节执行 PKCS#7 填充软件实现凑满 16 字节后送 AES。// PKCS#7 填充软件必须做硬件 AES 不负责 void pkcs7_pad(uint8_t *data, uint8_t *len) { uint8_t pad_len 16 - (*len % 16); for (uint8_t i 0; i pad_len; i) { data[(*len) i] pad_len; } *len pad_len; } // 在 TCIF 中断里调用 if (rx_count 0) { pkcs7_pad(rx_buffer, rx_count); // 填充至 16 的整数倍 for (uint8_t i 0; i rx_count; i 16) { aes_encrypt_block(rx_buffer[i]); // 每 16 字节调用一次 } }注意pkcs7_pad修改的是rx_buffer原地内容因此必须确保 Buffer 有足够空间故设为 32B。这是用空间换确定性的经典 trade-off。3.2 避坑串口不定长数据 AES 处理的 4 个血泪经验现象 → 原因 → 解决全部来自真实调试日志现象串口发送HELLO5 字节AES 加密后密文长度为 16 字节但 PC 端 OpenSSL 解密出乱码且末尾多出 11 个0x0B。原因未做 PKCS#7 填充而是用memset(buffer5, 0, 11)补零PKCS#7 要求填充字节值等于填充长度此处应为0x0B而补零违反标准。解决严格实现pkcs7_pad()填充字节值 填充长度且解密后按最后一个字节值截断。现象连续发送两个 10 字节报文AES 输出密文错位第二报文的前 6 字节与第一报文后 10 字节拼成一个块。原因DMA Buffer 未清空第二报文写入时覆盖了第一报文的后半部分CPU 误将跨报文的 16 字节当作一个块。解决每次 TCIF 后将rx_count重置为 0并用memmove()将未处理数据移到 Buffer 开头而非简单累加索引。现象开启 UART 中断接收非 DMA时AES 加密偶尔卡死在while(AES-SR AES_SR_BUSY)。原因UART RX 中断优先级高于 AES导致 AES 状态寄存器被频繁打断读取BUSY标志未及时清除外设进入假死。解决将 AES 相关中断如 CCE 中断优先级设为最高或改用轮询模式对实时性要求高的场景更可靠。现象使用AES_CR[MODE]0b10CBC 模式时相同明文每次加密结果不同。原因CBC 需 IV初始化向量但代码中 IV 被定义为全局变量且未重置第二次加密复用第一次的密文末块作为 IV。解决IV 必须随机生成如用 RNG 外设且每次加密前重新加载AES_IVR0~3绝不复用。4. 测试程序的验证逻辑如何证明“加密正确”不是幻觉一份合格的 AES 测试程序其价值不在于“能输出密文”而在于提供可证伪的验证链路。本程序的核心验证设计包含三层4.1 第一层寄存器级自检——确认硬件状态机按预期流转在每次 AES 操作前后强制读取AES_SR并校验关键位// 加密前自检 if (AES-SR (AES_SR_CCF | AES_SR_RDERR | AES_SR_WRERR)) { // 错误上次结果未读取或读写错误 return AES_ERR_STATE; } if (AES-SR AES_SR_BUSY) { // 错误外设正忙不能启动新任务 return AES_ERR_BUSY; } // 加密后等待完成 uint32_t timeout 0xFFFFF; while (!(AES-SR AES_SR_CCF) --timeout); if (!timeout) return AES_ERR_TIMEOUT; // 读取密文后确认 CCF 已清零 if (AES-SR AES_SR_CCF) { // 严重错误DOUTR 未读取CCF 未自动清零 return AES_ERR_DOUTR_UNREAD; }这段代码的价值在于它把“硬件是否就绪”、“操作是否超时”、“结果是否被读取”全部转化为可捕获的错误码。很多项目崩溃在while(1)死循环正是因为缺少这种防御性检查。4.2 第二层算法级交叉验证——与软件 AES 结果比对程序内置一个轻量级软件 AES 实现基于 AES-NI 优化版裁剪约 8KB 代码对同一组明文、密钥、IV 执行加密再与硬件结果逐字节比对// 测试向量NIST SP800-38A 附录 C 的 ECB 128bit 示例 const uint8_t test_key[16] {0x2b,0x7e,0x15,0x16,0x28,0xaedly,0xe8,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; const uint8_t test_plain[16] {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a}; uint8_t hw_cipher[16], sw_cipher[16]; aes_hw_encrypt(test_plain, test_key, hw_cipher); // 硬件加密 aes_sw_encrypt(test_plain, test_key, sw_cipher); // 软件加密 if (memcmp(hw_cipher, sw_cipher, 16) ! 0) { // 硬件结果错误可能是密钥加载顺序错KEYR0~3 vs KEYR4~7、或字节序错 error_handler(); }注意此验证必须在同一时钟源、同一电压、同一温度下运行。曾有案例显示F429 在 1.8V 供电下AES 硬件在高温时出现WRERR漏检导致密文错位——软件 AES 无此问题对比即暴露。4.3 第三层协议级互操作——与 OpenSSL 建立可信锚点程序通过 UART 发送标准格式密文给 PC由 Python 脚本调用 OpenSSL 验证# pc_verify.py from Crypto.Cipher import AES from Crypto.Util.Padding import unpad key bytes.fromhex(2b7e151628aed2a6abf7158809cf4f3c) iv bytes.fromhex(000102030405060708090a0b0c0d0e0f) cipher_text bytes.fromhex(...) # 从串口接收 cipher AES.new(key, AES.MODE_CBC, iv) plain unpad(cipher.decrypt(cipher_text), AES.block_size) print(plain.decode())关键点在于必须使用完全相同的模式CBC、填充PKCS#7、IV 生成方式。测试程序中 IV 由 STM32 RNG 外设生成并通过 UART 发送给 PC确保两端 IV 绝对一致。这是打通嵌入式与上位机加密链路的唯一可信路径。5. 设计取舍的代价为什么不用 HAL 库为什么坚持裸寄存器操作这份测试程序刻意回避了 STM32CubeMX 生成的 HAL_AES_xxx 函数选择直接操作寄存器。这不是复古情怀而是三个硬性取舍5.1 取舍一确定性 vs 抽象性——HAL 的“智能等待”是定时炸弹HAL 库中HAL_AES_Encrypt()内部有类似逻辑while(__HAL_AES_GET_FLAG(haesc, AES_FLAG_CCF) RESET) { if((HAL_GetTick() - tickstart) Timeout) { return HAL_TIMEOUT; } }问题在于HAL_GetTick()依赖 SysTick而 SysTick 可能被更高优先级中断抢占。在电机控制等强实时场景中SysTick 中断延迟可达数百微秒导致HAL_AES_Encrypt()误判超时返回HAL_TIMEOUT——而硬件 AES 实际早已完成只是CCF标志未被及时读取。裸寄存器操作用while(--timeout)纯计数规避了所有中断干扰保证时序绝对可控。5.2 取舍二内存占用 vs 功能完整——HAL 的 12KB 代码 vs 本程序的 1.2KBHAL_AES 模块编译后占 Flash 约 12KB含错误处理、回调、句柄管理而本测试程序核心加密逻辑仅 1.2KB。对于 Flash 仅 512KB 的 F407节省的 10KB 可用于 OTA 升级分区或日志缓存。更重要的是HAL 的密钥管理采用haes-pKey指针在低功耗模式下若 RAM 被关闭指针失效而本程序密钥直接写入AES_KEYRi寄存器不依赖 RAM。5.3 取舍三可调试性 vs 封装性——寄存器名就是最精准的 debug 信息当AES_SR[1]WRERR置位时你立刻知道是 FIFO 满了而 HAL 报错HAL_ERROR你得层层扒进源码最终发现是HAL_AES_Encrypt_IT()中 DMA 配置错误。裸寄存器让每一行代码都对应一个物理信号调试时用 ST-Link 直接查看AES_SR值比看 HAL 的抽象错误码快 10 倍。注意这不是否定 HAL而是明确适用场景——HAL 适合快速原型裸寄存器适合量产固件。本程序定位是“量产前最后一道验证”必须剔除所有抽象层带来的不确定性。5.4 我的验证清单每次集成 AES 前必做的 5 件事从某高校实验室的 3 个量产项目踩坑中总结出这套 checklist现在已成为我嵌入式安全模块开发的铁律步骤操作为什么必须做1. 时钟树核验用 STM32CubeMX 导出 RCC 配置确认 RCC_AHB2CLKEN RCC_AHB2ENR_AESEN已使能且PWR_CR[15]USB power未意外开启会干扰 AES 电源域2. 电源域检查用万用表测VDDA引脚电压确认为 3.3V±5%若用 LDO 供电需查 datasheet 确认该 LDO 是否支持 AES 模块的瞬态电流峰值达 20mA电压不稳会导致WRERR随机置位且无法通过软件复位恢复3. 缓存一致性若启用 I-Cache/D-Cache加密前执行SCB_CleanDCache_by_Addr((uint32_t*)key_addr, 16)解密后执行SCB_InvalidateDCache_by_Addr((uint32_t*)out_addr, 16)Cache 未刷会导致密钥加载到寄存器的是旧值尤其在动态密钥场景4. 中断优先级固化在NVIC_SetPriority()中将AES_IRQn设为NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)最高避免 UART 或 TIM 中断抢占 AES 状态读取这是最隐蔽的时序 bug 来源5. 温度压力测试将板子放入恒温箱升温至 85°C连续运行 24 小时 AES 加解密每 1000 次记录AES_SR值高温下晶体管漏电会放大WRERR概率裸寄存器方案在此类测试中暴露率 100%从那以后我每次在 CubeMX 里勾选 “AES” 外设后都会强制走一遍这 5 步——不是为了“以防万一”而是因为已经见过太多次只差最后一步验证就让整个安全模块在产线上批量失效。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

open-code-review:开源可审计的本地化代码审查工具

open-code-review:开源可审计的本地化代码审查工具

1. 这不是又一个“AI代码审查”玩具:open-code-review 的真实定位与设计哲学 你点开 GitHub,看到一个叫 open-code-review 的仓库,README 第一行写着 “LLM-powered code review CLI”。心里一咯噔——又来了?又是那种把 git …

2026/10/17 12:18:46 阅读更多 →
SkyWalking + Spring Cloud Gateway 链路追踪接入与实战解析

SkyWalking + Spring Cloud Gateway 链路追踪接入与实战解析

做网关链路追踪这件事,我真正意识到SkyWalking的价值,不是在看文档的时候,而是在某次线上故障里对着Spring Cloud Gateway的日志无从下手的时候。一个入口请求究竟被路由到了哪个服务、中间调用了什么、耗时花在哪,单靠网关日志和…

2026/10/17 12:18:46 阅读更多 →
AI“看起来没错”却暗含错误?从平滑错误到验证意识实操指南

AI“看起来没错”却暗含错误?从平滑错误到验证意识实操指南

这几个月我一直在用各类AI工具辅助做研究和写代码,一个感触越来越深:AI给出的结果里,明显离谱的错误其实不可怕,真正让人后背发凉的是那些听起来头头是道、结构完整、术语精准,但仔细一查才发现微妙出错的内容。前阵子…

2026/10/17 12:17:45 阅读更多 →

最新新闻

Kafka源码分析(一):核心架构与关键机制全景解析

Kafka源码分析(一):核心架构与关键机制全景解析

Kafka源码分析(一) - 概述1. 项目概述1.1 为什么要从源码层面认识KafkaKafka在消息队列领域的位置已经不需要多讲,无论是日志采集、实时计算、还是事件驱动架构,几乎每个公司的核心链路里都有它的身影。但用得熟不代表理解深。很多人对Kafka的认知停留在…

2026/10/17 18:48:10 阅读更多 →
编码Agent为何要搬出编辑器?本地优先工作台架构与实战

编码Agent为何要搬出编辑器?本地优先工作台架构与实战

我这个人有个习惯——同一件不方便的事情发生两次,就想动手改造工具。上个月让编码Agent修一条跨服务调用链的bug,从接口定义、实现类到调用方,横跨三个仓库。Agent在编辑器里只能看到其中一个,剩下两个仓库的代码,是我…

2026/10/17 18:48:10 阅读更多 →
深度学习归一化层详解:BN、LN、IN、GN原理、代码与实战选型

深度学习归一化层详解:BN、LN、IN、GN原理、代码与实战选型

1. 为什么归一化层值得单独拎出来讲做深度学习的人,几乎都绕不开归一化这个话题。BN(Batch Normalization)几乎是每个卷积网络的标配,但当你真正开始做检测、分割、风格迁移、视频理解,或者把模型部署到小批量甚至单样…

2026/10/17 18:48:10 阅读更多 →
Vue 3 复制当前地址:Clipboard 封装、降级策略与安全过滤实战

Vue 3 复制当前地址:Clipboard 封装、降级策略与安全过滤实战

打开浏览器控制台,手动拼一串location.href到剪贴板,再切到聊天窗口粘贴——这套动作我在做后台管理系统的日子里重复了无数遍。直到某次接到一个需求:“列表页加一个分享按钮,一点就复制当前地址”。我才意识到,这个看…

2026/10/17 18:48:10 阅读更多 →
线性回归从原理到实战:梯度下降、特征工程与误差分析全解析

线性回归从原理到实战:梯度下降、特征工程与误差分析全解析

线性回归这东西,说它是人工智能和算法模型里的“地基”一点都不夸张。我到现在都记得第一次跑通一个多元线性回归时的感觉:数据丢进去,几行代码出来一组系数,居然就能对新样本做预测了。后来做了越来越多的项目,才发现…

2026/10/17 18:48:10 阅读更多 →
AES-GCM跨语言互操作:Node.js与Java加解密对齐指南

AES-GCM跨语言互操作:Node.js与Java加解密对齐指南

1. 项目概述:为什么AES-GCM在Node.js和Java之间互操作会“突然失效”AES-GCM在Node.js和Java加解密的坑——这标题一出来,我就知道至少有三类人正盯着屏幕揉眼睛:刚写完Node.js服务端加密逻辑、准备对接Java老系统接口的后端同学;…

2026/10/17 18:47:09 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →