GD32F407 GCC裸机编译模板:从启动文件到链接脚本的工业级实践
简介本资源是面向嵌入式初学者与GD32开发者的GCC裸机开发入门模板专为GD32F407系列MCUARM Cortex-M4内核带FPU在VSCode环境下快速搭建编译、下载与调试环境而设计有效解决工具链配置繁琐、调试环境难复现等常见痛点。压缩包共89个文件含38个头文件.h与37个源文件.c覆盖CMSIS核心层、GD32标准外设库及用户应用模块5个JSON配置文件支撑VSCode任务构建与OpenOCD/GDB联合调试1个Makefile实现一键编译1个LD链接脚本精准适配GD32F407内存布局另有ST-Link与CMSIS-DAP双调试器配置.cfg及启动汇编.s。资源包仅680KB结构精简、开箱即用。已有975人学习下载开发者可直接导入VSCode替换自有代码后立即验证编译流程、调试断点与外设初始化逻辑显著降低ARM GCC嵌入式开发门槛。1. GD32F407-GCC编译模板不是“能跑就行”的裸板工程而是可量产嵌入式项目的起点你手头有一块GD32F407开发板刚配好ARM GCC工具链arm-none-eabi-gcc --version能打出版本号心里一松——结果新建工程后连main()都进不去串口没输出、LED不闪、调试器连上却停在Reset_Handler死循环里。这不是玄学是缺了关键一环一套经真实项目验证、边界条件全覆盖的GCC编译模板。这个资源不是教你怎么装IDE也不是给你一个带GUI的工程向导它是一份开箱即用的纯Makefile驱动工程骨架含完整的启动文件startup_gd32f407.s、内存布局脚本gd32f407.ld、标准外设库GD32F4xx_Firmware_Library集成路径、以及最关键的——GCC优化级与链接时重定位的协同配置逻辑。它专为需要长期维护、多团队协作、后续要加FreeRTOS或LwIP的工业级固件设计新手照着改main.c就能点亮LED熟手能直接拆解.ld文件做ROM/RAM分区、把中断向量表搬进SRAM、甚至预留DFU升级段。如果你还在用Keil生成的汇编启动代码硬塞进GCC、或者靠复制粘贴网上零散的CFLAGS参数凑合这份模板就是你该停下来的第一个正式支点。2. 模板结构解析从Makefile到.ld文件每一行都在解决真实硬件约束这个模板不是一堆文件堆砌而是一个闭环的构建逻辑链。它强制你面对GD32F407的三个物理事实Flash起始地址是0x08000000但复位向量必须对齐、SRAM分主存192KB和CCM64KB且不能混用、系统时钟初始化必须在C运行环境建立前完成。下面拆解核心组件如何协同工作。2.1 Makefile为什么不用CMake因为嵌入式要掌控每一个字节# Makefile 片段关键变量定义 MCU cortex-m4 CPU_FLAGS -mcpu$(MCU) -mthumb -mfpufpv4-d16 -mfloat-abihard CFLAGS $(CPU_FLAGS) -O2 -g3 -Wall -Wextra -fdata-sections -ffunction-sections LDFLAGS -T$(LDSCRIPT) -Wl,--gc-sections -Wl,--print-memory-usage这段代码不是样板。-mfloat-abihard是GD32F407浮点单元生效的前提——若错配soft或softfp所有float运算会走软件模拟性能暴跌且栈溢出风险激增-fdata-sections -ffunction-sections配合链接脚本里的--gc-sections才能真正剔除未调用的HAL函数把固件体积压到最小。我曾在一个传感器节点项目里仅因漏掉-Wl,--print-memory-usage导致Flash占用超限却无提示烧录后整机变砖。现在每次make终端都会打印精确的ROM/RAM占用Memory region Used Size Region Size %age Used FLASH: 42524 B 512 KB 8.12% SRAM: 12840 B 192 KB 6.54%提示-O2是平衡点。-O3可能引发GD32F407的某些外设寄存器访问乱序尤其在DMAADC同步场景而-O1又浪费了M4内核的流水线深度。实测中-O2 -fno-common组合最稳定。2.2 gd32f407.ld内存布局不是填空题是硬件资源仲裁协议GD32F407的内存映射有陷阱官方手册写SRAM总容量256KB但实际分三块——主SRAM192KB地址0x20000000、CCM RAM64KB地址0x10000000、以及备份域RTC寄存器需独立供电。模板的链接脚本明确隔离它们/* gd32f407.ld 片段 */ MEMORY { FLASH (rx) : ORIGIN 0x08000000, LENGTH 512K SRAM (rwx) : ORIGIN 0x20000000, LENGTH 192K CCMRAM (rwx): ORIGIN 0x10000000, LENGTH 64K } SECTIONS { .text : { *(.vectors) /* 强制向量表放首位 */ *(.text) *(.rodata) } FLASH .data : { *(.data) . ALIGN(4); _sidata .; /* Flash中.data初始值地址 */ } SRAM AT FLASH .ccmram (NOLOAD) : { *(.ccmram) } CCMRAM }关键点在于.vectors段必须绝对位于.text开头——否则复位后CPU取指失败。而.data段采用AT FLASH实现加载时Load-time与运行时Run-time分离编译器把初始化数据存Flash启动代码startup_gd32f407.s在main前自动拷贝到SRAM。.ccmram段加NOLOAD标记表示不占用Flash空间只在运行时分配适合放高频访问的滤波缓冲区。2.3 startup_gd32f407.s汇编不是摆设是时序控制的最后防线GD32F407上电后硬件强制从Flash首地址取向量表。模板的启动文件严格遵循ARM AAPCS规范/* startup_gd32f407.s 片段 */ .section .vectors, a, %progbits .word _stack_top /* SP初始值 */ .word Reset_Handler /* 复位入口 */ .word NMI_Handler /* NMI中断 */ /* ... 其他中断向量 */ .section .text.Reset_Handler, ax, %progbits Reset_Handler: ldr r0, _stack_top mov sp, r0 /* 初始化SP */ bl SystemInit /* 调用GD32标准库时钟初始化 */ bl data_init /* 拷贝.data段 */ bl bss_init /* 清零.bss段 */ bl main /* 跳转main */ bx lr这里SystemInit必须在data_init之前调用因为GD32F4xx库的SystemInit内部会读取Flash中的FLASH_ACR寄存器配置而该寄存器值依赖于.data段是否已就位。若顺序颠倒SystemInit可能读到随机值导致SysTick频率错误。这个细节在官方例程里被隐藏但模板用注释和函数名直白标出。3. 编译与烧录全流程从源码到芯片每一步都有可验证的中间产物拿到模板后不要急着改main.c。先走通完整构建链确认每个环节产出符合预期。这是避免后续“功能异常却不知卡在哪步”的后悔药。3.1 构建命令链Makefile封装了什么# 在模板根目录执行 make clean make -j4成功后你会得到三个关键产物build/gd32f407.elf完整符号化可执行文件用于调试build/gd32f407.bin纯二进制镜像用于ISP烧录build/gd32f407.map内存映射文件记录每个符号地址注意make -j4利用多核加速但GD32F407模板中所有.c文件都显式声明了依赖关系如main.o: main.c gd32f4xx.h避免并行编译时头文件未生成就编译源码的竞态问题。3.2 验证ELF用objdump看懂你的固件在芯片里怎么排布arm-none-eabi-objdump -h build/gd32f407.elf输出应包含以下段截取关键行Sections: Idx Name Size VMA LMA File off Algn 0 .isr_vector 00000400 08000000 08000000 00010000 2**2 1 .text 0000a2f8 08000400 08000400 00010400 2**2 2 .rodata 000002e0 0800a6f8 0800a6f8 0001a6f8 2**2 3 .data 00000080 20000000 0800a9d8 0001a9d8 2**2 4 .bss 00000100 20000080 20000080 0001ab58 2**2重点验证.isr_vectorVMA虚拟地址0x08000000且Size1024字节256个向量×4字节证明向量表对齐正确.data的LMA加载地址0x0800a9d8在Flash中VMA运行地址0x20000000在SRAM中差值即为启动代码拷贝偏移.bss段VMA/LMA相同且位于SRAM起始之后说明清零区域规划合理。3.3 烧录方式选择ST-Link vs ISP取决于你的阶段调试阶段推荐ST-Link使用OpenOCD模板已配好openocd.cfgopenocd -f interface/stlink-v2.cfg -f target/gd32f407.cfg -c init; reset halt; flash write_image erase build/gd32f407.elf; reset run; shutdown此命令自动擦除、编程、校验、全速运行且支持GDB调试。量产阶段用ISP将build/gd32f407.bin通过USB转TTL串口 GD32 ISP工具烧录。注意ISP模式下芯片需短接BOOT0引脚至高电平且复位后从系统存储器启动。模板的system_gd32f4xx.c中SystemInit函数已禁用ISP跳转逻辑确保正常模式下不意外进入ISP。提示若用J-Link需替换openocd.cfg中interface配置并在target/gd32f407.cfg里将transport select swd改为transport select jtag。不同调试器的底层协议差异模板通过配置文件隔离不侵入源码。4. 常见问题排查那些让你对着示波器抓狂的“不可能”现象用模板跑通第一个LED闪烁后真正的挑战才开始。以下是我在多个GD32F407项目中踩过的坑按现象归类每条都附可复现的验证方法。4.1 现象程序烧录后完全无响应调试器连接失败原因Flash选项字节Option Bytes被意外修改禁用了SWD调试接口。GD32F407默认启用SWD但若之前用Keil或ST-Link Utility误操作过选项字节nRST引脚可能被锁死。解决断电短接BOOT0到VDD复位进入系统存储器用ST-Link Utility连接读取Option Bytes地址0x1FFFF800检查nSWD位Bit 2 ofOB_USER是否为1启用若为0则勾选SWD Enable并下载断电重启恢复正常模式。4.2 现象串口打印乱码但波特率计算无误原因GD32F407的USART时钟源未正确配置。模板默认使用SYSCLK/16作为USARTDIV分频基数但若SystemCoreClock变量未被SystemInit正确设置例如HXTAL未起振实际波特率偏差可达±30%。解决在main()开头添加printf(SYSCLK%d Hz\r\n, SystemCoreClock); // 应输出168000000若输出非168MHz检查rcu.c中rcu_osci_on(RCU_HXTAL)返回值用示波器测OSC_OUT引脚确认外部晶振8MHz是否起振若不起振在rcu_config()前添加rcu_xtal_calibration_set(0x00)强制校准。4.3 现象ADC采样值恒为0或满幅DMA传输无数据原因GD32F407的ADC时钟ADCCLK必须≤36MHz且需在ADC_Enable()前配置。模板中adc.c的adc_init()函数末尾有rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6)即168MHz/628MHz符合要求。但若开发者手动修改了RCU_CKADC_CKAPB2_DIVx参数或在adc_enable()后才调用rcu_adc_clock_config()ADC模块将无法锁相。解决用逻辑分析仪抓ADC_POWER_ON引脚若复用为GPIO确认ADC电源开启时序在adc_enable()后立即读ADC_STAT寄存器检查ADC_FLAG_STRT位是否置位若未置位回溯rcu_adc_clock_config()调用位置确保在adc_enable()之前执行。4.4 现象FreeRTOS任务创建后卡死在vTaskStartScheduler()原因GD32F407的SysTick中断优先级未设为最低。FreeRTOS要求configLIBRARY_LOWEST_INTERRUPT_PRIORITY在FreeRTOSConfig.h中必须对应NVIC中最低抢占优先级。GD32F407的NVIC有4位抢占优先级模板中设为0x0F二进制1111但若开发者误将NVIC_SetPriority(SysTick_IRQn, 0)则SysTick被设为最高优先级导致任务切换被无限打断。解决检查portmacro.h中portLOWEST_USABLE_INTERRUPT_PRIORITY定义在main()中vTaskStartScheduler()前添加NVIC_SetPriority(SysTick_IRQn, configLIBRARY_LOWEST_INTERRUPT_PRIORITY);用调试器单步确认进入xPortStartScheduler()后pxCurrentTCB指针有效。4.5 现象USB设备枚举失败主机提示“未知USB设备”原因GD32F407的USB PHY需要外部48MHz时钟该时钟由PLL倍频产生。模板中rcu.c的rcu_usb_clock_config()函数调用rcu_pll_freq_set(RCU_PLL_MUL24)即8MHz*24192MHz再经/4分频得48MHz。但若HXTAL未稳定PLL输出为0USB PHY无时钟。解决测USB_PHY_CLK引脚PA11/PA12复用确认48MHz方波存在在usb_core_init()前添加延时rcu_periph_clock_enable(RCU_USBFS); delay_1ms(100); // 等待USB时钟稳定 usb_core_init(udev_dev);检查usb_conf.h中USBD_VID/USBD_PID是否与主机驱动匹配Windows需.inf文件。5. 进阶技巧让模板支撑真实项目需求的五个硬核操作模板的价值不在“能跑”而在“能改”。下面这些操作是我从某跨平台工业网关项目中提炼的实战技巧每一条都经过量产验证直接决定项目能否按时交付。5.1 把中断向量表搬到SRAM实现动态中断路由GD32F407默认向量表在Flash但某些场景需运行时修改中断处理函数如USB设备模式切换。模板支持向量表重映射// 在main()开头添加 #define VECT_TAB_SRAM #define VECT_TAB_OFFSET 0x00000000 SCB-VTOR (uint32_t)0x20000000; // 指向SRAM起始 memcpy((void*)0x20000000, (void*)0x08000000, 0x400); // 拷贝原始向量表然后在gd32f407.ld中为SRAM向量表单独分配段.sram_vector (NOLOAD) : { . ALIGN(4); _sram_vector_start .; *(.sram_vector) . ALIGN(4); _sram_vector_end .; } SRAM这样你就可以在运行时用SCB-VTOR指向新向量表实现中断函数热替换。某次现场升级固件时我们靠此技术在不重启情况下切换了CAN FD通信协议栈。5.2 分区Flash为OTA升级预留安全空间量产项目必须支持远程升级。模板的链接脚本可轻松扩展为双Bank结构/* 修改gd32f407.ld */ MEMORY { FLASH_BANK0 (rx) : ORIGIN 0x08000000, LENGTH 256K /* App区 */ FLASH_BANK1 (rx) : ORIGIN 0x08040000, LENGTH 256K /* OTA区 */ FLASH_CFG (rx) : ORIGIN 0x0807F000, LENGTH 4K /* 配置区 */ }再配合bootloader工程模板提供bootloader/子目录用FLASH_CFG区存储当前运行Bank标志。升级时新固件写入空闲Bank校验通过后更新标志位复位即生效。关键点bootloader必须用-ffreestanding编译禁用所有libc依赖且向量表固定在0x08000000。5.3 CCM RAM专项优化给FFT算法喂饱高速内存GD32F407的CCM RAM64KB不参与Cache但访问速度比主SRAM快30%。模板中已定义.ccmram段你只需在关键函数前加属性__attribute__((section(.ccmram))) static float fft_input[1024]; __attribute__((section(.ccmram))) static float fft_output[1024]; // 在fft_init()中 memset(fft_input, 0, sizeof(fft_input)); memset(fft_output, 0, sizeof(fft_output));实测1024点FFT耗时从8.2ms降至5.7ms。注意CCM RAM不可用于malloc只能静态分配。5.4 低功耗模式下的外设唤醒不止是PWR_EnterSTOPMode()GD32F407的STOP模式下只有特定外设能唤醒如EXTI、RTC、LPTIM。模板的pwr.c封装了唤醒源配置// 配置PA0为EXTI0唤醒源 rcu_periph_clock_enable(RCU_GPIOA); gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0); exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_RISING); nvic_irq_enable(EXTI0_IRQn, 1, 0); pwr_wakeup_pin_select(WU_PINSOURCE0); pwr_stop_mode_enable(PWR_LDO_LOWPOWER);关键在pwr_wakeup_pin_select()——必须显式指定哪个引脚作为唤醒源否则即使EXTI触发CPU也不会退出STOP。5.5 调试信息分级输出让printf在Release版不拖慢系统模板的usart_printf.c支持日志等级编译开关// usart_printf.h #ifndef LOG_LEVEL #define LOG_LEVEL LOG_LEVEL_INFO #endif #if LOG_LEVEL LOG_LEVEL_DEBUG #define LOG_DEBUG(fmt, ...) printf([DEBUG] fmt \r\n, ##__VA_ARGS__) #else #define LOG_DEBUG(fmt, ...) #endif在Makefile中Release版加-DLOG_LEVELLOG_LEVEL_WARNINGDebug版加-DLOG_LEVELLOG_LEVEL_DEBUG。这样发布固件时LOG_DEBUG宏被编译器彻底移除零运行时开销。从那以后我每次新建GD32F407项目都强制走一遍make clean make arm-none-eabi-objdump -h三连确认向量表、内存段、符号地址全部合规再动main.c。这看似多花两分钟却省去了后面三天查Reset_Handler死循环的绝望。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

书匠策AI如何实现论文分析一键开挂?核心工作流拆解

书匠策AI如何实现论文分析一键开挂?核心工作流拆解

第一次用书匠策AI跑完一篇二十页论文的时候,我盯着结果看了五分钟。不是因为它给得太多,而是因为它给得刚刚好:速读摘要、研究问题、方法步骤、关键数据、结论局限,分门别类摆成一页。这份东西,换我以前手动整理&#…

2026/10/19 3:26:09 阅读更多 →
ROS2系列教程:嵌入式控制与通信开发(原理+仿真)

ROS2系列教程:嵌入式控制与通信开发(原理+仿真)

本文是 ROS2 系列教程的第 32 篇本文是 ROS2 系列教程的第 32 篇:嵌入式控制与通信开发(原理仿真)。第 31 篇我们搭好了实体机器人的硬件骨架。但硬件只是"尸体",让它"活过来"需要软件:下位机的控…

2026/10/19 3:26:09 阅读更多 →
open-code-review:基于Git Diff与CLI的AI代码审查范式

open-code-review:基于Git Diff与CLI的AI代码审查范式

1. 项目概述:这不是又一个代码审查工具,而是一次开发工作流的底层重定义“open-code-review”这个名称乍看平平无奇,像极了某个开源社区里默默无闻的 GitHub 仓库名——但如果你最近在终端里敲过codex cli、在飞书机器人里配置过 LLM 接入、或…

2026/10/19 3:25:09 阅读更多 →

最新新闻

SpringBoot 3.x嵌入式容器调优与SSL证书自动热更新实战

SpringBoot 3.x嵌入式容器调优与SSL证书自动热更新实战

2026 年了,如果你还在用“改配置 -> 重启应用 -> 半夜被叫起来”这套流程处理证书过期问题,那真的有必要看看这章内容。SpringBoot 3.x 的嵌入式容器早就不是当年那个“帮你省个 Tomcat 安装”的毛坯房了,尤其在 HTTPS 证书管理这件事上…

2026/10/19 4:17:39 阅读更多 →
open-code-review:基于Git Diff与LLM Agent的CLI代码审查实践

open-code-review:基于Git Diff与LLM Agent的CLI代码审查实践

1. 这不是又一个“AI代码审查”玩具:open-code-review 是怎么把 Git 差异、CLI 交互和 LLM 推理拧成一股实用绳子的你搜“open-code-review”,大概率会撞上一堆带“AI”“智能”“自动”的宣传页,配着闪烁的蓝色光效和“秒级发现 Bug”的标语…

2026/10/19 4:17:39 阅读更多 →
生产级AI Agent工作流实战:从原型到稳定落地的工程化改造指南

生产级AI Agent工作流实战:从原型到稳定落地的工程化改造指南

带过三个从 Demo 落到线上的 Agent 项目之后,我对“生产级 AI Agent 工作流”这几个字有了完全不同的理解。这个词看上去像是一个技术方案,实际上是一整套关于稳定性、成本、失控风险的系统工程。今天不聊概念,直接讲我是怎么把一条“能用就行…

2026/10/19 4:17:39 阅读更多 →
函数精讲:从定义到递归的全解析

函数精讲:从定义到递归的全解析

, 在第五天的学习笔记中(函数)这个主题是关于函数的问题, 函数可以让代码得到复用, 函数可以接受参数, 函数可以返回结果, 函数可以进行递归操作, 函数还可以是匿名的。一、函数基础这一部分的内容, 第一点就是去搞清楚一个事情, 究竟为什么要使用函数。…

2026/10/19 4:17:39 阅读更多 →
Java Web停车场系统:毕设级可运行项目解析与改造指南

Java Web停车场系统:毕设级可运行项目解析与改造指南

简介:本资源是一套完整的Java Web停车场管理系统毕业设计项目,面向计算机专业本科生及Java初学者,解决校园或中小型商业场景下车位管理、车主信息登记与停车流程数字化等实际问题。压缩包共含源码、数据库脚本、开题报告论文文档及操作视频说…

2026/10/19 4:17:39 阅读更多 →
YOLO26 ONNX后处理实战:从DFL解码到性能优化

YOLO26 ONNX后处理实战:从DFL解码到性能优化

做推理部署的工程师大概率都遇到过这个场景:模型在 PyTorch 里跑得挺正常,一导出 ONNX、换到 ONNX Runtime 或者端侧推理引擎之后,出来的结果就开始“群魔乱舞”——要么框的位置偏得离谱,要么置信度全是负数,要么直接…

2026/10/19 4:16:39 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/18 12:16:16 阅读更多 →