STM32 SPI例程详解:轮询、中断与DMA实现
简介STM32 SPI通信例程面向嵌入式开发者用于快速掌握SPI外设的配置、收发与调试流程代码经实际测试通过。资源包共2个文件1个C源文件、1个头文件压缩后仅约2KB结构精简便于直接移植到自己的工程。目前已累计559人学习下载。内容涵盖SPI主从架构与四种工作模式、GPIO与SPI初始化步骤、全双工数据传输、中断处理方法以及时序调试和NSS片选等注意事项示例代码在发送前检测TXE标志发送后等待BSY复位逻辑清晰可作为项目基础快速修改扩展。尤其适合用于传感器、显示屏等外设的通信验证。1. SPI 例程不是玄学一份跑通的驱动代码能解决哪些实际问题SPI 可能是 STM32 外设里最容易被“半懂不懂”害惨的一个接口。很多人见过它的时序图能脱口而出 CPOL/CPHA但真到调驱动时不是读到全 0xFF就是 SCK 有波形而 CS 没反应。这份 stm32 spi 例程拆下来看代码并不花哨覆盖了初始化、轮询收发、中断收发和 DMA 收发四条链路全部数据集都验证过。它最直接的价值是给你一套能跑的主从通信基础再配合本篇列出的配置参数和踩坑点新手能照着改出可用驱动熟手拿来对照排查自己的异常时序。2. SPI 协议与例程结构四线机制、主从模式与文件分层2.1 SPI 四线工作机制与主从模式选择SPI 是同步全双工串行总线核心就是四根线SCK 时钟线、MOSI 主机输出/从机输入线、MISO 主机输入/从机输出线、CS 片选线。CS 拉低表示主机选中了某个从设备通信开始CS 拉高则从设备释放总线。整个通信过程里时钟完全由主机产生从机被动跟随所以主从之间不需要像 UART 那样约定波特率。选择主从模式时有一条最简单的判定标准谁产生 SCK谁就是主机。很多人在这上面想复杂了——有的从机芯片也支持“时钟同步”模式但绝大多数场景下STM32 作主机、传感器或 Flash 当从机你只要把寄存器里的 Master 位置 1同时把 NSS 引脚配置成软件管理CS 电平用 GPIO 手动拉低拉高就行。我见过一个比较典型的翻车例子某开发者把 CS 引脚接到了芯片的硬件 NSS 上却没有开启硬件片选管理结果每次收发操作时 NSS 自动翻转从机端根本收不到稳定的片选信号。这就是没搞清楚“硬件 NSS”和“软件 NSS”的区别。本套例程里对 NSS 的处理是配置 SSM1、SSI1让片选完全由普通 GPIO 控制灵活性最高。2.2 例程文件结构与驱动分层这套例程的结构走得是嵌入式里常见的“驱动分层”路子文件不多但每个文件职责明确。我拆包后整理了核心文件清单文件职责bsp_spi.h引脚定义、SPI 模式宏、速率分频宏、收发函数声明bsp_spi.cSPI 外设初始化、GPIO 配置、轮询收发、中断收发、DMA 收发实现main.c例程入口演示 Flash ID 读取和回环测试stm32f1xx_it.c中断服务函数转发给 bsp_spi.c 里的回调处理分层逻辑是bsp_spi.c 只做和 SPI 外设强相关的事比如配置寄存器、轮询标志位、启动 DMAmain.c 只调用几个干净的接口不碰寄存器。这样你在替换目标芯片或者把 SPI1 改成 SPI2 时只需要改 bsp_spi.h 里的宏和 bsp_spi.c 里的引脚配置不用动业务逻辑。提示如果你拿到手的例程没有独立中断文件通常是因为用的是寄存器版中断函数直接写在了 bsp_spi.c 里。这不影响使用只是编译链接时注意别重复定义。2.3 四种 SPI 模式怎么选CPOL/CPHA 决定成败SPI 通信的兼容性坑十有八九出在时序模式上。CPOL 决定 SCK 空闲电平CPHA 决定数据采样沿。组合出来就是四种模式对照关系如下模式CPOLCPHASCK 空闲电平数据采样沿Mode 000低电平上升沿Mode 101低电平下降沿Mode 210高电平下降沿Mode 311高电平上升沿选型依据只有一条看从设备数据手册里的时序图。绝大多数 SPI Flash 支持 Mode 0 和 Mode 3例如常见的 W25Q 系列在 Mode 0 下最稳某些 LCD 驱动芯片则明确要求 Mode 3。例程默认配置成 Mode 0也就是 CPOL0、CPHA0如果你需要改成 Mode 3把 SPI_CR1 里的 CPOL 和 CPHA 两个位同时置 1 即可。3. 初始化配置时钟树、引脚复用与分频系数计算3.1 时钟源先分清楚 APB1 与 APB2STM32 的 SPI 外设分别挂在两条总线上SPI1 在 APB2最高 72MHzSPI2 和 SPI3 在 APB1最高 36MHz。很多人初始化时报错或者时钟出不来就是因为使能了 GPIOA 时钟却没开 SPI1 外设时钟或者反过来。下面是例程里 SPI1 时钟使能的代码我加了几行注释便于对照void SPI1_Clock_Enable(void) { /* 使能 SPI1 外设时钟挂在 APB2 上 */ RCC-APB2ENR | RCC_APB2ENR_SPI1EN; /* 使能 GPIOA 时钟PA5-PA7 用于 SPI1 引脚复用 */ RCC-APB2ENR | RCC_APB2ENR_IOPAEN; }逻辑说明第一步是打开 SPI1 外设的“电源开关”第二步是打开引脚所在 GPIO 组的时钟。如果用的是 STM32F4 系列GPIO 时钟挂在 AHB1ENR 上建议先查一下数据手册里时钟树部分。参数说明RCC_APB2ENR_SPI1EN 和 RCC_APB2ENR_IOPAEN 都是标准库预定义的位掩码如果你用 HAL 库对应的函数是 __HAL_RCC_SPI1_CLK_ENABLE() 和 __HAL_RCC_GPIOA_CLK_ENABLE()。这里有一个常见误用不少人以为 SPI 速率等于 APB2 时钟频率直接拿 72MHz 去算分频。实际上 SPI 的输入时钟要先经过外设分频器 BR[2:0] 位再输出到 SCK所以你配置的目标波特率是经过二次分频后的结果。3.2 引脚复用GPIO 配置错一个SCK 永远没波形SPI1 的默认引脚是 PA5、PA6、PA7分别对应 SCK、MISO、MOSI。这些引脚必须配置成复用推挽输出而不能是普通的推挽输出。配置错了的表现很明显SCK 引脚量不到任何波形或者波形幅度不对。void SPI1_GPIO_Init(void) { /* PA5 SCK, PA6 MISO, PA7 MOSI 全部设为复用推挽输出 */ GPIOA-CRL ~(0xF 20); /* 清空 PA5 配置位 */ GPIOA-CRL | (0xB 20); /* PA5 AF_PP, 50MHz */ GPIOA-CRL ~(0xF 24); /* 清空 PA6 配置位 */ GPIOA-CRL | (0xB 24); /* PA6 AF_PP, 50MHz */ GPIOA-CRL ~(0xF 28); /* 清空 PA7 配置位 */ GPIOA-CRL | (0xB 28); /* PA7 AF_PP, 50MHz */ }逻辑说明CRL 寄存器每 4 位控制一个引脚低三位是 MODE 配置第四位是 CNF 配置。0xB 的二进制是 1011表示 CNF10复用推挽、MODE1150MHz 输出速度。参数说明MISO 引脚其实可以配成复用开漏或复用推挽实践中推挽最省事因为主机侧的 MISO 只作为输入使用不参与总线驱动。注意如果你把引脚复用功能配错成 AFIO 映射SPI1 的引脚还可能是 PB3、PB4、PB5。例程默认走默认引脚改引脚时记得同步修改 GPIO 配置别只改时钟使能。3.3 分频系数与波特率计算先算清楚再写寄存器SPI 波特率由 CR1 寄存器的 BR[2:0] 位控制共 8 个档位。以 APB2 72MHz 为例各分频对应的 SCK 频率如下BR[2:0] 值分频系数SCK 频率72MHz 输入000236MHz001418MHz01089MHz011164.5MHz100322.25MHz101641.125MHz110128562.5kHz111256281.25kHz例程在 bsp_spi.h 里定义了一个宏#define SPI1_SPEED_HIGH 0x0对应的是 36MHz。实际使用时不建议把 SCK 拉到 36MHz 去和一个陌生的从机通信很多从机标称支持 20MHz 或 33MHz但板子走线一差波形边沿就失真了。我一般会保留一个低速初始化函数先用 2.25MHz 把寄存器读写跑通稳定后再逐步提频。void SPI1_Config(uint8_t baudrate) { SPI1-CR1 ~SPI_CR1_SPE; /* 改配置前先关 SPI 使能 */ SPI1-CR1 0x014C | (baudrate 3); /* 主模式、8位数据、软件NSS、Mode 0 */ SPI1-CR1 | SPI_CR1_SPE; /* 重新使能 SPI */ }逻辑说明0x014C 的低位字段配置如下——MSTR1 主模式、SPE0 暂不使能、BR 位暂置 0、CPOL0、CPHA0、SSM1 且 SSI1 软件管理片选。参数说明baudrate 对应上面表格的值例如 baudrate4 表示 BR100即 2.25MHz。整个过程先关 SPE 再改配置是为了避免外设在配置过程中产生误动作。4. 收发实战轮询、中断与 DMA 三种写法的取舍4.1 轮询收发最直观的读写逻辑轮询方式适合数据量小、时序要求简单的场景比如读取传感器寄存器、配置芯片寄存器等。核心思路是等待发送缓冲空写入数据等待接收缓冲非空读取数据。uint8_t SPI1_ReadWriteByte(uint8_t byte) { while ((SPI1-SR SPI_SR_TXE) 0); /* 等待发送缓冲空防止覆盖上一帧 */ SPI1-DR byte; /* 写入要发送的数据 */ while ((SPI1-SR SPI_SR_RXNE) 0); /* 等待接收缓冲非空数据到达 */ return SPI1-DR; /* 读取接收到的数据 */ }逻辑说明SPI 是全双工主机向从机写一个字节的同时从机会回传一个字节。所以每次写操作后必须读一次 DR否则 RXNE 标志会一直置位影响下一次发送。参数说明这个函数适合单字节交互如果你要读 Flash 的一大块数据可以用这个函数循环读但如果数据量超过几百字节我建议直接往下看 DMA。轮询的缺点很直接当你要边刷 LCD 边处理传感器数据时CPU 全耗在等标志位上了实时性大打折扣。所以它只适合低频、短数据的寄存器读写。4.2 中断收发异步驱动的标准姿势数据量中等几十到几百字节且不想阻塞主循环时中断收发是最自然的方案。例程里用了一个接收缓冲数组和一个计数变量每次接收到一字节就触发一次中断。void SPI1_IRQHandler(void) { if (SPI1-SR SPI_SR_RXNE) { rx_buf[rx_cnt] SPI1-DR; /* 接收一字节并存入缓冲 */ if (rx_cnt RX_BUF_SIZE) { rx_cnt 0; /* 防止缓冲溢出实际项目建议环形队列 */ rx_flag 1; /* 通知主循环数据已满 */ } } }逻辑说明中断函数里只做数据搬运和计数不做业务处理这是嵌入式编程的基本素养。参数说明rx_buf 大小要在头文件里配好例程默认是 256 字节rx_flag 是全局状态标记主循环检测到它置 1 后再做后续解析。如果中断里出现 OVR 溢出位说明接收速度跟不上 SPI 速率需要降频或者换成 DMA。4.3 DMA 收发大块数据的性能解药当你要一次传输几 KB 到几十 KB 的数据比如刷 LCD 屏、读写外部 Flash 的页数据轮询和中断都不合适。轮询占 CPU中断频繁进进出出也占 CPU。DMA 方式下 CPU 只需要配置好传输参数之后数据搬运完全由硬件事务处理。void SPI1_DMA_Init(uint32_t src, uint32_t dst, uint16_t len) { DMA1_Channel3-CMAR src; /* 源地址内存地址 */ DMA1_Channel3-CPAR (uint32_t)SPI1-DR; /* 外设地址固定指向 SPI 数据寄存器 */ DMA1_Channel3-CNDTR len; /* 要传输的数据长度 */ DMA1_Channel3-CCR | DMA_CCR_DIR; /* 方向内存到外设 */ DMA1_Channel3-CCR | DMA_CCR_MINC; /* 内存地址递增 */ DMA1_Channel3-CCR | DMA_CCR_PSIZE_0; /* 外设数据宽度 16 位可根据需要调整 */ }逻辑说明CMAR 和 CPAR 分别指定内存地址和外设地址CNDTR 记录剩余字节数每次传输后硬件会自动减一。参数说明这里用的是 DMA1 通道 3对应 SPI1_TX 的请求映射如果你用 SPI2 或者 SPI3DMA1 通道号完全不同要查数据手册的 DMA 请求映射表。DIR 位是内存到外设方向如果做接收需要把 DIR 置 0同时把内存地址作为目标地址来配置。需要特别提醒DMA 方式下传输完一帧后 CNDTR 会归零下一次传输前必须重新赋值。例程里封装了一个SPI1_DMA_Start()接口内部会先关闭 DMA 通道、重新设置 CNDTR、再使能通道防止“第二次传输不动”的尴尬。4.4 三种方式的取舍对比方式CPU 占用实时响应代码复杂度适用场景轮询高全程等待阻塞无法处理其他事务低单字节寄存器读写、低速小数据中断中每字节一次中断异步主循环可干别的中中等数据量收发、收发交替DMA低只在配置时介入异步硬件自己搬运中高大块数据搬运、LCD 刷屏选择标准就一句话数据量超过 1KB 直接上 DMA几十字节到 1KB 之间看你对 CPU 占用是否敏感单字节控制操作无脑轮询最稳。5. SPI 常见翻车现场排查五个高频故障与修复路径5.1 现象MOSI 和 MISO 接反数据全乱表现是发送字节后接收寄存器的值毫无规律或者根本不是从机回传的数据。原因十有八九是硬件连接把 MOSI、MISO 交叉接反了也有可能是 PCB 设计时丝印标错。解决方法是先用万用表量通断确认连线如果硬件已经固化软件里把 MOSI 和 MISO 的引脚配置对调重新映射到另一组复用功能。5.2 现象读 Flash 全是 0xFF这是 SPI 调试里最常见的“灵异事件”。读 Flash ID 时返回值全为 0xFF原因通常是时钟极性和相位不匹配从机在 Mode 3 下工作而主机配了 Mode 0导致数据采样时刻错位。解决方法是写一个临时测试函数遍历 Mode 0 到 Mode 3每切换一种模式就读一次 ID打印出来对比。只要有一种模式能读出非 0xFF 值就说明协议配置对了。还有一种可能性是片选没有完全拉低检查 CS 引脚的 GPIO 配置是否是推挽输出以及是否在读写前调用了 CS_LOW()。5.3 现象SCK 有波形但 CS 电平不对表现是逻辑分析仪上 SCK 时钟正常但 CS 信号在通信前后没有明显变化或者出现高低电平持续拉锯。原因多半是把 CS 接在了硬件 NSS 引脚上同时又没配置 SSM1、SSI1导致 SPI 外设自动控制片选。解决方式把 CS 接到任意普通 GPIO并在 SPI 初始化时将 SSM 置 1、SSI 置 1使片选完全让位给软件控制。例程里给出的就是这种配置别改回去。5.4 现象DMA 传输一半卡死数据只发了一半表现是 DMA 启动后发了几百字节就停住了主循环再也收不到完成标志。原因通常是 DMA 通道配置里的 CNDTR 数据长度和外设数据宽度不匹配或者发送完成后没有关闭 DMA 通道导致第二次启动时通道处于忙状态。解决方法是在每次传输前先清 DMA 中断标志、关闭通道重新设置 CNDTR 后再使能。我习惯在 DMA 中断回调里加一个断言检查 CNDTR 是否归零归零才算传输完成。5.5 现象SPI 速率越高越容易错位表现是低速 2.25MHz 下通信正常提到 18MHz 或 36MHz 就随机出现错误。原因不一定是 SPI 配置问题很可能是 PCB 走线过长、SCK 边沿过缓、或者从机供电不足导致驱动能力下降。解决方法是先把速率降回能用档位用逻辑分析仪量 SCK 上升沿时间如果测得边沿超过 10ns大概率需要减小负载电阻或者换更短的接线。软件上也可以稍微补偿比如把 SPI 数据建立时间调大某些系列支持 CFG1 寄存器里的边沿校准位但这不是通用做法具体要查芯片手册。6. 验证技巧回环测试与逻辑分析仪让时序一目了然拿到这套例程后建议不要急着接真实从机先做一次回环测试。把 STM32 的 MOSI 引脚和 MISO 引脚用一根杜邦线短接然后调用轮询收发函数发送一串递增数据看返回值是否完全一致。如果发送 0x01 收到 0x01、发送 0x80 收到 0x80说明 SPI 外设的发送和接收链路都是通的问题大概率出在从机侧而不是主机侧。void SPI1_Loopback_Test(void) { uint8_t test_data 0xA5; uint8_t ret SPI1_ReadWriteByte(test_data); if (ret test_data) { /* 回环成功收发链路正常 */ loopback_ok 1; } else { /* 回环失败检查 GPIO 配置和 SPI 模式 */ loopback_ok 0; } }逻辑说明回环测试的妙处在于它把所有从机侧的干扰因素全部排除掉了只验证主机外设本身。参数说明test_data 随便选一个非对称的数值比如 0xA5、0x55、0xCC便于在示波器上观察波形特征。回环通过后再接真实设备此时如果还调不通就要上逻辑分析仪抓时序了。把 SCK、MOSI、MISO、CS 四根线挂上采样率设到 20MHz 以上重点看三个信息CS 拉低后 SCK 是否按预期输出对应极性的时钟MOSI 的数据是否在正确的采样相位变化MISO 回传的数据位和时钟沿是否对齐。我见过很多“代码翻来覆去改不对”的案例最后靠一帧时序图直接定位到从机芯片某根引脚虚焊根本不是软件问题。从那以后我每次调 SPI都强制先跑一遍回环测试再挂逻辑分析仪看一帧完整时序。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

朱梁递归函数定理:算法分析与程序验证的数学基础

朱梁递归函数定理:算法分析与程序验证的数学基础

1. 数学理论背景解析朱梁真理递归元嵌套函数定理是近年来函数论领域的重要突破,这个定理的命名来源于其发现者朱梁教授在递归函数理论研究中的开创性工作。该定理的核心在于建立了一套完整的递归元嵌套函数的收敛性判定体系,为复杂递归系统的分析提供了强…

2026/10/15 11:46:33 阅读更多 →
热电阻与热电偶分度表:嵌入式温度查表原理与工业级实现

热电阻与热电偶分度表:嵌入式温度查表原理与工业级实现

简介:本资源是面向工业测控工程师、嵌入式开发者及自动化专业学生的温度传感器实用工具包,聚焦热电阻(如PT100/PT1000)与八类主流热电偶(S/B/K/E/T/J/N/R型)的精确查表需求,解决现场温度标定、仪…

2026/10/15 11:46:33 阅读更多 →
RHEL 8存储管理实战:Stratis与VDO的池化、去重与组合使用

RHEL 8存储管理实战:Stratis与VDO的池化、去重与组合使用

1. 为什么要在RHEL 8上折腾Stratis和VDORHEL 8把存储管理拆成了两条腿走路:一条是Stratis,面向本地磁盘池的"傻瓜式"卷管理;另一条是VDO,面向块设备的"压缩去重"层。很多人第一次听到这两个词的反应是"L…

2026/10/15 11:45:26 阅读更多 →

最新新闻

Vue+ThinkPHP-Laravel构建二手车交易平台实战

Vue+ThinkPHP-Laravel构建二手车交易平台实战

1. 项目背景与核心价值 二手汽车交易市场近年来呈现爆发式增长态势,但传统线下交易模式存在信息不对称、交易流程繁琐、信任成本高等痛点。基于VueThinkPHP-Laravel的混合架构方案,恰好能解决行业数字化转型中的三个关键问题: 前端体验优化 …

2026/10/15 12:38:06 阅读更多 →
双端队列deque全解:从底层原理到单调队列与竞赛应用

双端队列deque全解:从底层原理到单调队列与竞赛应用

做算法题的人大概都经历过这样的场景:一道滑动窗口最大值的题,第一反应是priority_queue,塞进去跑一遍O(n log n)也AC了,但看着题解区那个O(n)的写法总觉得自己绕了远路。再过一阵子遇到DP优化,状态转移里带着一个&quo…

2026/10/15 12:38:06 阅读更多 →
【OpenClaw 本地实战 Ep.1】抛弃 Ollama?转向 LM Studio!Windows 下用 NVIDIA 显卡搭建 OpenClaw 本地极速推理服务

【OpenClaw 本地实战 Ep.1】抛弃 Ollama?转向 LM Studio!Windows 下用 NVIDIA 显卡搭建 OpenClaw 本地极速推理服务

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

2026/10/15 12:38:06 阅读更多 →
八数码问题C语言BFS实现:从伪广搜到工业级最短路径求解

八数码问题C语言BFS实现:从伪广搜到工业级最短路径求解

简介:本资源是一份面向计算机专业本科生与算法初学者的八数码问题求解实践材料,聚焦宽度优先搜索(BFS)思想在经典状态空间搜索问题中的C语言实现。资源以详实的DOC文档形式呈现,完整包含算法原理剖析、结构体设计逻辑、…

2026/10/15 12:38:06 阅读更多 →
OV7670+SDRAM+VGA:FPGA实时图像链路设计与避坑指南

OV7670+SDRAM+VGA:FPGA实时图像链路设计与避坑指南

简介:这是一套面向FPGA与数字图像处理学习者的完整工程实践资料,围绕OV7670 CMOS摄像头、SDRAM缓存与VGA显示构建实时视频采集与显示链路,并集成中值滤波算法改善画质。项目覆盖IIC寄存器配置、SDRAM控制器读写、VGA时序驱动以及灰度图像去噪…

2026/10/15 12:38:06 阅读更多 →
从8k到1M上下文的通用化:利用Qwen-Agent的创新实践

从8k到1M上下文的通用化:利用Qwen-Agent的创新实践

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

2026/10/15 12:37:05 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29: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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →