嵌入式通信实战:I2C与CAN总线寄存器配置深度解析
1. 项目概述从寄存器手册到嵌入式通信实战在嵌入式开发的日常里最让人又爱又恨的恐怕就是那一本本动辄上千页的芯片参考手册了。手册里密密麻麻的寄存器描述每个比特位都承载着特定的功能但如何将这些冰冷的位域转化为稳定可靠的通信代码往往是新手与老手之间的分水岭。今天我们就以德州仪器TI的Stellaris LM3S2965这款经典的ARM Cortex-M3微控制器为例深入它的I2C和CAN总线外设把寄存器配置这回事儿彻底聊透。我手边正好有它的技术手册里面关于I2C和CAN的章节正是我们这次“庖丁解牛”的绝佳素材。I2C和CAN可以说是嵌入式领域两种性格迥异的“社交达人”。I2C像是一位讲究礼仪、主次分明的室内管家通过两根线时钟SCL和数据SDA就能串联起一屋子总线上的传感器、EEPROM等外设结构简单但时序和应答的规矩一点不能错。而CAN则像是一位在嘈杂工厂或飞驰汽车里工作的协调员天生为抗干扰和多主竞争而生用差分信号对抗电磁噪声用复杂的仲裁机制确保关键消息优先通行。理解它们的寄存器配置本质上就是理解它们各自的“行为准则”和“沟通方式”。很多人看手册容易陷入两个极端要么被细节淹没觉得每个寄存器都重要无从下手要么只抄写代码对底层原理一知半解出了问题只能盲目调试。我的经验是抓住核心寄存器群理解其设计哲学比死记硬背所有位域更有用。接下来我们就结合手册片段从I2C的主机中断清除、模式配置到CAN的消息对象初始化与传输一步步拆解并补充那些手册里不会写、但实际调试中至关重要的“坑”和技巧。2. I2C接口核心寄存器解析与驱动设计思路I2C协议的精髓在于其简洁的硬件设计和严格的软件时序控制。在LM3S2965中I2C模块被清晰地划分为主机Master和从机Slave两套独立的寄存器组这种分离式设计让程序逻辑可以更清晰。我们拿到手册首先关注的不是某个孤立的寄存器而是它们如何协作完成一次完整的通信。2.1 主机控制如何优雅地发起与结束对话主机是I2C总线上的导演负责发起传输、产生时钟和终止会话。手册中给出的I2C Master Interrupt Clear (I2CMICR)和I2C Master Configuration (I2CMCR)是两个非常典型的基础控制寄存器。I2CMICR偏移地址0x01C中断清除的艺术这个寄存器只有一个有效的可写位IC位0。它的功能很单纯——向该位写1即可清除主机原始中断状态。但这里隐藏着一个关键细节它是“只写”WO寄存器。这意味着你读它返回的数据是没有意义的手册明确写着“returns no meaningful data”。很多新手会习惯性地先读取再修改在这里就会碰壁。正确的操作是直接写入0x00000001来清除中断。更深一层理解是这种设计通常与中断状态寄存器I2CMRIS配合使用。当程序在中断服务例程ISR中检测到某个主机中断如传输完成被置位后必须在退出前向I2CMICR写入1来清除该中断标志否则会导致中断持续触发系统卡死。I2CMCR偏移地址0x020模式与自检的开关这个寄存器控制着I2C模块的全局工作模式。几个关键位需要仔细配置MFE位4和SFE位5分别使能主机功能和从机功能。这里有一个重要的硬件细节即使你只使用主机模式也强烈建议在初始化时同时使能主机和从机模式即设置MFE1SFE1。这是因为在某些微控制器架构中I2C模块的时钟逻辑可能与从机部分关联仅使能主机可能导致时钟信号不正常。当然如果确认只作主机可以只开MFE以节省些许功耗。LPBK位0环回模式使能。这是极其宝贵的调试功能。当LPBK1时模块内部将TX和RX路径短接无需连接外部物理设备即可测试软件驱动和基本的数据收发流程是否正确。在驱动开发初期务必先使用环回模式验证你的配置和读写序列这能帮你快速排除软件错误将问题域缩小。实操心得寄存器的“保留位”处理手册中反复强调“Software should not rely on the value of a reserved bit. To provide compatibility with future products, the value of a reserved bit should be preserved across a read-modify-write operation.” 这句话是金科玉律。很多工程师图省事直接对寄存器进行赋值如I2C0_MCR 0x10;这可能会意外地改变保留位的值在未来芯片型号或工艺升级时带来不可预知的风险。正确的做法是使用“读-修改-写”操作并且只操作目标位。例如在使能主机模式并开启环回测试时应该这样写// 假设 I2C0_MCR 是寄存器内存映射地址 uint32_t temp HWREG(I2C0_BASE I2C_O_MCR); // 先读取当前值 temp ~(I2C_MCR_LPBK | I2C_MCR_MFE | I2C_MCR_SFE); // 清除目标位 temp | (I2C_MCR_LPBK | I2C_MCR_MFE | I2C_MCR_SFE); // 设置目标位 HWREG(I2C0_BASE I2C_O_MCR) temp; // 写回使用芯片厂商提供的驱动库如TI的TivaWare中的位定义宏和函数可以更安全、更清晰地完成这些操作。2.2 从机身份如何做好一个倾听者与响应者当你的设备需要被其他主机访问时例如作为一个传感器节点就需要配置I2C从机模式。从机寄存器的设计逻辑与主机不同它更关注于“被寻址”和“数据交换”的状态管理。I2CSOAR偏移地址0x800你的“门牌号”这个寄存器设置从机自身的7位地址位6:0。总线上所有设备的地址必须唯一。这里常犯的错误是忽略了I2C地址的读写方向位。实际上主机发送的地址字节中最低位LSB是读写位0写1读。所以你在I2CSOAR中配置的地址例如0x50对应的是地址字节的高7位。当主机发送0xA00x50 1 | 0时表示要向地址0x50写入数据发送0xA1时表示要从地址0x50读取数据。I2CSCSR偏移地址0x804状态与控制的双重人格这个寄存器非常特殊读和写操作访问的是不同的位域手册用两个表格分别说明。这是理解从机实时响应的核心。读操作获取状态。关键位有RREQ位0接收请求。置1表示主机已发送数据到本从机你需要从I2CSDR数据寄存器中读取该数据读取后硬件自动清除此位。TREQ位1发送请求。置1表示主机正请求从本机读取数据你需要向I2CSDR数据寄存器写入待发送的数据写入后硬件自动清除此位。FBR位2首字节接收。仅在RREQ置位且接收的是地址帧之后的第一个数据字节时置位。可用于区分地址帧和数据帧在协议层面地址帧后第一个数据字节有时有特殊含义。写操作进行控制。主要是DA位位0设备使能。必须将此位置1从机功能才会响应总线上的地址匹配。一个常见的疏忽是配置了地址但忘了使能DA导致从机“装聋作哑”。I2CSDR偏移地址0x808数据交换的邮箱这是从机数据寄存器读它获取主机发来的数据写它准备发给主机的数据。手册特别标注了“This register is read-sensitive.”这意味着对该寄存器的读取操作可能具有副作用例如自动清除某些状态标志。在LM3S2965中读取I2CSDR会清除RREQ状态位。因此你的代码必须确保在RREQ有效时才去读取并且读取操作本身是状态处理流程的一部分。2.3 中断管理让CPU从轮询中解放无论是主机还是从机高效通信都离不开中断。I2C模块提供了完整的中断掩码、状态和清除机制。I2CSRIS/I2CMRIS原始中断状态反映中断是否真实发生无论是否被屏蔽。I2CSIMR/I2CMIMR中断掩码决定哪些中断源能触发控制器级中断到CPU。例如从机的DATAIM位控制数据收发中断是否上报。I2CSMIS/I2CMMIS屏蔽后中断状态这是你在ISR中最应该查询的寄存器。它告诉你当前真正触发CPU中断的是哪个事件。I2CSICR/I2CMICR中断清除在ISR末尾根据I2CSMIS/I2CMMIS的状态向相应的清除寄存器写入1来清除中断标志。一个稳健的中断服务例程模板如下void I2C0_Slave_IRQHandler(void) { uint32_t misStatus HWREG(I2C0_BASE I2C_O_SMIS); // 读取屏蔽后状态 if (misStatus I2C_SMIS_DATAIM) { // 处理数据中断 // 1. 读取I2CSCSR状态判断是RREQ还是TREQ // 2. 根据状态进行I2CSDR的读写操作 // 3. 清除数据中断标志 HWREG(I2C0_BASE I2C_O_SICR) I2C_SICR_DATAIC; } // 可以检查其他中断源... }3. CAN总线核心机制与消息对象深度剖析如果说I2C是“主从问答”那么CAN就是“广播协商”。它的复杂度远高于I2C核心在于其基于消息对象Message Object的邮箱机制。LM3S2965的CAN控制器提供了32个独立的消息对象每个都可以单独配置为发送或接收并拥有自己的标识符和掩码。3.1 初始化流程让CAN控制器“上车”前的准备手册第15.3.1节详细描述了初始化序列这是CAN正常工作的基石一步都不能错。进入初始化模式设置CANCTL寄存器的INIT位为1。此操作会立即使CAN控制器脱离总线CANTX引脚输出隐性位逻辑高。此时总线活动停止但配置保留。配置位时序这是CAN通信的“心跳”设置。需要同时设置CANCTL寄存器的CCE配置改变使能位和INIT位为1才能解锁CANBIT和CANBRPE寄存器。位时序决定了通信波特率计算公式涉及系统时钟、波特率预分频器CANBIT中的BRP段、同步段、传播时间段和相位缓冲段。一个计算125kbps波特率的示例假设系统时钟为16MHz目标波特率 125,000 bps时间份额Time Quantum, Tq (BRP 1) / SysClk设BRP 3则Tq (31)/16MHz 0.25us。标准CAN位时间通常设为10-25个Tq。设位时间 16 Tq。实际波特率 1 / (位时间 * Tq) 1 / (16 * 0.25us) 250,000 bps不对这里计算有误。正确应为位时间 (BRP1) / SysClk * (Sync_Seg Prop_Seg Phase_Seg1 Phase_Seg2)。通常使用工具或参考示例配置例如对于16MHz时钟125kbps一个常见的配置是CANBIT 0x00002301BRP0, Tseg15, Tseg22, SJW1。配置消息对象将所有32个消息对象初始化为已知状态。对于不使用的消息对象务必通过其对应的CANIFnARB2寄存器清除MSGVAL位将其标记为无效。否则未初始化的消息对象可能包含随机的标识符导致意外接收或发送引发总线错误。退出初始化模式清除CANCTL寄存器的INIT位。控制器会等待总线出现11个连续的隐性位空闲状态然后自动同步并加入总线通信。3.2 消息对象CAN通信的独立邮箱每个消息对象都是一个自包含的邮箱包含以下关键部分通过接口寄存器CANIF1或CANIF2配置仲裁区CANIFnARB1,CANIFnARB2定义本消息的ID11位标准或29位扩展、方向发送/接收以及有效性MSGVAL。掩码区CANIFnMSK1,CANIFnMSK2用于接收过滤。掩码位为0表示对应ID位为“不关心”可以实现群组地址接收。MXTD和MDIR位决定是否对扩展标识符位和方向位进行过滤。控制区CANIFnMCTL包含数据长度码DLC0-8字节、终端标志EOB指示是否为消息对象组中的最后一个、远程传输使能RMTEN、发送中断使能TXIE等。数据区CANIFnDA1/2,CANIFnDB1/2最多8字节的数据载荷。配置一个发送消息对象的典型步骤手册15.3.4节在CANIFnCMSK寄存器中设置传输掩码告诉接口我们要写什么到消息对象仲裁、控制、数据等。在CANIFnMSK1/2中设置接收过滤掩码如果是接收对象或发送对象需响应远程帧。在CANIFnARB1/2中设置消息ID、方向DIR1表示发送、标识符类型XTD并置位MSGVAL。在CANIFnMCTL中设置数据长度DLC并置位EOB单个对象。将待发送数据写入CANIFnDA1/2和CANIFnDB1/2。将要配置的消息对象编号写入CANIFnCRQ寄存器的MNUM字段。这个写操作是触发配置数据从接口寄存器写入到消息对象RAM的关键动作。最后置位CANIFnMCTL中的TXRQST位将该消息对象加入发送调度队列。3.3 双接口寄存器IF1 IF2的妙用LM3S2965提供了两套完全相同的接口寄存器CANIF1x和CANIF2x。这不是简单的冗余而是为了实现并行流水线操作提升效率。典型用法是CANIF1专用于处理接收当一个消息对象接收到数据后CPU可以使用IF1来读取该对象的数据和状态同时IF1还可以用于配置新的接收过滤规则。CANIF2专用于处理发送CPU使用IF2来更新发送消息对象的数据并请求发送。 这样接收和发送的配置/访问操作可以几乎同时进行而不会相互阻塞这对于高吞吐量或实时性要求高的应用至关重要。3.4 自动响应远程帧实现数据请求-响应机制CAN的远程帧Remote Frame是一个非常有用的特性它本身不携带数据只包含一个标识符用于请求具有该标识符的数据帧。在LM3S2965上可以通过配置实现自动响应。将一个消息对象配置为发送对象DIR1并填入预设的数据。在该对象的CANIFnMCTL寄存器中置位RMTEN远程传输使能位。当总线上有其他节点发送一个标识符与此消息对象匹配的远程帧时CAN控制器会自动将该消息对象的TXRQST位置1从而立即根据总线仲裁将数据帧发送出去作为响应。 这个功能常用于主从式数据查询主节点发送一个远程帧从节点自动回复数据无需CPU实时干预大大降低了软件开销和响应延迟。4. 嵌入式通信实践从寄存器到稳定驱动理解了寄存器最终要落地为代码。以下是一些结合了手册内容和实战经验的开发要点。4.1 I2C驱动设计要点与调试技巧主机驱动流程初始化使能模块时钟配置GPIO引脚为I2C复用功能设置I2CMCR模式配置I2CMTPR时钟分频决定SCL频率使能中断果需要。发送流程写入从机地址带写方向到I2CMSA写入数据到I2CMDR设置I2CMCS寄存器启动发送。通过查询I2CMCS中的BUSY、ERROR位或等待中断来判断状态。接收流程写入从机地址带读方向到I2CMSA设置I2CMCS启动接收有时需要先发送一个“假”的读命令。数据会在接收完成后出现在I2CMDR中。常见问题排查总线死锁SCL被拉低这是I2C调试中最常见的问题。通常是由于从机未及时响应如程序卡死或时序不符合从机要求。解决方法尝试软件复位I2C模块如果支持或者通过GPIO模拟I2C时序发送9个时钟脉冲来“解救”总线。无应答NACK检查从机地址是否正确注意7位地址需要左移一位从机设备是否上电、初始化以及总线线路连接是否可靠上拉电阻必不可少通常4.7kΩ。使用逻辑分析仪这是调试I2C的终极利器。抓取SCL和SDA波形可以清晰地看到起始条件、地址、数据、应答位的每一个细节快速定位是软件配置错误还是硬件问题。4.2 CAN驱动设计要点与错误处理驱动层封装 一个健壮的CAN驱动应至少提供以下接口CAN_Init()CAN_ConfigMsgObject()CAN_SendMsg()CAN_ReceiveMsg()CAN_IRQHandler()。内部需要维护一个消息对象池管理哪些对象已被占用是用于发送还是接收。错误处理与状态监控 CAN控制器有强大的错误状态寄存器CANSTS。必须监控EPASS位错误被动状态。当发送或接收错误计数器超过127时进入此时节点不能发送主动错误帧。BOFF位总线关闭状态。当发送错误计数器超过255时进入节点与总线完全隔离必须重新初始化。EWARN位错误警告。当任一错误计数器超过96时置位可作为早期预警。 在中断服务程序中除了处理接收和发送完成中断必须处理错误中断并读取CANERR寄存器分析具体错误类型位错误、填充错误、CRC错误等并采取相应措施如复位错误计数器、重启通信等。波特率容错与同步 CAN总线对节点间的时钟精度有要求。虽然CAN协议有重同步机制但节点晶振误差最好控制在0.5%以内根据波特率和总线长度要求可能更严。在CANBIT寄存器中配置合适的同步跳转宽度SJW可以提高时钟容错能力。终端电阻匹配 CAN总线两端最远两个节点处必须各接一个120欧姆的终端电阻用于阻抗匹配消除信号反射。这是很多通信不稳定问题的根源。使用示波器测量CANH和CANL之间的差分信号健康的波形应该是干净的眼图而非带有振铃或过冲的畸变波形。从读懂一个比特位的定义到完成一个在复杂电磁环境下稳定运行的双节点CAN网络这条路需要严谨地遵循手册更需要大量的实践和调试。寄存器配置是底层控制的基石而理解其背后的通信协议哲学才能让我们在遇到问题时不仅知道“怎么改”更明白“为什么这样改”。希望这篇基于LM3S2965手册的深度解析能为你下一次的嵌入式通信开发带来一些不一样的思路。

相关新闻

嵌入式网络DMA与描述符机制:从CPU搬运到硬件加速的数据传输

嵌入式网络DMA与描述符机制:从CPU搬运到硬件加速的数据传输

1. 项目概述:从CPU搬运工到数据高速公路的蜕变 如果你在嵌入式网络开发中,还在为如何高效处理海量以太网数据包而头疼,感觉CPU总是在忙于搬运数据而无法专注于核心业务逻辑,那么深入理解以太网控制器的DMA(直接内存访问…

2026/10/17 21:42:04 阅读更多 →
多分支流水线治理:feature、release 与 hotfix 的差异化策略

多分支流水线治理:feature、release 与 hotfix 的差异化策略

多分支流水线治理:feature、release 与 hotfix 的差异化策略 一、同一个 Jenkinsfile 跑了三种完全不同的业务场景,不出事才怪 多分支 CI/CD 最典型的反模式:所有分支共用同一个流水线定义。feature 分支需要跑单元测试 lint,rel…

2026/10/18 0:08:40 阅读更多 →
深入解析进程调度与并行执行的核心原理

深入解析进程调度与并行执行的核心原理

1. 进程调度与并行执行的本质关系 当我们在电脑上同时运行多个程序时,操作系统如何让它们"同时"工作?这背后隐藏着进程调度和并行执行的精妙机制。现代操作系统通过时间片轮转、优先级调度等算法,在单个CPU核心上创造出多个程序并行…

2026/10/16 18:05:35 阅读更多 →

最新新闻

USPS手写数字数据集处理全流程:从原始数据到SVM/CNN验证

USPS手写数字数据集处理全流程:从原始数据到SVM/CNN验证

如果你处理过手写数字识别,USPS数据集应该不会陌生。它来自美国邮政系统对信封上手写数字的扫描图,尺寸小、分辨率低,但噪声和形变非常真实,是图像分类入门绕不开的经典数据。我最早一次拿它练手,是在某实验室做数字识…

2026/10/19 6:35:54 阅读更多 →
Rancher实战:从零搭建K8s集群的完整指南

Rancher实战:从零搭建K8s集群的完整指南

说实话,我第一次正经用 Rancher 搭 k8s 集群的时候,心里是有点抵触的。当时团队里已经有人用 kubeadm 裸跑过一套测试环境,各种证书、apiserver 地址、etcd 备份把人折腾得够呛。后来换成 Rancher,我才意识到问题不是"会不会…

2026/10/19 6:35:54 阅读更多 →
free-claude-code:开源拼装AI编程助手,低成本替代Claude Code

free-claude-code:开源拼装AI编程助手,低成本替代Claude Code

1. 这个项目到底在解决什么问题第一次看到"free-claude-code"这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个围绕AI编程助手做文章的开源项目。果不其然,翻了一圈社区讨论和代码仓库之后,基本可以确认——这是…

2026/10/19 6:35:54 阅读更多 →
MATLAB小波变换实战:雷达回波时频特征提取与去噪全解析

MATLAB小波变换实战:雷达回波时频特征提取与去噪全解析

这些年做雷达信号处理,我陆陆续续接触过不少时频分析的方法。从最初的傅里叶变换,到短时傅里叶变换,再到Wigner-Ville分布,最后到小波变换。说实话,小波变换是我在工程实践里用得最顺手,也最依赖的一种工具…

2026/10/19 6:35:54 阅读更多 →
从LLM-RL到Agentic RL:大模型强化学习范式的升级路线

从LLM-RL到Agentic RL:大模型强化学习范式的升级路线

严格来说,“LLM-RL”这个词最近已经快被说烂了,只要做过提示工程、跟过大模型微调的人,多少都听过 RLHF、PPO、DPO 这一串术语。可这波热度还没散,“Agentic RL”又开始刷屏,很多人的第一反应是:又一个新名…

2026/10/19 6:35:54 阅读更多 →
AirLLM分层推理实战:小显存跑大模型的显存优化与部署指南

AirLLM分层推理实战:小显存跑大模型的显存优化与部署指南

1. 项目缘起与核心定位第一次看到 airllm 这个项目名,我的直觉是:这又是一个想在“大模型推理”这块硬骨头上做文章的轮子。但翻完它的设计思路之后,我意识到它切中的是一个特别真实、特别痛的场景——显存不够,但又想跑大模型。说…

2026/10/19 6:34:53 阅读更多 →

日新闻

频率跟踪型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 阅读更多 →