ARM03-蜂鸣器和中断
一、实现蜂鸣器功能① 蜂鸣器功能实现步骤1查看原理图设计2查阅IMX6ULL参考手册按以下顺序配置开启外设时钟设置引脚复用功能配置引脚电气属性设置GPIO方向寄存器配置GPIO数据寄存器② 在LED/bsp文件夹基础上添加beep.c、beep.h//beep.h #ifndef __BEEP_H__ #define __BEEP_H__ extern void beep_init(void); extern void beep_on(void); extern void beep_off(void); extern void beep_nor(void); #endif//beep.c #include beep.h #include MCIMX6Y2.h #include fsl_iomuxc.h void beep_init(void) { // 1. 复用功能 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0); // 2. 电气属性 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0); // 3. GPIO方向输出模式 GPIO5-GDIR | (1 1); } void beep_on(void) { GPIO5-DR ~(1 1); } void beep_off(void) { GPIO5-DR | (1 1); } void beep_nor(void) { GPIO5-DR ^ (1 1); }③ main.c//main.c #include MCIMX6Y2.h #include fsl_iomuxc.h #include led.h #include beep.h void enable_clocks(void) { CCM-CCGR0 0xFFFFFFFF; CCM-CCGR1 0xFFFFFFFF; CCM-CCGR2 0xFFFFFFFF; CCM-CCGR3 0xFFFFFFFF; CCM-CCGR4 0xFFFFFFFF; CCM-CCGR5 0xFFFFFFFF; CCM-CCGR6 0xFFFFFFFF; } //延迟函数 void delay(unsigned int n) { while(n--); } int main(void) { //使能外设时钟 enable_clocks(); //led初始化 led_init(); //beep初始化 beep_init(); while(1) { led_nor(); beep_nor(); delay(0x5FFFF); } return 0; }二、按键2.1 IMX6ULL按键介绍① 按键数量与功能共 3 个按键两红一黄功能分工明确左侧(on/off)低功耗控制按钮中间(reset)系统复位按钮右侧(KEY0)用户独立控制的试验按键本次实验主要使用KEY0电平逻辑开关断开时引脚保持高电平开关按下时引脚变为低电平关键逻辑代码设计核心依据② 核心寄存器参考手册硬件模块参考文档核心章节说明引脚复用《IMX6ULL 参考手册.pdf》Chapter 32IOMUX Controller配置 GPIO 功能复用GPIO 控制《IMX6ULL 参考手册.pdf》Chapter 28General Purpose Input/OutputGPIO 方向、数据读取时钟控制《IMX6ULL 参考手册.pdf》Chapter 18Clock Controller Module使能 GPIO 时钟中断控制器《ARM Generic Interrupt Controller V2.0.pdf》第 23 页GIC 中断分发与 CPU 接口内核控制《Cortex-A7 Technical Reference Manual.pdf》Chapter 4System Control协处理器 CP15 配置2.2 轮询方式实现按键功能① 轮询方式原理循环检测GPIO引脚电平状态来判断按键动作适用于逻辑简单且对实时性要求不高的场景。但当主程序存在大量耗时任务时可能导致按键响应延迟因此在汽车制动、工业急停等高实时性场景中禁止使用。② 代码实现步骤步骤 1初始化配置4 大核心模块1GPIO 时钟使能CCM功能使能 GPIO1 组时钟默认时钟关闭不使能则 GPIO 无响应关键寄存器CCM_CCGR1GPIO1 组共用该时钟门控2引脚复用配置IOMUXC功能将UART1_CTS_B引脚复用为GPIO1_IO18关键寄存器IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B低 4 位控制复用模式3电气特性配置PAD_CTL功能配置引脚的上拉 / 下拉、速度、驱动能力等确保电平稳定关键寄存器IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B4GPIO 方向配置GDIR功能设置 GPIO 为输入模式读取按键电平关键寄存器GPIO1-GDIRbit18 对应 GPIO1_IO180 输入1 输出步骤 2按键检测轮询核心1功能循环读取 GPIO 数据寄存器判断按键按下 / 松开状态关键寄存器GPIO1-PSRbit18 对应引脚电平1 高电平断开0 低电平按下③ 代码实现//key.c #include MCIMX6Y2.h #include fsl_iomuxc.h #include key.h void key_init(void) { //1.引脚复用 IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0); //2.电气属性 IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF0B0); //3.GPIO方向输入模式 GPIO1-GDIR ~(1 18); } int key_press(void) { if((GPIO1-PSR (1 18)) 0) { return 1; } else { return 0; } }//main.c #include MCIMX6Y2.h #include fsl_iomuxc.h #include led.h #include beep.h #include key.h void enable_clocks(void) { CCM-CCGR0 0xFFFFFFFF; CCM-CCGR1 0xFFFFFFFF; CCM-CCGR2 0xFFFFFFFF; CCM-CCGR3 0xFFFFFFFF; CCM-CCGR4 0xFFFFFFFF; CCM-CCGR5 0xFFFFFFFF; CCM-CCGR6 0xFFFFFFFF; } //延迟函数 void delay(unsigned int n) { while(n--); } int main(void) { //使能外设时钟 enable_clocks(); //led初始化 led_init(); //蜂鸣器beep初始化 beep_init(); //按键初始化 key_init(); led_off(); beep_off(); while(1) { if(key_press()) { led_on(); beep_on(); } else { led_off(); beep_off(); } } return 0; }2.3 中断方式实现按键功能① 中断方式原理当按键按下时GPIO 触发外部中断EINTCPU 暂停当前任务优先执行中断服务程序ISR待处理完成后恢复原任务从而避免轮询方式导致的漏检并提升实时性。② 中断处理流程6 步核心中断源发出中断请求按键按下 -- GPIO 引脚电平变化 -- 触发外部中断请求CPU检查是否响应中断及该中断是否被屏蔽CPU 判断中断是否被屏蔽GIC 中是否允许该中断比较中断优先级GIC 分发器Distributor选择最高优先级中断保护现场保存当前 CPU 寄存器值如 R0~R15避免数据丢失执行中断服务函数处理按键逻辑恢复现场恢复保存的寄存器值回到原业务继续执行③ IMX6ULL ——GPIO外设中断触发模式上升沿下降沿高电平和低电平触发④ 中断实现方法⑤ GIC 中断控制器GICGeneric Interrupt Controller通用中断控制器是为ARM内核提供服务的中断控制器负责中断的分发与管理IMX6ULL 中 GIC版本为GICV2型号(GIC-400)GIC最多能管理 1020 个中断号ID0~ID1019IMX6ULL支持1600 - 159个中断分类如下1SGI(Software-generated Interrupt)软件中断由软件触发引起的中断通过向寄存器GICD_SGIR 写入数据来触发系统会使用 SGI 中断来完成多核之间的通信。2PPI(Private Peripheral Interrupt)私有中断我们说了 GIC 是支持多核的每个核肯定有自己独有的中断。这些独有的中断肯定是要指定的核心处理因此这些中断就叫做私有中断3SPI(Shared Peripheral Interrupt),共享中断(注意不是 SPI 总线那个中断)这类中断泛指所有的外设中断。中断类型范围特点典型用途SGI软件中断0~15软件触发多核间通信多核CPU同步如核0通知核1PPI私有中断16~31每个CPU独有绑定核心核内定时器、看门狗等SPI共享中断32~1019多CPU共享外设中断GPIO、UART、SPI等外设中断GIC版本介绍GICv1初代基础版本是ARM最早标准化的通用中断控制器仅实现最基础的中断优先级管理、中断路由功能没有多核支持、安全扩展这类高级特性。CortexA5已弃用GICv232位多核标准版本最多支持8个CPU核心可管理1020个中断ID。该架构明确定义了SGI、PPI、SPI三类中断类型0~15为SGI软中断软件生成中断16~31为PPI私有外设中断核间通信内核与内核之间中断32~1019为SPI共享外设中断其中SPI可作为外部设备的中断源。Cortex-A7、Cortex-A9GICv364位架构普及版本重新设计了硬件架构新增Redistributor中断再分配器组件用层级亲和性标识CPU核心理论支持最多2^32个处理器单元新增LPI消息中断和ITS中断翻译服务最大支持超1600万个中断ID完全适配PCIe等高速外设的大量中断需求。GICv4虚拟化优化版本完全兼容GICv3的所有功能新增虚拟LPI中断直接注入能力不需要虚拟机管理器中转就能把虚拟中断直接送到对应vCPU大幅降低虚拟化场景下的中断开销提升云服务器的多核调度效率。GICv5下一代全新架构版本对整个中断处理链路做了全栈重新设计原生支持大规模异构核心集群、硬件级中断负载均衡、实时中断确定性调度专门适配大算力场景下数万级中断源的管理需求是未来超算、AI服务器的标准中断控制器方案。⑥ 协处理器1协处理器是一种协助主处理器完成特定功能的专用处理单元。在 ARM 架构中协处理器通过一组专用的指令MCR/MRC和寄存器与主 CPU 交互用于完成主 CPU 不擅长或效率不高的任务。对比项MRCMove to ARM Register from CoprocessorMCRMove from ARM Register to Coprocessor核心功能从协处理器寄存器读取数据到 ARM 核心通用寄存器从 ARM 核心通用寄存器写入数据到协处理器寄存器数据流向协处理器寄存器 → ARM 核心寄存器读操作ARM 核心寄存器 → 协处理器寄存器写操作指令格式MRC{cond} coproc, opcode1, Rd, Crn, Crm{, opcode2}MCR{cond} coproc, opcode1, Rd, Crn, Crm{, opcode2}关键字段含义coproc协处理器编号如 CP15 对应 15Rd目标 ARM 寄存器数据读入此寄存器Crn/Crm协处理器主/次寄存器opcode1/opcode2协处理器操作码coproc协处理器编号如 CP15 对应 15Rd源 ARM 寄存器数据从此寄存器写出Crn/Crm协处理器主/次寄存器opcode1/opcode2协处理器操作码应用场景CP15 示例1. 读取处理器 IDc0/c0 寄存器2. 读取系统控制状态如 MMU 使能状态c1/c0 寄存器3. 读取中断屏蔽状态c12/c0 寄存器4. 读取 Cache 配置信息c9/c0 寄存器1. 使能 MMU修改 c1/c0 寄存器的 M 位2. 设置中断向量表基址修改 c12/c0 寄存器3. 刷新 Cache操作 c7/c6 寄存器4. 配置内存权限修改 c2/c0 寄存器2ARM 协处理器编号ARM 架构最多支持16 个协处理器编号为cp0 ~ cp15。3协处理器 CP15 配置CP15 是 Cortex-A7 的系统控制协处理器负责中断向量表、缓存、MMU 等配置中断相关核心寄存器如下寄存器名称功能描述关键配置项代码示例MIDR (c0)主 ID 寄存器内核型号、版本信息通过mrc p15,0,r0,c0,c0,0读取内核型号及版本信息调试时读取确认内核型号SCTLR (c1)系统控制寄存器中断异常向量表基地址V 位第13位、控制指令缓存开关I 位第12位mrc p15,0,r0,c1,c0,0; bic r0,r0,#(113);mcr p15,0,r0,c1,c0,0;向量表基址0x00000000VBAR (c12)向量基址寄存器中断向量表物理地址重定向后的异常向量表基地址.__set_VBAR(0x87800000);设置向量表基址为0x87800000CBAR (c15)配置基址寄存器GIC 寄存器物理基址mrc p15,4,r0,c15,c0,0;读取 GIC 基址⑦ 中断方式代码实现//key.c #include MCIMX6Y2.h #include fsl_iomuxc.h #include key.h #include core_ca7.h #include interrupt.h #include led.h void key_interrupt_handler(void) { if((GPIO1-ISR (1 18)) ! 0) { led_nor(); GPIO1-ISR | (1 18); //清除中断标志 } } void key_init(void) { //1.引脚复用 IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0); //2.电气属性 IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF0B0); //3.GPIO方向输入模式 GPIO1-GDIR ~(1 18); //4.配置中断触发方式下降沿 GPIO1-ICR2 | (3 4); //5.使能GPIO1_18引脚中断 GPIO1-IMR | (1 18); //6.注册按键中断 system_interrupt_register(GPIO1_Combined_16_31_IRQn, key_interrupt_handler); //7.设置中断优先级 GIC_SetPriority(GPIO1_Combined_16_31_IRQn, 0); //8.GIC使能中断 GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn); } int key_press(void) { if((GPIO1-PSR (1 18)) 0) { return 1; } else { return 0; } }//start.S .global _start _start: ldr pc, _reset_handler ldr pc, _undefine_handler ldr pc, _svc_handler ldr pc, _prefetch_aboart_handler ldr pc, _data_abort_handler ldr pc, _reserved_handler ldr pc, _irq_handler ldr pc, _fiq_handler _fiq_handler: ldr pc, _fiq_handler _irq_handler: subs lr, lr, #4 //GIC基地址 mrc p15, 4, r1, c15, c0, 0 add r1, r1, #0x2000 ldr r0, [r1, #0x0c] //中断号 stmfd sp!,{r0-r12, lr} stmfd sp!, {r0, r1} cps #0x1F //切换到system模式在执行c函数是可以被其他中断打断 stmfd sp!, {lr} bl system_interrupt_handler ldmfd sp!, {lr} cps #0x12 //切换到IRQ模式 ldmfd sp!, {r0, r1} str r0, [r1, #0x10] //清中断标志 ldmfd sp!, {r0-r12, pc}^ _reserved_handler: ldr pc, _reserved_handler _data_abort_handler: ldr pc, _data_abort_handler _prefetch_aboart_handler: ldr pc, _prefetch_aboart_handler _svc_handler: ldr pc, _svc_handler _undefine_handler: ldr pc, _undefine_handler _reset_handler: //切换工作模式IRQ //mrs r0, cpsr //bic r0, r0 ,#0x1F //orr r0, r0, #0x12 cps #0x12 //直接切换工作模式 cpsie i //使能IRQ中断 // bic r0, r0, #(1 7) //使能中断 //msr cpsr, r0 //设置IRQ模式下的栈 ldr sp, 0x86000000 //切换工作模式System //mrs r0, cpsr // bic r0, r0, #0x1F // orr r0, r0, #0x1F //msr cpsr, r0 cps #0x1F //设置system模式下的栈 ldr sp, 0x84000000 //清空bss段和common段 bl _bss_clear //打开icache bl _enable_icache //设置异常向量表重映射后的地址 bl _set_vbar //跳转到main函数执行 b main b finished _enable_icache: mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #(1 13) orr r0, r0, #(1 12) mcr p15, 0, r0, c1, c0, 0 bx lr _set_vbar: ldr r0, 0x87800000 mcr p15, 0, r0, c12, c0, 0 bx lr _bss_clear: ldr r0, __bss_start ldr r1, __bss_end loop: mov r2, #0 str r2, [r0] add r0, r0, #4 cmp r0, r1 blt loop bx lr finished: b finished//interrupt.c #include interrupt.h #include MCIMX6Y2.h #include core_ca7.h irq_handler_t interrupt_vector_table[160]; void system_interrupt_init(void) { GIC_Init(); } //注册中断函数 void system_interrupt_register(int num, irq_handler_t handler) { interrupt_vector_table[num] handler; } //irq中断服务函数 void system_interrupt_handler(int num) { if (interrupt_vector_table[num] ! NULL) { interrupt_vector_table[num](); } } //interrupt.h #ifndef __INTERRUPT_H__ #define __INTERRUPE_H__ typedef void (*irq_handler_t) (void); extern void system_interrupt_init(void); extern void system_interrupt_register(int num, irq_handler_t handler); #endif//main.c #include MCIMX6Y2.h #include fsl_iomuxc.h #include led.h #include beep.h #include key.h #include core_ca7.h #include interrupt.h //延迟函数 void delay(unsigned int n) { while(n--); } void enable_clocks(void) { CCM-CCGR0 0xFFFFFFFF; CCM-CCGR1 0xFFFFFFFF; CCM-CCGR2 0xFFFFFFFF; CCM-CCGR3 0xFFFFFFFF; CCM-CCGR4 0xFFFFFFFF; CCM-CCGR5 0xFFFFFFFF; CCM-CCGR6 0xFFFFFFFF; } int main(void) { //使能外设时钟 enable_clocks(); //使能中断 system_interrupt_init(); //led初始化 led_init(); //蜂鸣器beep初始化 beep_init(); //按键初始化 key_init(); led_off(); beep_off(); while(1) { delay(0xFFFFFFFF); } return 0; }

相关新闻

【音频基础学习】第 13 天,把概念映射到工程代码

【音频基础学习】第 13 天,把概念映射到工程代码

前言 前 12 天你已经学了很多音频概念。第 13 天要做一件很实际的事:把概念映射到代码里。 当你看一个 Qt C FFmpeg QML 音频工具项目时,会经常看到: sampleRatechannelsbitsPerSamplePCM bufferframe countbyte offsetPeakRMSexport 这些…

2026/10/17 7:18:59 阅读更多 →
华为OD机试C语言最短路径算法实战解析

华为OD机试C语言最短路径算法实战解析

1. 项目背景与题目解析 "直捣黄龙"是华为OD(Outstanding Developer)2026年最新机试系统中的一道C语言编程题,主要考察开发者对数据结构、算法设计和代码实现的综合能力。这道题目名称取材于成语"直捣黄龙",暗…

2026/10/14 21:22:13 阅读更多 →
Maven 学习框架:依赖管理 + 仓库配置 + IDEA 集成

Maven 学习框架:依赖管理 + 仓库配置 + IDEA 集成

1. Maven 的概念1.1. 什么是 MavenMaven 是一个基于 项目对象模型(POM) 的 Apache 开源项目管理工具。它不仅仅是一个构建工具,更是一个项目管理框架。核心机制:通过一个 pom.xml 文件管理项目的整个生命周期(编译、测…

2026/10/16 12:19:14 阅读更多 →

最新新闻

AI写教材如何规避重复率陷阱?低查重工具选型与提示词策略

AI写教材如何规避重复率陷阱?低查重工具选型与提示词策略

最近半年我一直在帮某课程团队整理一本专业基础课教材,从大纲到初稿全程用 AI 协作,中间最头疼的倒不是“AI 写不出来”,而是“AI 写出来之后,原创性和教学深度都撑不住”。团队里三位老师拿着初稿去和已出版教材比对,…

2026/10/17 7:19:06 阅读更多 →
SICK RFID TCP通信缓冲区设置与帧解析实战

SICK RFID TCP通信缓冲区设置与帧解析实战

简介:本资源是一套面向工业自动化开发者的C#实战项目,聚焦德国SICK RFID读卡器RFU630的TCP通信集成方案,适用于具备基础C#和网络编程能力的中级开发者,解决工业现场设备数据实时采集、异步响应与UI线程安全更新等典型痛点。压缩包…

2026/10/17 7:19:06 阅读更多 →
企业AI能力评估:六维模型与实战诊断指南

企业AI能力评估:六维模型与实战诊断指南

这两年我作为AI应用架构师,帮不少企业做过AI能力体检。说白了,这项工作就是在回答一个问题:一家企业说自己“AI能力强”,到底体现在哪里?是买了几套GPU服务器?是上线了一个智能客服?还是说从决策…

2026/10/17 7:19:06 阅读更多 →
AI辅助毕业论文全流程指南:从选题到降重的不踩坑方法论

AI辅助毕业论文全流程指南:从选题到降重的不踩坑方法论

1. 别硬憋了:毕业论文的正确打开方式我见过太多人写毕业论文,状态基本是:泡图书馆一整天,打开文档盯着光标闪,憋到晚上只憋出二百字,其中一百五十字还是删了又写、写了又删的废话。那种感觉我太懂了——不是…

2026/10/17 7:19:06 阅读更多 →
Flow Matching与Diffusion Policy:从速度场学习到机器人动作生成实战

Flow Matching与Diffusion Policy:从速度场学习到机器人动作生成实战

1. 从“生成模型到底在学什么”说起1.1 一个被问烂了但很少被讲透的问题搞生成模型的人,几乎都绕不开一个灵魂拷问:模型到底在学什么?早期做GAN的时候,大家说是在学一个从噪声到数据的映射,判别器负责挑刺,…

2026/10/17 7:19:06 阅读更多 →
IDA逆向工程实战:从静态分析到二进制补丁的完整流程

IDA逆向工程实战:从静态分析到二进制补丁的完整流程

干逆向这一行的,绕不开IDA。不管是分析一个陌生二进制文件到底干了什么、给某个老程序打补丁,还是解CTF里的Reverse题,IDA几乎都是所有人默认打开的第一件工具。它最核心的价值就是把机器码翻译成人类能读的伪代码和汇编,同时把整…

2026/10/17 7:18:06 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →