STM32F103C8T6裸机工程模板:寄存器级开发快速上手
简介本资源是面向STM32嵌入式初学者与项目开发者的C8T6工程模板标准外设库版专为STM32F103C8T6“蓝 pill”核心板快速启动设计解决从零搭建开发环境耗时长、外设初始化易出错等典型痛点适用于智能硬件原型开发、课程实验及小型工业控制模块验证。压缩包共185个文件涵盖34个C源文件如stm32f10x_usart.c、system_stm32f10x.c、34个头文件h、34个编译中间文件o及33个依赖/映射文件crf、map、sct等完整包含启动代码、RCC/GPIO/USART/ADC/I2C/CAN等全系列标准外设驱动以及可直接编译的Keil工程uvprojx/uvoptx和生成的axf、hex、lst等调试输出文件包体大小6.54MB。目前已有367人学习下载。用户开箱即用无需手动配置时钟与中断向量表可直接在user代码区添加功能逻辑所有库函数调用均符合ST官方标准配套结构清晰的目录组织便于理解底层寄存器操作与HAL过渡前的底层开发范式。1. C8T6工程模板库是什么一个专为嵌入式Cortex-M3/M4芯片设计的开箱即用型裸机开发骨架你刚拿到一块标着“C8T6”的开发板芯片丝印写着STM32F103C8T6——不是开发板型号是核心MCU型号。它只有64KB Flash、20KB RAM、72MHz主频没RTOS、没USB协议栈、没图形界面但你要在两周内交出一个带ADC采样PWM调光串口命令交互的固件。这时候“C8T6工程模板库.zip”不是锦上添花而是救命稻草。它不是一个IDE插件也不是某家厂商的HAL封装而是一套去抽象、去冗余、可裁剪、可调试的裸机工程结构包含已配好时钟树的startup汇编、带寄存器级注释的外设驱动头文件GPIO/USART/ADC/TIM、预置中断向量表偏移的链接脚本、以及一个能直接烧录运行的最小main循环框架。它不依赖CubeMX生成逻辑也不绑定特定IDE——Keil、IAR、GCCarm-none-eabi-gcc三者均可一键切换。适合两类人一是刚从51单片机转过来、被STM32标准外设库和HAL绕晕的新手二是需要快速验证硬件功能、拒绝在初始化代码里debug三天的老手。它解决的不是“能不能跑”而是“能不能在30分钟内跑通第一个LED闪烁并清楚知道每一行代码在操作哪个寄存器”。2. 拆包即用从解压到烧录的完整链路实操这个压缩包名字叫“C8T6工程模板(库).zip”但实际内容远不止“模板”二字。它本质是一个分层明确、职责清晰、无隐藏依赖的工程骨架。解压后你会看到四个核心目录Core/内核启动与系统级配置、Drivers/寄存器级外设驱动、Application/用户业务逻辑入口、Tools/编译与烧录辅助脚本。没有.uvprojx或.eww这类IDE专属文件——所有构建逻辑由Makefile统一管理这是它跨IDE能力的底层保障。2.1 环境准备只装三样东西拒绝环境污染你不需要安装Keil MDK或IAR Embedded Workbench。只需确认本地已安装以下三个工具全部开源免费ARM GCC工具链推荐使用arm-none-eabi-gcc 10.3.1或更新版本验证过12.2.0兼容性良好。OpenOCD用于JTAG/SWD调试与烧录建议v0.12.0旧版对ST-Link v3支持不稳定。Minicom / PuTTY / Tera Term任选其一用于串口终端调试。提示不要用Windows自带的“设备管理器→端口”判断串口号是否正确。某些CH340芯片在Win11下会显示为COMx但实际无法通信务必用stty -F /dev/ttyUSB0 115200Linux/macOS或mode COM3:9600Windows CMD先测试端口可写性。验证GCC是否就位arm-none-eabi-gcc --version # 正常输出应含 arm-none-eabi-gcc (GNU Arm Embedded Toolchain) 10.3.12.2 工程结构解析为什么这个目录组织能少踩80%的坑目录内容说明关键设计意图Core/startup_stm32f103c8.s带符号重定向的汇编启动文件、system_stm32f10x.c时钟初始化HSE8MHz→72MHz PLL、core_cm3.hCMSIS核心定义启动文件已将__main重定向至C语言main()避免Keil/IAR默认跳转到__rt_entry导致链接失败时钟配置严格按ST官方AN2594推荐路径禁用HSI校准误差Drivers/stm32f10x_gpio.h/.c、stm32f10x_usart.h/.c等无函数实现体仅寄存器宏定义内联函数如GPIO_SetBits(GPIOA, GPIO_Pin_0)展开为GPIOA-BSRR GPIO_Pin_0零函数调用开销编译后指令完全可见所有宏名与参考手册寄存器位定义严格一致如USART_CR1_UE对应CR1[13]杜绝HAL中ENABLE/DISABLE语义模糊问题Application/main.c含while(1)主循环、led.c/h板载LED控制示例、usart_printf.c/h基于fputc重定向的printfmain.c中SystemInit()调用位置固定在main()开头确保SystemCoreClock全局变量在任何外设初始化前已更新usart_printf默认使用USART1PA9/PA10避免新手误接USB转串口芯片引脚冲突Tools/Makefile支持make all/make flash/make debug、openocd.cfg适配ST-Link v2/v3、flash.jlinkJ-Link脚本Makefile中MCU变量默认设为STM32F103C8若换为CBT6需改LDSCRIPT STM32F103CB_FLASH.ld无需修改任何C源码2.3 一行命令完成编译烧录脱离IDE的真实效率进入解压后的根目录执行make clean make all make flash该命令链完成三件事make clean清除Build/目录下所有.o、.elf、.bin中间文件make all调用arm-none-eabi-gcc编译全部.c链接STM32F103C8_FLASH.ld生成Build/c8t6_template.elf和Build/c8t6_template.binmake flash调用openocd -f Tools/openocd.cfg -c program Build/c8t6_template.bin verify reset exit自动擦除、编程、校验、复位。参数说明verify参数强制OpenOCD读回Flash内容比对避免因供电不稳导致烧录静默失败reset exit确保烧录后MCU立即运行无需手动按复位键。若使用J-Link替换为make jflash即可内部调用JLinkExe -CommanderScript Tools/flash.jlink。验证是否成功接上USB转TTL模块TX→PA10RX→PA9GND共地打开串口终端设为115200-8-N-1上电或复位后应看到[INFO] SystemCoreClock 72000000 Hz [INFO] LED initialized on GPIOA Pin 0 [INFO] USART1 initialized at 115200 bps 末尾是命令提示符证明usart_printf和基础外设均已就绪。3. 外设驱动怎么用以ADC采样DMA传输为例的寄存器级实操模板里的Drivers/目录不提供“开箱即用”的ADC采集函数比如没有ADC_ReadChannel(ADC1, ADC_Channel_0)这种黑盒接口。它只提供可组合、可追溯、可调试的原子操作单元。这意味着你需要自己拼装ADC流程但每一步都直面寄存器没有魔法。3.1 ADC初始化四步法对照参考手册第11章逐行落实以采集PA0ADC1_IN0电压为例初始化代码写在Application/adc.c中#include stm32f10x_adc.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #define ADC_BUFFER_SIZE 32 uint16_t adc_buffer[ADC_BUFFER_SIZE]; void ADC1_DMA_Init(void) { // Step 1: 使能时钟RCC_APB2ENR RCC-APB2ENR | RCC_APB2ENR_ADC1EN | RCC_APB2ENR_IOPAEN; // Step 2: 配置PA0为模拟输入GPIOA_CRL GPIOA-CRL ~(0xF (0 * 4)); // 清除CNF0[1:0]和MODE0[1:0] GPIOA-CRL | (0x3 (0 * 4)); // CNF011 (analog input), MODE000 (input mode) // Step 3: 配置ADC1ADC_CR1/CR2/SMPCR/SQR1 ADC1-CR2 | ADC_CR2_ADON; // 开启ADC ADC1-SMPR2 | ADC_SMPR2_SMP0_1; // PA0采样时间239.5周期最大值 ADC1-SQR3 ADC_SQR3_SQ1_0; // 规则通道序列1 通道0 ADC1-CR2 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1; // 触发源 SWSTART软件触发 // Step 4: 配置DMA1通道1DMA_CPAR1/CMAR1/CNDTR1/CCR1 RCC-AHBENR | RCC_AHBENR_DMA1EN; DMA1_Channel1-CPAR (uint32_t)ADC1-DR; // 外设地址 ADC数据寄存器 DMA1_Channel1-CMAR (uint32_t)adc_buffer; // 存储地址 用户缓冲区 DMA1_Channel1-CNDTR ADC_BUFFER_SIZE; // 传输数量 DMA1_Channel1-CCR DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_EN; // 存储器增量循环模式使能 }逻辑说明Step 1中RCC_APB2ENR_ADC1EN必须置位否则ADC寄存器读写无效现象ADC1-DR始终为0Step 2的GPIOA_CRL配置是关键若误设为0x0浮空输入ADC采样值会随机漂移Step 3的ADC_CR2_EXTSEL位域决定触发方式这里设为110bSWSTART后续用ADC1-CR2 | ADC_CR2_SWSTART手动触发Step 4的DMA_CCR_CIRC启用循环模式避免DMA传输完一次后停止需手动重启。3.2 启动采集与数据获取两行代码搞定连续采样在main.c的while(1)循环中加入// 启动ADC转换软件触发 ADC1-CR2 | ADC_CR2_SWSTART; // 等待DMA传输完成查询DMA标志位 while (!(DMA1-ISR DMA_ISR_TCIF1)); DMA1-IFCR DMA_IFCR_CTCIF1; // 清除传输完成标志 // 此时adc_buffer[0..31]已填满32个采样值 uint32_t avg 0; for (int i 0; i ADC_BUFFER_SIZE; i) { avg adc_buffer[i]; } avg / ADC_BUFFER_SIZE; usart_printf(ADC AVG %d\r\n, avg);参数说明DMA_ISR_TCIF1是DMA1通道1的传输完成中断标志位查询方式比中断更轻量适合简单场景DMA_IFCR_CTCIF1必须手动清除否则下次传输完成时该标志仍为1导致死循环usart_printf底层调用fputc已通过__io_putchar重定向至USART1无需额外初始化。4. 常见问题排查那些让你怀疑人生却只需改一行代码的玄学翻车点这个模板追求极简但也因此放大了底层细节的敏感性。以下是我在多个项目中反复踩过的5个典型问题每个都附带现场现象、根本原因和一击必杀的修复方式。4.1 现象烧录后LED不亮串口无任何输出但OpenOCD显示Programming Done原因Core/startup_stm32f103c8.s中Stack_Size定义过小如EQU 0x200导致main()函数调用时栈溢出复位向量被覆盖。解决打开Core/startup_stm32f103c8.s将Stack_Size EQU 0x4001KB栈空间重新make all make flash。血泪经验C8T6只有20KB RAM但默认栈空间必须≥0x400才能容纳usart_printf的格式化缓冲区小于该值会导致main()未执行就硬fault。4.2 现象ADC采样值恒为0x0FFF满量程且不随输入电压变化原因ADC1-CR2中ADC_CR2_CONT位未置位ADC在单次转换后自动关闭DMA持续搬运的是最后一次转换结果0x0FFF。解决在ADC1_DMA_Init()末尾添加ADC1-CR2 | ADC_CR2_CONT;启用连续转换模式。4.3 现象串口发送乱码如ÿÿÿÿ但波特率设置确认为115200原因SystemCoreClock变量未被正确初始化USARTDIV计算错误。system_stm32f10x.c中SystemCoreClockUpdate()未被调用导致USARTDIV 72000000 / (16 * 115200) ≈ 39.0625取整后为39实际波特率偏差达1.5%。解决在main()开头SystemInit()之后必须显式调用SystemCoreClockUpdate()确保SystemCoreClock全局变量更新为72MHz。4.4 现象使用make debug启动OpenOCD后GDB连接超时Target not created原因Tools/openocd.cfg中source [find interface/stlink-v2.cfg]与实际调试器不匹配。若使用ST-Link v3需改为source [find interface/stlink-v3.cfg]。解决检查ST-Link固件版本ST-Link Utility中查看v3需对应v3配置且OpenOCD版本必须≥0.11.0。4.5 现象usart_printf打印中文字符显示为??英文正常原因终端编码为UTF-8但usart_printf发送的是ASCII字节流中文字符需GB2312编码。模板未内置中文支持。解决临时方案——在usart_printf调用前用Python脚本将中文字符串转为GB2312字节echo -n 你好 | iconv -f utf-8 -t gb2312 | xxd -p→c4e3bac3再以\x形式硬编码长期方案在Drivers/usart.c中增加usart_puts_gb2312(const char* str)函数。5. 进阶技巧如何把模板变成你的专属生产力引擎这个模板的价值不在于它“能做什么”而在于它“让你能快速决定不做什么”。我把它用在三个真实场景中一是某高校电子设计竞赛赛前72小时快速验证传感器信号链二是某工业温控模块的固件原型迭代从ADC采样到PID输出一周内交付5版三是作为新人入职培训的“寄存器解剖实验包”。它的扩展性不靠堆功能而靠结构可切片、行为可拦截、资源可审计。下面分享三个我每天都在用的实战技巧。5.1 把Makefile变成你的硬件配置中心用变量驱动整个工程模板的Makefile不是静态脚本而是硬件配置的声明式入口。比如你想把默认的USART1PA9/PA10切换到USART2PA2/PA3传统做法是全局搜索替换所有USART1为USART2极易遗漏。正确做法是在Makefile顶部定义USART_PORT USART2然后在Drivers/usart.c中#if USART_PORT USART1 #define USARTx USART1 #define RCC_USARTxEN RCC_APB2ENR_USART1EN #define GPIOx GPIOA #define GPIO_Pin_Tx GPIO_Pin_9 #define GPIO_Pin_Rx GPIO_Pin_10 #elif USART_PORT USART2 #define USARTx USART2 #define RCC_USARTxEN RCC_APB1ENR_USART2EN #define GPIOx GPIOA #define GPIO_Pin_Tx GPIO_Pin_2 #define GPIO_Pin_Rx GPIO_Pin_3 #endif再配合Makefile中的编译选项CFLAGS -DUSART_PORT$(USART_PORT)这样只需改Makefile里一行USART_PORT USART2整个工程自动适配新串口。同理可扩展至ADC_CHANNEL、PWM_TIMER、LED_GPIO等所有硬件资源。变量即文档改一处全链路生效且Git diff清晰可见变更点。5.2 用__attribute__((section(.my_section)))自定义内存段精准控制关键数据生命周期C8T6的20KB RAM珍贵如金。模板默认所有全局变量放在.data/.bss段但某些场景需要更强的控制力。例如ADC采样缓冲区必须位于SRAM起始地址0x20000000以满足DMA对地址对齐的要求而日志环形缓冲区可以放在末尾避免与栈碰撞。这时用链接脚本属性声明在Core/STM32F103C8_FLASH.ld中新增_my_adc_buffer_start .; .my_adc_buffer (NOLOAD) : { *(.my_adc_buffer) } RAM _my_adc_buffer_end .;在Application/adc.c中声明uint16_t adc_buffer[32] __attribute__((section(.my_adc_buffer), aligned(4)));编译后arm-none-eabi-nm Build/c8t6_template.elf | grep adc_buffer会显示其地址确为0x20000000。这比malloc可靠一万倍——地址确定、无碎片、无运行时开销。5.3 构建时自动注入版本号与Git提交ID让每份固件自带身份证量产固件必须可追溯。模板的Makefile支持在编译时注入当前Git状态GIT_VERSION : $(shell git describe --always --dirty 2/dev/null) GIT_COMMIT : $(shell git rev-parse --short HEAD 2/dev/null) CFLAGS -DGIT_VERSION\$(GIT_VERSION)\ -DGIT_COMMIT\$(GIT_COMMIT)\在main.c中usart_printf(Firmware: v%s (%s)\r\n, GIT_VERSION, GIT_COMMIT);每次make all终端都会打出类似Firmware: v1.2.0-5-ga3b1c2d (a3b1c2d)其中-dirty表示有未提交修改。这不仅是运维习惯更是调试时的后悔药——当客户说“上周五的固件还正常”你立刻知道该检出哪个commit复现。我坚持用这个模板超过三年不是因为它完美而是因为它足够透明没有一层层封装遮蔽真相没有自动生成的魔法代码让你不知所措。它逼你直面寄存器也给你最短路径抵达目标。当你能看着startup.s里的ldr sp, _estack理解栈指针如何加载看着ADC1-DR的地址映射查到物理总线你就真正拿到了嵌入式开发的钥匙。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

HRTF空间音频与DFT卷积:Matlab双耳渲染实战指南

HRTF空间音频与DFT卷积:Matlab双耳渲染实战指南

简介:这份资源是面向音频信号处理学习者与MATLAB/FFT实践者的HRTF空间音频合成项目源码,核心目标是通过头相关传递函数(HRTF)实现3D空间化音频,并借助DFT/FFT完成频域卷积运算。项目以教育探索为主,适合具备…

2026/10/13 19:00:05 阅读更多 →
Matlab GRU时序预测实战:从代码到工程落地

Matlab GRU时序预测实战:从代码到工程落地

简介:这份资源是面向Matlab用户与深度学习初学者的GRU循环神经网络实现代码包,旨在帮助读者理解门控循环单元的核心机制并动手搭建可训练模型。GRU由Cho等人于2014年提出,通过更新门与重置门控制信息流动,结构比LSTM更简洁、运算效…

2026/10/13 19:00:05 阅读更多 →
三次样条插值原理与Matlab实践:从数学推导到工程避坑指南

三次样条插值原理与Matlab实践:从数学推导到工程避坑指南

1. 为什么我要在数值分析里死磕三次样条插值做数据处理和工程仿真的人,迟早会撞上同一个问题:手头只有一堆离散的采样点,但你需要一条光滑、连续、能求导的曲线去描述整个趋势。线性插值倒是简单,两点一连就完事,可出来…

2026/10/13 19:00:05 阅读更多 →

最新新闻

SolidWorks模板制作全指南:从零件到工程图的属性联动

SolidWorks模板制作全指南:从零件到工程图的属性联动

简介:使用SolidWorks的设计与工程人员若希望统一零件、装配体和工程图的格式,并符合GB标准,这份PDF提供了从模板原理到属性链接的完整知识点。文档先梳理了零件模板( .prtdot)、装配模板( .asmdot)、工程图模板(*.drwdot)的扩展名区别、默认…

2026/10/14 12:39:46 阅读更多 →
项目管理中的范围管理:从WBS到变更控制的完整实践指南

项目管理中的范围管理:从WBS到变更控制的完整实践指南

1. 从两个经典翻车场景,看懂范围管理到底管什么先讲两个我亲眼见过的项目翻车现场,都是典型的范围管理失控。第一个场景。某公司要上一个内部管理系统,业务部门提需求时说得很简单:“我们就要一个能看数据的后台就行。”开发团队听…

2026/10/14 12:39:46 阅读更多 →
PHFTP部署指南:用PHP打造浏览器端的FTP客户端全攻略

PHFTP部署指南:用PHP打造浏览器端的FTP客户端全攻略

简介:PHFTP(PHP HTTP FTP)是一款基于PHP的开源Web FTP客户端,面向需要在浏览器端直接管理远程FTP服务器的开发者、运维人员及建站用户。它摆脱了桌面FTP工具的安装依赖,即便在防火墙或代理限制下,也能通过网…

2026/10/14 12:39:46 阅读更多 →
Kepserver主备冗余、MySQL双向读写与后台服务配置全指南

Kepserver主备冗余、MySQL双向读写与后台服务配置全指南

简介:在工业现场数据对接项目中,KEPServer与MySQL、西门子PLC之间的数据联通是常见又容易出错的环境,这份doc文档正好围绕这些场景提供了系统化的配置参考。文档重点覆盖了主备切换、MySQL与西门子PLC双向读写、后台服务设置以及地址值填写四…

2026/10/14 12:39:46 阅读更多 →
python的机器人基础原理工业场景模拟:搬运工作站,给定关节角度,角速度,角加速度,调用工具箱直接求解全套关节力矩。

python的机器人基础原理工业场景模拟:搬运工作站,给定关节角度,角速度,角加速度,调用工具箱直接求解全套关节力矩。

《Python机器人基础原理》第十八篇:搬运工作站——给定关节状态,基于动力学术解全套关节力矩1. 实际工业应用场景周五下午,某汽车零部件厂的发动机缸体搬运工作站。一台3-DOF搬运机械臂(基座偏航肘部俯仰垂直升降)负责…

2026/10/14 12:39:46 阅读更多 →
AI学术速递系统搭建:从信息过载到精准筛选的工程实践

AI学术速递系统搭建:从信息过载到精准筛选的工程实践

1. 从“学术速递”这个动作说起:为什么信息筛选比信息获取更难每天早上刷一遍学术平台的新论文列表,这件事我坚持了快三年。最开始是手动刷,后来用订阅工具,再后来自己写脚本抓取。折腾一圈下来发现,真正的痛点从来不是…

2026/10/14 12:38:45 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →