STM32 HAL库时基源选择:Systick与TIM的实战配置与RTOS避坑指南
1. 项目概述深入理解HAL库的“心跳”之源在STM32的HAL库开发中有一个看似不起眼却至关重要的配置项它被称为系统的“心跳”或“脉搏”直接决定了整个程序运行的时序基准和稳定性。这就是SYSSystem配置中的“时基源Timebase Source”选择。很多开发者尤其是刚从标准库转向HAL库的朋友在CubeMX里看到这个下拉菜单面对“Systick”和“TIM”通用定时器两个选项时往往会一头雾水随手一选就过去了。直到某一天程序里的HAL_Delay()变得不准或者操作系统移植时出现各种诡异问题才回过头来排查这个根源。这个选择远不止是一个简单的偏好设置。它关系到HAL库内部延时、超时判断的精度影响低功耗模式下的唤醒更与SysTick_Handler()这个中断服务函数的命运紧密相连。选错了你的系统可能表面上能跑但就像一座地基不稳的大楼随时可能在复杂功能叠加或严苛时序要求下暴露问题。我自己就曾在早期项目中因为默认使用Systick作为时基源在尝试接入RTOS时遭遇了调度器无法正常启动的困境排查了大半天才发现是“心跳”冲突了。本文将彻底拆解Systick和TIM作为时基源的核心区别、应用场景、配置细节以及那个关键的SysTick_Handler()函数背后的故事。无论你是正在评估方案选型还是已经踩坑正在寻找解决方案相信这篇从实战中总结出来的经验能帮你建立起清晰的认识做出最合适自己项目的选择。2. 核心原理Systick与TIM的底层差异剖析要做出正确选择必须从根本上理解这两者是什么以及HAL库如何使用它们。2.1 Systick内核专属的“简约时钟”SysTick全称System Tick Timer是ARM Cortex-M内核自带的一个24位递减计数器。它不是STM32外设而是CPU核心的一部分因此所有基于Cortex-M的芯片包括STM32、GD32等都有它。它的核心工作模式非常简单芯片启动后我们可以配置一个重装载值LOAD到SysTick寄存器。SysTick计数器从该值开始每个时钟周期减1。当计数器减到0时会触发一个SysTick异常中断同时计数器自动重载初始值开始下一轮递减。这个周期性触发的中断就是SysTick_Handler()。在HAL库中的角色当选择Systick作为时基源时HAL库的底层延时函数HAL_Delay()以及各种带有超时参数的功能如HAL_UART_Transmit的超时等待其计时基准就来源于此。HAL库会在HAL_Init()函数中初始化SysTick将其中断频率配置为1kHz即每1ms中断一次。HAL_Delay(100)本质上就是等待SysTick触发了100次中断。优点简单通用无需额外配置任何外设与芯片型号无关代码移植性极好。资源零占用不占用任何额外的片上定时器资源。功耗考量在部分低功耗场景下由于其属于内核部分行为可能更可预测。缺点中断频率固定通常被HAL库固定为1ms灵活性差。与RTOS强冲突几乎所有RTOS如FreeRTOS、uC/OS都依赖SysTick作为系统时钟节拍。如果HAL库也占用会导致冲突必须让出一方。中断优先级锁定HAL库初始化时会设置SysTick中断优先级。如果用户程序其他部分需要调整该优先级可能引发不预期行为。2.2 TIM通用定时器灵活强大的“外置脉搏”这里的TIM指的是STM32片上的任一个通用定时器如TIM2、TIM3等。它是一个独立的外设功能远比SysTick强大可以配置为向上/向下计数、产生PWM、输入捕获等。在HAL库中的角色当选择某个TIM如TIM6作为时基源时HAL库会初始化这个定时器将其配置为以固定周期默认也是1ms产生更新中断。HAL库会将该定时器的更新中断服务程序如TIM6_DAC_IRQHandler指向其内部的一个计时函数以替代原本由SysTick_Handler()负责的计时任务。优点灵活性高中断周期可以自由配置不一定非得是1ms可以适配特殊时序需求。为RTOS铺路将系统时基与RTOS的时钟节拍SysTick物理分离从根本上避免冲突。这是使用HAL库进行RTOS开发的标准做法。资源可控定时器资源丰富选择一个不常用的TIM如基本定时器TIM6/TIM7专用于时基管理清晰。中断优先级可调可以像配置其他外设中断一样自由配置其抢占优先级和子优先级融入整体的中断嵌套体系。缺点占用外设资源需要牺牲掉一个定时器。配置稍复杂需要在CubeMX中多配置一个定时器并确保其时钟源正确。功耗影响多开启一个外设理论上会增加一点功耗。注意选择TIM作为时基源后SysTick_Handler()这个函数就不再由HAL库使用了。它变成了一个“空闲”的中断入口用户可以将其用于其他用途例如如果你还想用SysTick但用于自己的计时或者更常见的——交给RTOS使用。3. 配置实战从CubeMX到代码的完整流程理解了原理我们来看看具体怎么操作。这里以STM32F407和STM32CubeMX为例展示两种选择的配置路径。3.1 方案一选择Systick作为时基源默认方案这是CubeMX生成的工程默认选项适用于绝大多数不涉及RTOS的简单应用。CubeMX配置步骤在Pinout Configuration视图下找到左侧分类中的System Core点击进入SYS。在右侧的Debug部分根据你的调试需求选择如Serial Wire。关键一步在Timebase Source下拉菜单中选择SysTick。此时下方可能会提示SysTick是HAL库的时基源。配置完成。生成的代码分析生成代码后在main.c的HAL_Init()函数调用中会间接初始化SysTick。核心的初始化发生在stm32f4xx_hal.c文件的HAL_InitTick()函数中。它会配置SysTick的时钟源为内核时钟HCLK并设置重装载值使其每1ms产生一次中断。中断服务函数SysTick_Handler()在stm32f4xx_it.c中定义其内部直接调用HAL_IncTick()函数用于递增一个全局变量uwTick。这个uwTick就是HAL库所有延时和超时判断的基准。// stm32f4xx_it.c 中的典型代码 void SysTick_Handler(void) { HAL_IncTick(); }实操心得不要手动修改SysTick配置除非你非常清楚后果否则不要在用户代码里调用SysTick_Config()等函数修改其重装载值或中断频率这会直接破坏HAL库的延时精度。注意中断优先级HAL_Init()里会调用HAL_InitTick()其中可能用HAL_NVIC_SetPriority(SysTick_IRQn, ...)设置优先级。如果你的应用有复杂的中断嵌套需求需要关注这个优先级是否合适。3.2 方案二选择TIM作为时基源RTOS或高灵活度方案这是进行RTOS开发或需要自由控制时基周期的推荐方案。CubeMX配置步骤同样进入SYS配置页面。在Timebase Source下拉菜单中选择某个定时器例如TIM6一个基本定时器功能单一很适合做时基。切换到Timers分类找到你选择的定时器如TIM6。配置该定时器Clock Source: 选择Internal Clock。Prescaler (PSC): 分频值。根据你的定时器时钟频率计算以产生1ms中断为例。假设APB1定时器时钟为84MHz欲得1ms中断则定时器计数频率应为1kHz。因此分频值 84MHz / 1kHz - 1 83999。Counter Period (AutoReload Register): 自动重装载值。设为1000 - 1即999这样计数器每计满1000个数产生一次更新事件结合1kHz的计数频率正好是1ms。auto-reload preload: 使能Enable。NVIC Settings: 务必勾选Update interrupt使能全局中断。保存并生成代码。生成的代码分析生成代码后你会发现stm32f4xx_it.c中不再有SysTick_Handler()的函数体可能只有一个弱定义的空白函数。取而代之的是你选择的定时器中断函数例如TIM6_DAC_IRQHandler()。// stm32f4xx_it.c void TIM6_DAC_IRQHandler(void) { HAL_TIM_IRQHandler(htim6); }而HAL_TIM_IRQHandler()这个通用中断处理函数在检测到更新中断TIM_IT_UPDATE时会调用一个回调函数HAL_TIM_PeriodElapsedCallback()。HAL库在stm32f4xx_hal_tim.c中重写了这个回调在其中执行了HAL_IncTick()。// stm32f4xx_hal_tim.c __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM6) { // 假设你用的是TIM6 HAL_IncTick(); } }至此HAL库的“心跳”任务成功从SysTick移交给了TIM6。原来的SysTick_Handler()变成了一个空壳等待被用户或RTOS填充。配置计算详解以STM32F407APB1定时器时钟84MHz目标时基1ms为例定时器时钟频率Timer_CLK 84 MHz期望的定时器计数频率即中断频率Counter_CLK 1 / 1ms 1000 Hz计算预分频器值PSCPSC (Timer_CLK / Counter_CLK) - 1 (84,000,000 / 1000) - 1 83999计算自动重装载值ARR我们希望计数器每计满Counter_CLK个周期产生一次中断但计数器是从0开始计数到ARR所以ARR 目标计数值 - 1。如果希望每1ms中断一次且计数频率已是1000Hz那么计数值应为1000因此ARR 1000 - 1 999。最终定时器每计数(PSC1) * (ARR1) / Timer_CLK (84000 * 1000) / 84,000,000 1秒等等这里容易出错。正确理解是每个定时器时钟周期计数器加1。经过PSC1分频实际驱动计数器的时钟频率变为Timer_CLK / (PSC1) 84MHz / 84000 1kHz。计数器从0计数到ARR999需要1000个这样的时钟周期所以时间间隔是1000 * (1 / 1kHz) 1000ms不对是1ms因为1kHz的周期是1ms计数1000次正好是1000ms逻辑混乱了。纠正这里的关键是Counter_CLK的理解。我们设定了Counter_CLK 1kHz意思是计数器自身递增的频率是1kHz即每1ms计数器加1。那么让计数器从0加到999总共1000次递增需要的时间就是1000 * 1ms 1000ms。这显然不是我们想要的1ms中断。正确的计算逻辑应该是我们希望的中断周期 T 1ms。 定时器时钟源频率 F_timer 84 MHz。 我们需要找到一个分频值PSC和重载值ARR使得(ARR 1) * (PSC 1) / F_timer T即(ARR 1) * (PSC 1) F_timer * T 84,000,000 * 0.001 84,000这是一个整数分解问题。我们可以令PSC 1 8400则ARR 1 10。这样PSC 8399ARR 9验证(83991) * (91) / 84,000,000 8400 * 10 / 84,000,000 84,000 / 84,000,000 0.001秒 1ms。或者为了获得更精细的调整能力可以令PSC 1 840ARR 1 100结果一样。CubeMX在配置时输入PSC8399和ARR9即可。我之前提到的83999和999是常见的用于产生1秒中断的配置用于1ms中断是错误的这是一个非常重要的细节避坑指南定时器周期计算是新手最容易出错的地方之一。务必厘清定时器输入时钟 - 经过PSC分频 - 得到计数器时钟CK_CNT - 计数器从0计数到ARR - 产生更新事件。中断周期 (ARR 1) * (PSC 1) / F_timer。建议使用CubeMX的“Parameter Calculations”功能辅助计算和验证。4. 高级应用与问题排查4.1 在RTOS环境中如何选择与配置这是时基源选择最重要的应用场景。以FreeRTOS为例它必须独占SysTick作为其调度器的时钟节拍。标准做法CubeMX配置在SYS中将Timebase Source设置为任何一个非SysTick的定时器如TIM6。FreeRTOS配置在Middleware中选择FreeRTOS并将其Timer配置为SysTick。CubeMX会自动生成代码将SysTick用于RTOS内核。代码生成生成代码后SysTick_Handler()会被FreeRTOS的xPortSysTickHandler()函数接管用于任务调度。而HAL库的时基则由你选择的TIM如TIM6的中断来维护HAL_IncTick()。实操心得优先级设置务必合理设置SysTickRTOS用和TIMHAL时基用的中断优先级。通常RTOS的SysTick中断优先级会设置为最低如优先级数字最大以确保它不会阻塞其他紧急的外设中断。而HAL库的时基定时器中断优先级可以设置得比RTOS的高但一般也无需太高因为它只做简单的累加操作。检查FreeRTOSConfig.h确保configUSE_TICKLESS_IDLE低功耗tickless模式等配置与你的时基方案兼容。如果你使用了TIM作为HAL时基并且想让RTOS也使用一个独立的硬件定时器而非SysTick进入tickless模式配置会更为复杂。4.2 SysTick_Handler() 的神秘消失与重现当你选择TIM作为时基源后可能会在stm32f4xx_it.c里找不到SysTick_Handler()的函数体或者只有一个__weak定义的空白函数。这是正常的因为HAL库不再需要它。如果你想重新启用SysTick用于自己的用途直接在stm32f4xx_it.c中重新实现一个强定义的SysTick_Handler()函数。在这个函数里你可以编写自己的毫秒/微秒级延时函数基准或者用于其他需要精确计时的地方。切记不要在这个自定义的中断里调用HAL_IncTick()除非你想让HAL库的计时基准错乱。同样如果你已经将SysTick交给了RTOS就绝对不能再修改这个函数。4.3 常见问题排查实录问题1HAL_Delay()延时严重不准或程序卡死。可能原因1使用Systick时基SysTick中断被意外关闭或优先级被修改。检查是否有其他代码如某些库函数或自己写的代码调用了__disable_irq()或修改了SysTick配置。可能原因2使用TIM时基选择的定时器时钟源未使能或分频计算错误。使用CubeMX的时钟树Clock Configuration视图确认你选择的TIM所在的总线APB1或APB2时钟是否已正确开启并且HAL_TIM_Base_Start_IT(htimx)是否被成功调用通常在HAL_Init()之后的初始化流程中。排查方法在调试模式下查看uwTick这个全局变量在main.c中声明为extern是否每毫秒稳定递增。如果不递增说明时基中断未正常工作。问题2移植FreeRTOS后系统无法调度或运行异常。可能原因HAL库和FreeRTOS都试图使用SysTick。这是最典型的冲突。解决方案严格按照上文所述将HAL库的Timebase Source改为其他TIM确保CubeMX中FreeRTOS的时钟源是SysTick。问题3低功耗模式下HAL_Delay()无法唤醒或计时错误。可能原因进入低功耗模式如Stop、Standby后系统时钟可能停止或切换。如果时基源依赖的时钟停了计时自然就停了。解决方案如果使用Systick需确认在低功耗模式下内核时钟如HSI是否仍在运行。有些低功耗模式会停掉HSI。如果使用TIM需选择在目标低功耗模式下仍能运行的时钟源如LSI低速内部时钟。这需要更复杂的配置通常需要退出低功耗模式后重新初始化定时器或者使用具有唤醒功能的独立看门狗IWDG/实时时钟RTC来辅助。问题4时基中断频率能改吗比如我想要10us的中断来做高精度延时。答案可以但不推荐直接修改HAL库的默认1ms时基。因为HAL库内部很多超时判断通常是HAL_MAX_DELAY是基于1ms的uwTick设计的。推荐做法保留HAL库的1ms时基用于HAL_Delay()和标准超时。如果需要更高精度的延时可以单独启用另一个定时器配置为10us中断在这个中断里维护一个自己的微秒级计数器或者使用定时器的DMA循环缓冲模式实现非阻塞的精确延时。SysTick_Handler()本身是24位计数器理论上可以通过修改重装载值获得更高中断频率但同样会破坏HAL库的假设风险很高。5. 方案选型总结与个人建议经过上面的详细拆解我们可以清晰地看到两种选择的定位选择 SysTick“省心之选”。适用于简单的、裸机运行的、对时序要求不苛刻、且确定未来不会移植RTOS的应用。它是CubeMX的默认选项开箱即用零额外资源消耗。选择 TIM“专业之选”。适用于以下场景计划移植或已经使用RTOS如FreeRTOS、uC/OS。对系统时基有特殊周期要求虽然HAL库内部可能仍按1ms处理uwTick但中断源可控。项目复杂需要精细管理中断优先级不希望HAL库固定SysTick的优先级。需要深入低功耗管理可能涉及动态切换时基时钟源。从我个人的多个项目经验来看除非是极其简单的验证性程序否则我更倾向于从一开始就选择TIM作为时基源。理由有三第一它为未来引入RTOS扫清了最大障碍避免了后期重构的麻烦第二它释放了SysTick这个内核定时器有时可以作为一个非常方便的、高精度的软件计时器备用第三这种配置清晰地分离了系统基础服务HAL时基和内核服务RTOS调度或自定义功能让系统架构更清晰、更健壮。多占用一个基本定时器如TIM6/TIM7的成本在资源丰富的现代STM32芯片上几乎可以忽略不计但带来的灵活性和可维护性提升是巨大的。最后一个小技巧如果你选择了TIM作为时基源并且工程中暂时用不到SysTick不妨在SysTick_Handler()里放一个简单的LED翻转语句并让一个GPIO驱动LED。这样这个LED的闪烁可以直观地告诉你SysTick中断是否在运行比如被RTOS正常接管了是一个非常实用的调试辅助手段。

相关新闻

MOSFET驱动电流估算:从Qg公式到PCB布局的实战避坑指南

MOSFET驱动电流估算:从Qg公式到PCB布局的实战避坑指南

1. 从一次“诡异”的炸管说起:为什么驱动电流不是小事去年,我接手了一个DC-DC电源模块的整改项目。客户反馈,在满载高温老化测试中,MOS管(我们用的是常见的N沟道增强型MOSFET)会随机性损坏,现象…

2026/10/10 11:39:17 阅读更多 →
C++虚函数表(vtable)原理深度解析:从多态实现到内存布局与性能优化

C++虚函数表(vtable)原理深度解析:从多态实现到内存布局与性能优化

1. 项目概述:从“多态”的困惑到“虚函数表”的答案如果你写过C,尤其是尝试过用基类指针去调用派生类的方法,那你一定对“多态”这个词又爱又恨。爱的是,它让代码变得灵活优雅,一个接口可以应对千变万化的实现&#xf…

2026/10/10 2:26:13 阅读更多 →
STM32 SPI屏幕驱动优化:从GPIO模拟到DMA+硬件SPI的刷图方案详解

STM32 SPI屏幕驱动优化:从GPIO模拟到DMA+硬件SPI的刷图方案详解

1. 项目概述:从点灯到刷屏的进阶之路玩STM32的朋友,从点灯入门后,第一个有成就感的项目往往就是驱动一块屏幕。当字符、图形甚至动画在屏幕上流畅显示时,那种满足感是无可替代的。而SPI接口的屏幕,因其引脚少、驱动相对…

2026/10/9 7:09:18 阅读更多 →

最新新闻

Django+Vue外卖点餐系统毕设指南:从建表到联调全流程

Django+Vue外卖点餐系统毕设指南:从建表到联调全流程

简介:一套基于Python Django与Vue.js开发的外卖点餐系统毕业设计项目,采用B/S架构,适合计算机相关专业学生作为毕业设计或课程设计参考。前端覆盖首页、菜品详情、订单中心、用户中心等核心用户场景;后台提供总览、订单管理、菜品…

2026/10/11 13:14:52 阅读更多 →
如何在 Virtual Mac 上 5 分钟装好 macOS:新手保姆级快速上手教程

如何在 Virtual Mac 上 5 分钟装好 macOS:新手保姆级快速上手教程

【免费下载链接】VirtualMacOniPad People have dreamed of running macOS on iPad for more than a decade. Today, that dream comes true. With Virtual Mac, iPad finally breaks free from iPadOS, enabling pro apps like Xcode, Terminal, Final Cut Pro, Logic Pro, an…

2026/10/11 13:14:52 阅读更多 →
Kubernetes弹性伸缩实战:HPA、VPA与Cluster Autoscaler原理与配置

Kubernetes弹性伸缩实战:HPA、VPA与Cluster Autoscaler原理与配置

这两年只要跟Kubernetes沾边的团队,几乎都会聊到弹性伸缩。我这些年在一线折腾过不少集群,从最早以为加个 HPA 就万事大吉,到后来被线上抖动、扩容滞后和成本账单来回折磨,才算是把这一整套机制吃透。Kubernetes弹性伸缩实际上不是…

2026/10/11 13:14:52 阅读更多 →
Kubernetes弹性伸缩实战:HPA、VPA、CA与KEDA解析

Kubernetes弹性伸缩实战:HPA、VPA、CA与KEDA解析

做 Kubernetes 这行绕不开的话题就是弹性伸缩。很多人觉得只要部署到集群里,流量大了自然就能扩容,结果一到促销或者突发流量就被报警轰醒,才发现 Pod 数量没有动,节点也快被打满了。原因很简单,Kubernetes 的弹性伸缩…

2026/10/11 13:14:52 阅读更多 →
把CIContext存进@State?SwiftUI-Agent-Skill的“状态即缓存“高级技巧解析

把CIContext存进@State?SwiftUI-Agent-Skill的“状态即缓存“高级技巧解析

【免费下载链接】SwiftUI-Agent-Skill SwiftUI agent skill for Claude Code, Codex, and other AI tools. 项目地址: https://gitcode.com/GitHub_Trending/swi/SwiftUI-Agent-Skill 点击查看 免费下载 SwiftUI-Agent-Skill(技能名 SwiftUI Pro&#x…

2026/10/11 13:14:52 阅读更多 →
健身动作错误归因数据集:专注关节抖动、遮挡漂移与小目标定位

健身动作错误归因数据集:专注关节抖动、遮挡漂移与小目标定位

简介:本资源是面向计算机视觉开发者与运动健康AI研究者的健身动作关键点检测专用数据集,聚焦于自下而上类动作识别与姿态评估,解决健身动作自动判别、姿势纠错与虚拟教练系统构建等核心问题。数据集共1758张真实场景图像(含训练/验…

2026/10/11 13:13:51 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →