news 2026/9/29 2:18:45

STM32理论体系全解析:从系统架构到外设实战的进阶指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32理论体系全解析:从系统架构到外设实战的进阶指南

1. 从“点灯”到系统级设计:STM32理论到底该学什么

很多人第一次接触STM32,都是从一块最小系统板和一根ST-Link下载线开始的。打开Keil或者CubeIDE,新建工程,配置时钟树,把某个GPIO拉高,看着LED亮起来的那一刻,确实很有成就感。但接下来往往就卡住了——会点灯,会串口打印,会跑个定时器,可一旦要做一个完整项目,比如两轮差速小车、USB虚拟串口设备、或者带OLED显示的超声波测距仪,就发现到处是坑:中断优先级配错导致程序跑飞、DMA和CPU抢总线、USB枚举失败、定时器捕获测频不准、低功耗模式唤醒后外设不工作。这些问题的根源,基本都指向同一个东西:对STM32的理论体系没有建立起来。

“STM32理论”这个标题听起来很泛,但它恰恰是绝大多数嵌入式开发者从入门到进阶之间那道最关键的坎。所谓理论,不是让你去背寄存器手册,而是理解这颗芯片内部到底是怎么运转的:时钟从哪来、总线怎么挂、中断怎么嵌套、外设怎么协同、内存怎么映射、启动流程怎么走。你把这些搞清楚了,再看那些热词里的“STM32 USB虚拟串口发送数据”“STM32定时器捕获测频率”“STM32 OTA”“STM32禁用JTAG”等等,就会发现它们不过是同一套理论在不同场景下的应用而已。

这篇文章适合谁看?如果你已经能跑通GPIO和串口,但遇到复杂项目就心里没底;如果你正在做基于STM32的毕业设计,被各种外设配置搞得焦头烂额;如果你是从Arduino转过来的,发现STM32的“自由”反而让你无从下手——那这篇内容就是写给你的。我会从系统架构讲到具体外设,从时钟树讲到中断向量表,从启动文件讲到链接脚本,把STM32的理论骨架一根一根拆开给你看,再结合那些热搜词里的真实场景,告诉你每个理论点在实际项目中到底怎么用、哪里容易翻车。

2. STM32系统架构与总线矩阵:理解芯片的“骨架”

2.1 内核、总线与存储器的三层结构

STM32不是一块“铁板”,它内部是一个高度结构化的系统。以最常见的F1系列为例,内核是Cortex-M3,通过ICode总线、DCode总线和系统总线分别连接Flash、SRAM和外设。到了F4/H7系列,Cortex-M4/M7内核前面多了一层ART加速器和Cache,总线矩阵也更复杂。理解这个结构的意义在于:你知道代码从哪里取、数据从哪里读、外设寄存器怎么访问,才能解释为什么某些操作快、某些操作慢、某些操作会冲突。

举个实际例子。很多人在做“STM32串口调试PID”时会发现,PID计算放在主循环里响应太慢,放到定时器中断里又偶尔丢步。如果你知道Cortex-M的内核通过DCode总线访问SRAM、通过系统总线访问APB外设,就会明白:中断服务函数里读SRAM变量很快,但频繁写APB寄存器(比如改PWM占空比)会有总线延迟。合理的做法是把PID计算放在定时器中断里,但PWM更新用DMA或者预装载寄存器,让硬件自己去搬,CPU只负责算。这就是理论指导实践。

再比如“STM32定时器捕获测频率”,输入捕获本质上是在定时器通道上检测边沿,然后硬件自动把当前计数器值锁存到捕获寄存器。如果你不理解定时器的时钟源来自APB总线、经过预分频器才到计数器,就很容易算错频率。假设APB1时钟72MHz,定时器预分频设为71,那计数器时钟就是1MHz,一个计数代表1微秒。捕获到两个上升沿之间的计数值差是5000,那频率就是1MHz/5000=200Hz。这个计算链条必须建立在时钟树和总线结构清晰的基础上。

2.2 时钟树:所有外设的“心跳”来源

时钟树是STM32理论里最容易被忽视、但出问题最多的部分。很多人用CubeMX配置时钟,看到那个复杂的树状图就头大,直接点“自动求解”了事。但一旦你要做USB、CAN、以太网这些对时钟精度要求高的外设,就必须手动算清楚。

以“STM32 USB虚拟串口发送数据”为例。USB外设要求48MHz时钟,且精度必须在±0.25%以内。如果你用外部8MHz晶振,通过PLL倍频到72MHz给系统,再分频给USB,就要确保分频系数和PLL配置能精确得到48MHz。F1系列通常需要把USB预分频设为1.5,即72MHz/1.5=48MHz。但如果你用的是内部HSI(8MHz,精度±1%),USB枚举就可能时好时坏。这就是为什么很多USB虚拟串口教程都强调“必须用外部晶振”。

时钟树还涉及低功耗设计。比如“STM32鱼缸”这种需要定时喂食、定时开灯的项目,如果一直跑72MHz,功耗会很高。你可以配置为睡眠模式,用RTC唤醒,唤醒后切到HSI快速执行,再切回低功耗。但切换时钟源时,如果外设还在用旧时钟,就可能出现通信错误。所以理论告诉我们:改时钟前,先关掉依赖该时钟的外设,改完再重新初始化。

2.3 启动流程与内存映射:程序从哪里开始跑

STM32上电后,第一件事不是执行main函数,而是从0x00000000地址取栈顶指针,从0x00000004取复位向量,然后跳转到启动文件里的Reset_Handler。启动文件负责初始化堆栈、调用SystemInit配置时钟、然后跳转到main。这个过程在“STM32标准库新建工程”和“Keil5 STM32标准工程模板”里都是固定的,但很多人只是复制粘贴,不知道每一行在干什么。

内存映射方面,STM32把Flash映射到0x08000000,SRAM映射到0x20000000,外设寄存器映射到0x40000000开始。你写GPIOA->ODR = 0x01,实际上是在向0x4001080C这个地址写数据。理解这一点,你就能看懂“STM32禁用JTAG”为什么能释放PB3、PB4、PA15作为普通GPIO——因为这些引脚默认被JTAG占用,而JTAG的配置寄存器在AFIO模块里,你需要先使能AFIO时钟,再重映射。

还有一个常见坑:“load ‘D:\STM32 Project\2-1 STM32工程模板\Objects\project.axf’ error: flash”。这个错误通常是因为链接脚本里Flash起始地址或大小配置不对,或者芯片型号选错了。如果你知道STM32的Flash从0x08000000开始,不同型号容量不同(比如C8T6是64KB,RCT6是256KB),就能快速定位问题。

3. 中断系统与事件机制:实时性的核心

3.1 NVIC优先级分组与嵌套逻辑

STM32的中断系统由NVIC管理,支持抢占优先级和子优先级。抢占优先级高的可以打断抢占优先级低的中断,子优先级只在同时挂起时决定谁先执行。很多人配置中断时随便填个数字,结果出现“串口接收中断被定时器中断打断导致丢数据”的问题。

以“STM32串口通信”为例。假设你用串口接收上位机指令,同时用定时器做10ms任务调度。如果串口中断的抢占优先级低于定时器,那么定时器中断一来,串口接收就被挂起。如果此时串口正在接收一帧数据,硬件接收寄存器可能溢出。正确的做法是:串口中断抢占优先级设为最高,定时器次之,主循环最低。这样串口数据能及时取走,定时器任务稍微延迟几微秒也没关系。

NVIC还有一个“中断向量表重定位”的概念。在“STM32 OTA”升级中,Bootloader和APP都有各自的中断向量表。Bootloader跳转到APP前,需要把APP的中断向量表偏移寄存器(SCB->VTOR)设置为APP的起始地址。否则APP里发生中断时,会跳到Bootloader的中断服务函数,直接跑飞。这个理论点不做OTA可能永远用不到,但一旦要做,就是致命的。

3.2 事件与中断的区别:COM事件示意图的启示

“STM32 COM事件示意图”这个热搜词,其实指向的是STM32的“事件”机制。中断是CPU响应外设请求,事件是外设之间直接触发,不经过CPU。比如定时器可以产生事件触发ADC采样,ADC转换完成可以产生事件触发DMA搬运。这种“外设联动”在电机控制、电源管理里非常常见。

以“STM32控制伺服电机485”为例。伺服电机通常需要50Hz到200Hz的PWM信号,同时要通过485总线读取编码器反馈。如果你用CPU去轮询,实时性很差。合理的方案是:定时器产生PWM,同时产生事件触发ADC采样电流,ADC完成触发DMA搬运到缓冲区,CPU只在DMA传输完成中断里做一次计算。这样CPU占用率极低,控制周期也稳定。

事件机制的配置在标准库里叫“TIM_SelectOutputTrigger”和“ADC_ExternalTrigConv”,在HAL库里叫“HAL_TIM_ConfigEventTrigger”。理解了这个,你就能把“STM32定时器模式”里的各种从模式、触发模式、门控模式串起来。

3.3 中断延迟与实时性优化

中断延迟是指从中断请求发生到中断服务函数第一条指令执行的时间。Cortex-M3/M4的中断延迟通常是12个时钟周期,但如果有Flash等待周期、总线冲突、更高优先级中断嵌套,延迟会增加。在“STM32串口调试PID”这种场景里,如果PID周期是1ms,中断延迟几十微秒还可以接受;但如果做“STM32 BISS-C解码”这种高速协议,延迟就必须精确计算。

优化中断延迟的方法有几个:把中断服务函数放在SRAM里执行(通过链接脚本或__attribute__((section(“.ramfunc”)))),减少Flash等待;提高中断优先级,减少嵌套;用DMA搬运数据,减少中断次数。这些技巧在“STM32 H743系列微控制器中文技术手册”里都有详细说明,但手册不会告诉你什么时候该用,只有实际项目才能逼你学会。

4. 外设理论与实战:从GPIO到USB

4.1 GPIO与按键模块电路设计

GPIO是STM32最基础的外设,但“STM32按键模块电路设计”这个热搜词说明很多人在这里踩坑。STM32的GPIO有8种模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、开漏复用、推挽复用。按键通常用输入上拉或输入下拉,配合外部电阻或内部电阻。

内部上拉电阻约40kΩ,如果按键线较长、环境干扰大,内部上拉可能不够,需要外部加4.7kΩ到10kΩ上拉。另外,按键需要消抖,硬件消抖用RC电路,软件消抖用定时器扫描。如果你用外部中断做按键,还要注意中断触发边沿和消抖时间的配合。我见过有人用外部中断做按键,结果按一次触发几十次中断,就是因为没有消抖。

“STM32电量一个LED小灯”这个热搜词看起来简单,但如果你要做一个电量指示灯,就需要ADC采样电池电压,然后根据电压值控制LED闪烁频率或PWM亮度。这里涉及ADC参考电压、分压电阻计算、软件滤波。比如电池是3.7V锂电池,满电4.2V,亏电3.3V,ADC参考3.3V,那分压电阻要选得让4.2V分压后不超过3.3V。假设用100kΩ和200kΩ分压,4.2V×200/(100+200)=2.8V,在ADC量程内。然后软件做滑动平均滤波,避免LED闪烁跳变。

4.2 定时器:从延时到PWM到输入捕获

“STM32延时函数delay卡死”是新手常见问题。很多人用while(i--)做延时,结果优化等级一变,延时就不准了;或者中断里调用延时,导致死等。正确的做法是用SysTick定时器做系统滴答,或者用硬件定时器做精确延时。SysTick是Cortex-M内核自带的24位递减计数器,配置为1ms中断,在中断里累加全局变量,主循环里判断变量差值。这样延时不受优化影响,也不会在中断里死等。

“STM32定时器捕获测频率”前面已经提过,这里补充一个细节:输入捕获有“直接模式”和“间接模式”,还有“PWM输入模式”。PWM输入模式用一个定时器同时捕获周期和占空比,非常适合测PWM信号。配置时,一个通道设为上升沿捕获,另一个通道设为下降沿捕获,从模式设为复位模式。这样第一个通道捕获周期,第二个通道捕获高电平时间,硬件自动算好,CPU只读寄存器。

“STM32定时器模式”还包括编码器模式、霍尔传感器模式、从模式、触发模式等。编码器模式可以自动读取正交编码器的位置和方向,做“两轮差速小车STM32控制”时非常有用。你只需要把定时器配置为编码器模式,读取计数器值就知道轮子转了多少,方向由计数方向决定。

4.3 串口、USB与通信协议

“STM32串口通信”是最常用的调试手段,但串口也有坑。比如波特率误差:如果系统时钟是72MHz,波特率115200,分频系数是72M/(16×115200)=39.0625,取整39,实际波特率是72M/(16×39)=115384,误差0.16%,可以接受。但如果系统时钟是8MHz,误差就大了。所以高速串口通信一定要用高时钟源。

“STM32 USB虚拟串口发送数据”涉及USB协议栈。STM32F1系列有USB设备外设,但需要配合标准库或HAL库的USB中间件。虚拟串口(CDC)需要实现三个端点:控制端点、批量输入端点、批量输出端点。枚举过程中,主机读取设备描述符、配置描述符、接口描述符,然后设置波特率、数据位等参数。如果你用CubeMX生成代码,这些描述符会自动生成,但你要知道怎么改VID、PID、字符串描述符。

“STM32 USB电路”也有讲究。USB差分信号线D+和D-需要串联22Ω电阻,D+需要1.5kΩ上拉电阻(全速设备)。如果上拉电阻接错,主机可能识别为低速设备或无法识别。另外,USB电源线要加ESD保护,否则热插拔容易打坏芯片。

“STM32 HTTP库”和“STM32 OTA”通常用在物联网设备上。HTTP库可以用LwIP协议栈,OTA则需要Bootloader和APP分区。Bootloader负责接收新固件、校验、写入APP区,然后跳转。APP区需要设置中断向量表偏移,并且要防止升级过程中断电导致变砖。常见做法是双区备份,或者用外部Flash暂存。

4.4 传感器与执行器:从超声波到伺服电机

“STM32超声波测距”通常用HC-SR04。原理是给Trig引脚10微秒高电平,然后测Echo引脚高电平持续时间,距离=时间×声速/2。声速取340m/s,即34000cm/s,时间单位微秒,距离cm=时间×0.017。用定时器输入捕获测Echo高电平时间,精度可以到微秒级。但要注意:超声波模块是5V供电,Echo输出也是5V,STM32的GPIO是3.3V容忍,但最好加电平转换或分压。

“STM32 BH1750 OLED I2C Proteus完整原理图”涉及I2C通信。BH1750是光照传感器,OLED是显示屏,两者都挂I2C总线。I2C需要上拉电阻,通常4.7kΩ。Proteus仿真时,要注意STM32模型是否支持I2C外设,有些模型不完整,仿真会失败。实际硬件上,I2C速率100kHz或400kHz,走线长时要降低速率。

“STM32控制伺服电机485”和“两轮差速小车STM32控制”涉及电机控制。伺服电机通常用PWM控制,485用于多机通信。差速小车需要两个电机,用两个定时器通道输出PWM,用编码器模式读取轮速,然后做PID闭环。PID参数整定是个经验活:先调P,再调I,最后调D。P太大振荡,I太大超调,D太大噪声敏感。

“STM32鱼缸”和“基于STM32的智能台灯”是典型的综合项目。鱼缸需要定时喂食、温度控制、灯光控制、水位检测;智能台灯需要光感、人体感应、PWM调光、定时提醒。这些项目把GPIO、ADC、定时器、I2C、UART都用上了,是检验STM32理论是否扎实的好题目。

5. 开发环境与工具链:从Keil到VSCode

5.1 Keil5兼容C51和STM32安装

“Keil5兼容C51和STM32安装”是很多学生遇到的问题。Keil5默认安装后,需要单独安装C51和STM32的器件支持包(DFP)。安装顺序一般是先装Keil5 MDK,再装C51,最后装STM32 DFP。如果顺序错了,可能互相覆盖。另外,Keil5的注册和License管理也要注意,社区版有代码大小限制。

“STM32芯片包安装”指的是DFP(Device Family Pack)。不同系列需要不同的包,比如F1系列是Keil.STM32F1xx_DFP,F4系列是Keil.STM32F4xx_DFP。安装后,新建工程时才能选到对应芯片。如果芯片包版本太旧,可能不支持新型号。

5.2 ST-Link Utility与下载调试

“STM32 ST-Link Utility”是ST官方的下载工具,可以烧录、读取、擦除Flash,还可以设置选项字节。选项字节里可以配置读保护、写保护、硬件看门狗、复位后启动模式等。如果你不小心设置了读保护,芯片可能无法再次下载,需要用ST-Link Utility解除保护,但会全片擦除。

“STM32 ST-LinkUpgrade STSW-LINK007”是ST-Link固件升级工具。有时候ST-Link固件太旧,无法识别新型号芯片,就需要升级。升级过程中不要断电,否则ST-Link可能变砖。

“STM32禁用JTAG”前面提过,通过AFIO重映射释放PB3、PB4、PA15。但要注意,禁用JTAG后,如果程序跑飞,可能无法再用JTAG调试,只能用电复位或BOOT模式。所以一般保留SWD,只禁用JTAG。

5.3 VSCode与开源工具链

“STM32 VSCode配置”是近年来越来越流行的方案。用VSCode + Cortex-Debug + OpenOCD + arm-none-eabi-gcc,可以搭建完全开源的工具链。好处是跨平台、免费、插件丰富;坏处是配置复杂,需要自己写Makefile或CMake,自己管理链接脚本和启动文件。

“Opencode STM32代码开发”可能指的是用AI辅助写STM32代码。现在有些工具可以根据自然语言描述生成初始化代码,但生成的代码质量参差不齐,尤其是中断优先级、时钟配置这些关键部分,还是需要人工检查。我的建议是:AI可以帮你写框架,但底层配置一定要自己理解。

“Arduino STM32”指的是用Arduino框架开发STM32。Arduino的STM32核心支持很多型号,API和Arduino一样简单,但性能和灵活性不如标准库或HAL库。适合快速原型验证,不适合量产项目。

6. 常见问题与排查技巧实录

6.1 程序跑飞与HardFault排查

HardFault是STM32开发中最头疼的问题。常见原因有:数组越界、空指针解引用、栈溢出、中断向量表错误、时钟配置错误。排查方法:在HardFault_Handler里加断点,查看LR和PC寄存器,定位出错地址;用__asm volatile读取MSP和PSP;检查栈大小是否足够。

“STM32延时函数delay卡死”也可能是HardFault的前兆。如果延时函数里用了未初始化的指针,或者中断里调用了不可重入函数,就可能跑飞。

6.2 通信失败与数据错误

串口通信失败常见原因:波特率不匹配、TX/RX接反、地线未共地、电平不匹配、中断优先级冲突。USB枚举失败常见原因:时钟不准、上拉电阻错误、描述符错误、端点缓冲区溢出。I2C通信失败常见原因:上拉电阻缺失、地址错误、时序不匹配、总线死锁。

“STM32串口调试PID”时,如果PID输出通过串口发送,要注意串口发送是阻塞还是中断。阻塞发送会占用CPU,影响PID周期;中断发送需要环形缓冲区,否则数据会覆盖。

6.3 电源与复位问题

“STM32电量一个LED小灯”如果LED闪烁异常,可能是电源纹波大、复位电路不可靠、看门狗误触发。STM32的复位引脚需要10kΩ上拉和100nF电容,如果电容太大,复位时间过长;太小,复位不可靠。电源引脚需要加100nF和10uF电容,模拟电源还要加磁珠隔离。

“STM32 OTA”升级失败,可能是Flash写入未对齐、校验错误、中断向量表未重定位、看门狗未喂狗。OTA过程中要关闭所有中断,或者确保中断服务函数在Bootloader和APP里都有定义。

6.4 常见问题速查表

问题现象可能原因排查方法
程序下载失败Flash保护、芯片型号错、ST-Link固件旧用ST-Link Utility解除保护、检查DFP、升级固件
串口无输出波特率错、TX/RX接反、时钟未使能示波器测TX引脚、检查GPIO复用、检查RCC配置
USB无法识别时钟不准、上拉电阻错、描述符错检查48MHz时钟、D+上拉1.5k、用USB分析仪抓包
定时器捕获不准预分频错、时钟源错、输入滤波未配计算计数器时钟、检查APB时钟、配置输入滤波
中断不触发NVIC未使能、优先级分组错、标志未清检查NVIC_EnableIRQ、检查优先级、检查中断标志
低功耗唤醒失败唤醒源未配、时钟未切换、外设未关检查RTC/EXTI配置、检查时钟树、关闭未用外设
PWM无输出定时器未使能、通道未配、引脚复用错检查TIM_Cmd、检查OC通道、检查GPIO复用
ADC采样跳动参考电压不稳、分压电阻温漂、滤波不足加基准源、用低温漂电阻、软件滑动平均

7. 从理论到项目:几个典型场景的完整思路

7.1 基于STM32的智能台灯

智能台灯的核心需求:光感自动调光、人体感应开关、定时提醒、手动调光。硬件上,光感用BH1750(I2C),人体感应用HC-SR501(GPIO),调光用PWM驱动LED,定时用RTC。软件上,主循环轮询光感和人体感应,PWM用定时器输出,RTC产生秒中断更新计时。关键点:光感数据要滤波,人体感应要消抖,PWM频率要大于200Hz避免闪烁,RTC要配外部晶振保证精度。

7.2 两轮差速小车

差速小车的核心:电机驱动、编码器测速、PID闭环、遥控通信。电机驱动用TB6612或L298N,PWM控制速度,GPIO控制方向。编码器用定时器编码器模式,读取轮速。PID用位置式或增量式,周期1ms到10ms。遥控用蓝牙或2.4G,串口通信。关键点:PID参数整定、编码器方向校准、电池电压监测、死区补偿。

7.3 STM32鱼缸控制器

鱼缸控制器的核心:定时喂食、温度控制、灯光控制、水位检测、WiFi远程。喂食用舵机或步进电机,温度用DS18B20(单总线),灯光用PWM,水位用超声波或浮球开关,WiFi用ESP8266(串口AT指令)。关键点:DS18B20时序要精确、舵机角度要校准、WiFi断线重连、喂食量可调。

7.4 基于STM32的USB虚拟串口数据采集

这个项目的核心:ADC采集传感器数据,USB虚拟串口发送到上位机。ADC用DMA搬运,USB用CDC类。关键点:ADC采样率与USB发送速率匹配、USB缓冲区管理、上位机驱动安装、数据帧格式定义。如果数据量大,可以用USB批量传输,但CDC类通常用中断传输,速率有限。

8. 我个人在实际操作中的体会

STM32的理论学习,最忌讳的就是“只看不练”和“只练不想”。我见过很多人把正点原子或野火的教程视频刷了一遍,代码也跟着敲了,但换个芯片型号或者换个外设就懵了。原因就是没有把理论串起来。我的建议是:每学一个外设,就去看它的框图,理解时钟从哪来、数据怎么流、中断怎么触发;每做一个项目,就画一张系统框图,把各个外设的连接关系标清楚。这样积累下来,你会发现STM32不过就是“内核+总线+外设+时钟+中断”这五个词的排列组合。

另外,不要怕看英文手册。STM32的参考手册(Reference Manual)和芯片数据手册(Datasheet)是最权威的资料,虽然厚,但遇到问题查目录,往往比在网上搜半天更有效。比如“STM32 H743系列微控制器中文技术手册”虽然有中文版,但有些翻译不准确,对照英文原版看更稳妥。

最后分享一个小技巧:如果你在调试时不确定某个外设是否工作,可以用STM32的调试功能,在Keil或CubeIDE里查看外设寄存器。比如看USART的SR寄存器,TXE和RXNE标志位是否变化;看TIM的CNT寄存器,计数器是否在跑;看GPIO的IDR寄存器,引脚电平是否正确。这些寄存器是硬件状态的直接反映,比打印调试信息更直观。

这个内容后续还可以这样扩展:如果你对电机控制感兴趣,可以深入研究STM32的高级定时器、死区插入、刹车输入;如果你对通信感兴趣,可以研究CAN、以太网、USB主机;如果你对低功耗感兴趣,可以研究STOP、STANDBY模式、RTC唤醒、DMA在低功耗下的行为。每一个方向,都是STM32理论在不同场景下的延伸。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 2:18:20

智能车竞赛硬件开源:BUCK电源、差分放大与驱动电路全解析

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

作者头像 李华
网站建设 2026/9/29 2:16:32

使用 Python 将 HTML 表格写入数据库的方法

在数据采集和处理过程中,经常需要将 HTML 表格中的数据提取并存入数据库,以便进一步分析和处理。实现这一功能通常涉及解析 HTML 获取表格内容,并将提取的数据以结构化形式存入数据库。为了确保数据的完整性和安全性,需要考虑数据…

作者头像 李华
网站建设 2026/9/29 2:16:24

OpenCV与PIL图像基础:从读写到PyTorch边缘检测的完整实战

上次我们把 PyTorch 的环境跑通了,这次继续往前走,把图像处理的两大基础库 OpenCV 和 PIL 装好,再拿一个真正能跑的小实战练手。很多零基础的同学在这里会卡住:不是 PyTorch 不会用,而是读进来的图片到底是个 numpy 数…

作者头像 李华
网站建设 2026/9/29 2:16:22

解决 MoviePy 输出文件无法保存问题

在使用 moviepy 进行视频处理时&#xff0c;调用 write_videofile 方法保存视频文件时出现如下错误&#xff1a; Traceback (most recent call last):File "Video\VideoShuffleConcatenate\script.py", line 361, in runFile "<decorator-gen-55>", …

作者头像 李华