完整教程:IC(输入捕获)
1. 为什么要用输入捕获?
你要测量一个外部信号的“时间特性”(频率、周期、脉宽、占空比),就需要知道某个电平跳变时,定时器计数器 CNT 的值是多少。
如果靠软件轮询 GPIO,反应太慢(CPU 扫描周期远大于微秒级的信号)。
定时器输入捕获:硬件自动在边沿时刻把 CNT 锁存到 CCR,不会漏、不靠软件延时,精度高。
所以,输入捕获相当于给你一个 硬件秒表,能精确记下“事件发生的时间点”。
2. 步骤与配置
main.c
#include "stm32f10x.h" // 设备头文件
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"
int main(void)
{
OLED_Init(); // 初始化 OLED 显示
PWM_Init(); // 初始化 PWM(TIM2_CH1 输出)
IC_Init(); // 初始化输入捕获(TIM3_CH1 输入)
// 显示标题
OLED_ShowString(1, 1, "Freq:00000Hz");
OLED_ShowString(2, 1, "Duty:00%");
// 设置 PWM 输出信号:1kHz 50%
PWM_SetPrescaler(720 - 1); // PSC=719 → f=72M/720=100kHz,ARR=100 → f=1kHz
PWM_SetCompare1(50); // CCR1=50 → 占空比=50/100=50%
while (1)
{
// 实时显示频率与占空比
OLED_ShowNum(1, 6, IC_GetFreq(), 5); // 显示频率(5位数)
OLED_ShowNum(2, 6, IC_GetDuty(), 2); // 显示占空比(2位数)
}
}
初始化 OLED、PWM(输出信号)、IC(输入捕获)。
OLED 显示模板。
PWM_SetPrescaler(719) → PWM 频率 = 72MHz / 720 / 100 = 1kHz。
PWM_SetCompare1(50) → 占空比 = 50/100 = 50%。
while 循环里动态显示 IC_GetFreq() 和 IC_GetDuty() 的计算结果。
PWM.c
#include "stm32f10x.h" // 设备头文件
// 初始化 PWM:TIM2_CH1 → PA0
void PWM_Init(void)
{
// 1. 开启 TIM2 和 GPIOA 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 配置 PA0 为 复用推挽输出(PWM 信号)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // TIM2_CH1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. 定时器时钟选择内部时钟
TIM_InternalClockConfig(TIM2);
// 4. 配置 TIM2 基本定时器参数
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; // ARR=99(计数范围:0~99)
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;// PSC=719 → 定时器频率=72M/720=100kHz
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
// 5. 配置输出比较通道为 PWM 模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure); // 先用默认值填充结构体
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM 模式 1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
TIM_OCInitStructure.TIM_Pulse = 0; // 初始比较值=0
TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 配置 TIM2_CH1
// 6. 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
// 设置占空比:CCR1
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare);
}
// 设置分频器:PSC
void PWM_SetPrescaler(uint16_t Prescaler)
{
TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);
}
TIM2_CH1(PA0)配置成 PWM 输出。
定时器时钟:72MHz → 经过 PSC=719 → 100kHz。
ARR=99 → 每 100 个计数溢出一次 → PWM 频率 = 100kHz/100 = 1kHz。
CCR1=50 → 高电平 50 个计数 → 占空比 = 50/100 = 50%。
IC.c
#include "stm32f10x.h" // 设备头文件
// 初始化输入捕获:TIM3_CH1 → PA6
void IC_Init(void)
{
// 1. 开启 TIM3 和 GPIOA 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 配置 PA6 为上拉输入模式(TIM3_CH1)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // TIM3_CH1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. 定时器使用内部时钟
TIM_InternalClockConfig(TIM3);
// 4. 配置 TIM3 基本定时器参数
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; // ARR=65535
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; // PSC=71 → 计数频率=72M/72=1MHz(1us)
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
// 5. 配置输入捕获通道(PWM 输入模式)
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // 选择 CH1
TIM_ICInitStructure.TIM_ICFilter = 0xF; // 输入滤波
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿捕获
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接映射 TI1
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure); // 配置为 PWM 输入模式
// 6. 配置触发源与从模式
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 选择 TI1FP1 作为触发源
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 触发时复位 CNT(保证 CCR1 是周期)
// 7. 启动定时器
TIM_Cmd(TIM3, ENABLE);
}
// 获取频率:Freq = 1,000,000 / 周期(us)
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1);
}
// 获取占空比:Duty = 高电平时间 / 周期 * 100%
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}
用 TIM3_CH1 (PA6) 作为输入捕获引脚。
PSC=71 → 1MHz → CNT 每 1us 增加 1 → 捕获值直接等于“微秒数”。
TIM_PWMIConfig() 配置为 PWM 输入模式:
CCR1 捕获周期(上升沿 → 上升沿)。
CCR2 捕获高电平时间(上升沿 → 下降沿)。
SlaveMode_Reset → 每次上升沿自动复位 CNT,保证 CCR1 直接等于周期长度。
TIM_GetCapture1(TIM3) = 周期计数(单位:us)。
Freq = 1,000,000 / 周期(us)。
TIM_GetCapture2(TIM3) = 高电平计数(单位:us)。
Duty = 高电平 / 周期 × 100%。
例如:
CCR1 = 1000 → 周期 = 1000us = 1ms → 频率 = 1kHz。
CCR2 = 500 → 高电平时间 = 500us → 占空比 = 500/1000=50%。
整个运行过程(信号流)
TIM2_CH1(PA0) 输出一个 1kHz 50% PWM 信号。
把 PA0 用杜邦线接到 PA6 (TIM3_CH1)。
TIM3 在输入捕获模式下:
上升沿 → 捕获 CNT → 存入 CCR1(周期)。
下降沿 → 捕获 CNT → 存入 CCR2(高电平时间)。
软件调用 IC_GetFreq() / IC_GetDuty() → 算出频率和占空比。
OLED 实时显示。
3.频率测量
4.由此我再详细展开代码进行解释
Main()函数
OLED_ShowString(1, 1, "Freq:00000Hz");
OLED_ShowString(2, 1, "Duty:00%");
初始化显示文本框架:
第一行:频率
第二行:占空比
输入捕获初始化 IC_Init()
虽然 CH2 是 PA7,但不用手动配置,TIM_PWMIConfig() 会自动处理。
TIM_InternalClockConfig(TIM3);
设置 TIM3 使用内部时钟(72MHz)作为计数源。
若用外部时钟(如外部晶振或编码器信号),需额外配置。
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
设定 TIM3 的基本计数参数:
Prescaler = 72-1:每 1us 计一次
ARR = 65535:最大计数周期 65.5ms(最小可测频率约 15Hz)
ClockDivision 是死区等控制,不影响输入捕获
CounterMode = Up:向上计数(从0到ARR)
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
配置通道1的输入捕获参数:
极性:上升沿触发
滤波:0xF = 最大滤波,抗干扰
选择:TI1,直接连接引脚
预分频器不分频,每个沿都捕获
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
关键函数!配置 TIM3 为PWM 输入模式:
自动配置:
CH1 捕获周期:两个上升沿之间
CH2 捕获高电平:上升沿 → 下降沿
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
设置 TI1FP1 为输入触发(上升沿)
使用 Reset 模式
每次上升沿,CNT 清零,从而方便测周期时间
频率与占空比计算
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1);
}
解释:
获取 CCR1:CH1 捕获的周期(单位:us)
使用公式:
Freq = 1秒 / 周期时间 = 1,000,000 / 周期(us)
+1 防止除以 0,安全设计。
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}
解释:
占空比 = 高电平时间 / 周期 × 100%
CH2 捕获高电平时间,CH1 捕获周期
+1 防止除以 0,容错设计。
功能 | 方法 | 接口 |
测频率 | CH1 捕获周期(上升-上升) | IC_GetFreq() |
测占空比 | CH2 捕获高电平(上升-下降) | IC_GetDuty() |
显示 | OLED 显示 | OLED 接口 |
信号路径总览
输入的 PWM 波形 → 经 GPIO 进入 → 经过滤波器 → 边沿极性判断 → 分为 TI1FP1 和 TI1FP2 两路 → 连接到捕获单元 → 最终更新 CCR1 和 CCR2
从左到右模块解析
GPIO(PA6)
输入外部 PWM 信号,STM32 的 TIM3_CH1 通常连接到 GPIOA 的 PA6。
信号从这里进入定时器捕获逻辑。
滤波器
用于对输入信号进行消抖处理(抗干扰)。
滤波级别由 TIM_ICFilter 决定,在你代码中设置为 0xF,表示最高等级。
TIM_ICInitStructure.TIM_ICFilter = 0xF;
边沿检测 + 极性选择
决定检测哪个边沿触发捕获:
上升沿:TIM_ICPolarity_Rising
下降沿:TIM_ICPolarity_Falling
该配置决定 TI1FP1、TI1FP2 的行为。
在你设置的 PWM 输入模式中,TI1FP1 用于上升沿,TI1FP2 用于下降沿。
TI1FP1 / TI1FP2
这是捕获信号的逻辑输入通道,分别对应两个不同极性的触发事件:
TI1FP1(CH1 通道):用于产生周期捕获(上升 → 上升)
TI1FP2(CH2 通道):用于产生高电平捕获(上升 → 下降)
两个核心路径
路径1:TI1FP1 → 分频器 → CCR1
捕获的是 周期时间:
TI1FP1 接上升沿信号 → 触发 TIM3 在 CNT=当前值时锁存至 CCR1
然后 重置 CNT = 0(因为配置了 Slave Mode = Reset)
下一个上升沿又会触发捕获 → 得到完整周期
你用 CCR1 来算频率:
IC_GetFreq() = 1,000,000 / (CCR1 + 1);
路径2:TI1FP2 → 分频器 → CCR2
捕获的是 高电平持续时间:
TI1FP2 接下降沿信号 → 捕获当前 CNT → 锁存至 CCR2
它代表从上升沿开始后经过多少时间到下降沿
你用 CCR2 来算占空比:
IC_GetDuty() = (CCR2 + 1) * 100 / (CCR1 + 1);
模块 | 作用 |
PSC(预分频器) | 将 72MHz 主时钟分频,比如 72 → 1MHz(即 1us 计一次) |
CNT(计数器) | 从0开始计数,在边沿触发时会被捕获到 CCRx |
ARR(自动重装) | 控制最大计数值,超过就溢出 |
Slave Mode:为什么要用 Reset
在你代码中:
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 设置上升沿为触发源
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 每次上升沿将 CNT 清零
解释:
让每一个周期都从 0 开始计时。
这样 CCR1、CCR2 都是“从上升沿开始算”的相对时间。
避免了你必须手动记录 CNT 起始值、当前值,简化计算。
时间点 | 事件 | CNT 行为 | 捕获行为 |
第一个上升沿 | CNT=0 | CNT清零(Reset) | 等待下一次 |
第二个上升沿 | CNT=x1 | CCR1 = x1(周期) | CNT清零 |
第二个下降沿 | CNT=y1 | CCR2 = y1(高电平) | CNT继续 |
第三个上升沿 | CNT=x2 | CCR1 = x2 | CNT清零 |
主从触发模式
主模式(Master Mode)
左边黄色框:
定时器可以把一些事件输出为 TRGO 信号,传给其他定时器当触发源。
可选择的输出事件:
Reset(复位)
Enable(使能)
Update(更新事件,即溢出时)
OC1/OC2/OC3/OC4(比较匹配时)
OC1REF、OC2REF、OC3REF、OC4REF(比较输出参考信号)
简单理解:主模式就是定时器“产生”一个触发信号,给别人用。
触发源选择(Trigger Selection)
中间黄色框:
定时器从外部接收 TRGI 触发信号,这些信号可能来自:
ITR0~3(内部触发,来自别的定时器的 TRGO)
TI1FP1(来自 CH1 的输入捕获信号)
TI2FP2(来自 CH2 的输入捕获信号)
TI1F_ED(来自 CH1 的边沿检测)
ETRF(外部触发引脚)
简单理解:这是定时器“接收”触发源的入口。
从模式(Slave Mode)
右边绿色框:
接收到 TRGI 后,定时器可以有不同的反应:
Closed:关闭
Encoder1/2/3:编码器接口模式
Reset:接收到触发信号时复位 CNT(输入捕获常用)
Gated:只有触发信号有效时,计数器才计数
Trigger:触发一次就启动一次
External1:外部时钟模式
简单理解:从模式就是定时器“对触发信号的响应方式”。
应用到输入捕获测频率
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 选择 CH1 的输入作为触发源
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);// 触发时复位 CNT
TI1FP1 = PA6 的输入波形,每次上升沿进来时,触发一次。
Reset 模式 → CNT 被清零,同时把这个周期锁存到 CCR1。
CCR1 = 周期(两个上升沿之间的时间)。
CCR2 = 高电平时间(由 PWM 输入模式自动配置)。
这样你就能自动得到 周期(频率)+ 高电平宽度(占空比)。
无需自己写中断处理 CNT 溢出,硬件帮助完成了。
相关文章:
完整教程:IC(输入捕获)
完整教程:IC(输入捕获)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...
HiMarket 正式开源,为企业落地开箱即用的 AI 开放平台
在 AI 浪潮席卷千行百业的今天,我们看到无数企业和开发者满怀激情地投身其中。无论是将内部的大模型能力赋能给各个业务线,还是希望将昂贵的 AI 资产对外开放、构建生态,一个强大的“AI 开放平台”都已成为刚需。💡 目录 01 HiMarket 开源背景 02 HiMarket 是什么 03 快…...
如何统计DrawMeshInstancedIndirect绘制物体的Triangle数据
1)如何统计DrawMeshInstancedIndirect绘制物体的Triangle数据2)如何量化骨骼数量对功耗的影响3)Sprite Atlas和单独的Sprite的RW设置分别如何影响内存4)Playable的Animator.WriteTransform一直执行在一个Job线程里这是第444篇UWA技术知识分享的推送,精选了UWA社区的热门话…...
VK1S68C点钟LED驱动控制专用芯片高抗干扰数显驱动IC 可支持134的点阵LED显示面板
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串行接口、数据锁存器、LED 驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED 阴极,可支持13SEGx4GRID、12SEGx5GRID、11SEGx6GRID、10SEGx7GRID的点阵LED显 示面板,最大支持10x2按键。适用…...
基于MATLAB的海洋中尺度涡旋诊断
基于MATLAB的海洋中尺度涡旋诊断方案,使用卫星高度计与海洋模式数据,结合多源特征提取与机器学习方法:一、系统架构设计 % 主程序框架 [ssh_mod, ssh_sat] = load_data(); % 加载模型与卫星数据 [ssh_merged, mask] = data_preprocess(ssh_mod, ssh_sat); % 数据融合与掩膜生…...
从混乱到有序:Tita 项目一体化管理的全场景赋能
在企业运营中,项目管理如同一条贯穿始终的主线,串联起资源调配、团队协作与目标达成。然而,多数企业在项目推进过程中,常常陷入流程断裂、信息滞后、协作低效的困境。Tita 项目一体化管理以全场景覆盖的特性,为企业提供从根源上解决问题的方案,让项目管理从 “被动救火”…...
SpringBoot入门指南:让Java开发变得像搭积木一样简单 - 教程
SpringBoot入门指南:让Java开发变得像搭积木一样简单 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...
汇编语言[王爽]-13 int指令【中断实现loop、jmp】
int指令 格式:int n :n是中断向量码,引发一个中断 作用:等价于下面的代码【中断流程】 1. 取中断向量码N 2. pushf 3. IF=0,TF=0 4. push CS , push IP 5. (IP)=(N*4) ; (CS)=(N*4+2)iret指令 格式: iret 从中断例程中返回 作用:等价于下面的代码 pop IP pop CS popf💡…...
Supabase云同步架构:Flutter应用的数据同步策略
Supabase云同步架构:Flutter应用的数据同步策略本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨如何使用Supabase构建安全、高效的云端数据同步系统。项目背景 BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存储…...
汇编语言[王爽]-12 内中断
内中断的产生 来源及中断码除法错误:0 单步执行:1 执行into指令:4 执行int n指令:n中断向量表中断过程 CPU收到中断信息后,根据中断向量表,跳转到相应的中断程序中处理中断,这一过程称为中断过程从中断信息中取得中断向量码N 标志寄存器入栈(因为中断过程中要改变标志寄…...
【SPIE出版】第五届先进制造技术与电子信息国际学术会议(AMTEI 2025)
第五届先进制造技术与电子信息国际学术会议(AMTEI 2025)将于2025年09月26-28日在重庆召开。【先进制造、机械工程、电子信息方向均可投稿】 【SPIE见刊发表,EI Compendex和Scopus检索收录 | 发表&检索十分稳定!】 第五届先进制造技术与电子信息国际学术会议(AMTEI 202…...
2025.9.15 考试总结
总结来说就是 3h 写 t1 没时间想 t2,t3 了,其实 t3 还是很一眼的。 T1 一个斜优板子。 每次如果 \(l_i = 1, r_i = i - 1\),是很容易用李超树做到 \(O(n \log n)\)。 既然每次查一个区间,那么就在外面套一个线段树。 std 的做法是用线段树维护凸包,我的树套树被卡常了。 李…...
汇编语言[王爽]-01 基础知识
汇编语言的组成汇编指令:机器码的助记符,有相应的机器码 伪指令:没有对应的机器码,由编译器执行,计算机不执行 其他符号:如+ - * / 由编译器识别,没有对应的机器码汇编指令是汇编语言的核心 指令与数据是应用上的概念,在x86架构中,指令和数据存放在内存或磁盘中没有任…...
贪心外套计数
[AGC049E] Increment Decrement一个序列 \(A\) 有一个权值:序列 \(a\) 元素都等于 \(0\),能进行若干次操作单点加 \(1\) 或 \(-1\),花费为 \(1\)。 区间加 \(1\) 或 \(-1\),花费为 \(C\)。\(a\) 变成 \(A\) 的最小花费,即为 \(A\) 的权值。 给 \(n\) 个长 \(k\) 的序列 \(…...
汇编语言[王爽]-02 寄存器
14个寄存器,都是16位 AX BX CX DX SI DI SP BP IP CS SS DS ES PSW 通用寄存器:AX BX CX DX 段寄存器:CS DS SS ES cpu分段寻址 8086是16位机,寄存器,运算器,寄存器与运算器的通路都是16位的,那么又是如何达到20位的地址总线宽度的呢。答案是使用分段寻址 物理地址= 段地…...
汇编语言[王爽]-03 寄存器(内存访问)
内存视图内存由低至高从上往下画 栈的生长方向:高地址向低地址 小端存储:高位存放在高地址,低位存放在低地址书写的时候高位在左边。 4E20H 存储单元高地址在右边。 0 - 3 : 20 4E 12 00mov指令 mov ax,1000h mov ds,ax mov [0],bx #传送字型数据内存单元以ds为段基址 不能…...
汇编语言[王爽]-05 [BX]和loop指令
loop指令实现循环 执行过程: ①(cx)=(cx)-1 ②判断 cx 中的值,不为零则转至标号处执行程序,如果为零则向下执行。 例:计算2^12 assume cs:codesegcodeseg segmentmov ax,2#-------做11次add ax,ax----------mov cx,11 s:add ax,axloop s#--------------------------------m…...
完整教程:YOLO数据集格式转换工具v1.0-微智启软件工作室
完整教程:YOLO数据集格式转换工具v1.0-微智启软件工作室pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mo…...
2.docker 安装
系统环境 wind(wsl ) Ubuntu 安装Docker...
树形DP2F
T1 树的直径 我们使用\(f[u]\)表示以\(u\)为根的子树,向下延伸的最远距离 那么\(f[u]\)的初始值为0,表示\(u\)能向下延伸的最远距离是自己,\(f[u]=0\) \(ans=max(ans,f[u]+f[v]+w)ans\)表示直径 错误1 如果有负边权,所以我把\(f[u]\)的初值设置成为一个极小值,这样的话,和…...
搞定SPI开发:硬件设计精讲与CH390H示例应用
想要轻松搞定SPI开发?聚焦硬件设计关键要点,结合CH390H芯片示例,带你从理论到实践,全面掌握SPI开发技术。 本文以Air780EPM为例,分享SPI接口的开发注意事项及硬件设计要点。 一、Air780EPM的SPI功能支持 在Air780EPM中,SPI接口通过特定GPIO引脚实现,需结合LuatOS的API进…...
Qt-摄像头捕获画面
Qt-摄像头捕获画面在qt中捕获摄像头画面,在ui界面上添加一个comboBox控件、label标签和两个pushButton按钮,comboBox用于显示摄像头的设备,按钮用于开启摄像头和捕获当前帧的画面,label用于显示摄像头捕获的画面。//需要在.pro文件中加上multimedia multimediawidgets QT …...
我开发的软件和开源/免费软件
一、我开发的软件 1.软件目录 2.下载地址 通过网盘分享的文件: 链接:https://pan.baidu.com/s/1PiK9OhZs_mSjd5PcXRig4Q?pwd=dyzj 提取码:dyzj 复制这段内容后打开百度网盘手机App,操作更方便哦二、开源/免费软件Everything.zip(电脑文件搜索软件) ScreenToGif录屏工具 O…...
PostgreSQL中级认证,PG证书官网查询
Oracle数据库的认证行业皆知,它分为OCA、OCP和OCM三种代表着初中高三个级别,证书可以在Oracle官网查询;PostgreSQL数据库的认证也是类似,分为PGCA、PGCP和PGCM三种,如果是工信部人才交流中心的PG认证,可以在工信人才官网查询,查询网址:www.miitec.cn 一、工信部人才交流…...
LLaMA-Adapter - 详解
LLaMA-Adapter - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14…...
查看安装软件版本的命令
java -version allure --version pip3 --verison...
ubuntu 20.04安装mysql 5.7
环境Os:ubuntu 20.04 desktop桌面版mysql:mysql-5.7.42-linux-glibc2.12查看操作系统信息root@db:/soft# ldd --version ldd (Ubuntu GLIBC 2.31-0ubuntu9) 2.31 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying condit…...
企业微信逆向开发协议,ipad协议调用方式
企业微信逆向开发协议,ipad协议调用方式企业微信ipad协议接口,已经实现了企业微信pc端所有功能。 【初始化】:初始化企业微信、设置消息回调、获取运行中的实例、根据uuid查看实例详情 【登录】: 获取登录二维码、输入验证码设置、 自动登录、退出登录、获取二次验证二维码…...
OpenStack Nova Scheduler 计算节点选择机制
Nova Scheduler 的核心任务是解决“虚拟机实例在哪个计算节点上启动”的问题,它根据用户通过 flavor 提出的资源需求(如 CPU、内存、磁盘)来做出决策。其默认的调度器是 Filter Scheduler,工作流程主要分为过滤 (Filtering) 和称重 (Weighting) 两个阶段。 1、整体流程 1.1…...
记一种很新的 bitset
bitset 可以维护位移和或。 我们可以扩展他一下,变成值域为 \([0,2^k)\),然后每次操作是位移和对位相加然后对 \(2^k-1\) 取 \(\min\)。 我们每一位取 \(k+1\) 个 \(\text{bit}\),每次加起来后把第 \(k+1\) 位或到前面,然后再与掉就可以了。 复杂度 \(\dfrac {n\log k}\ome…...
基于yolo12进行深度学习的机动车车牌检测
本文介绍了一个基于YOLOv12深度学习的机动车车牌检测系统。该系统采用PyQt5构建图形界面,支持图片和视频输入,能实时检测并分割车牌区域,同时提供结果保存功能。项目使用约1300张包含多角度、多颜色变化的车牌图像进行训练,提升模型鲁棒性。代码部分详细展示了界面设计、YO…...
有向图强连通分量
相关定义 若有向图的 \(u, v\) 两点互相可达,则称 \(u, v\) 强连通。满足任意两点强连通的有向图为 强连通图。有向图的极大强连通子图称作 强连通分量(SCC)。 以下讨论时默认图为有向弱连通图(弱连通即将有向边看作无向边时连通)。 DFS 树 对于有向图,按照任意顺序对结点…...
Kafka 消费者元数据topicId变化问题
遇到问题程序启动后, 短时间内没有数据2025-09-15 15:09:44,214 INFO org.apache.kafka.clients.Metadata [] - [Consumer clientId=flink-test-2, groupId=flink-test] Resetting the last seen epoch of partition ykkafka-3 to 0 since the as…...
【SPIE出版】第五届生物医学与生物信息工程国际学术会议(ICBBE 2025)
第五届生物医学与生物信息工程国际学术会议(ICBBE 2025)将于2025年9月26-28日在中国沈阳召开。【ICBBE 2025已成功申请到SPIE独立出版,稳定EI, Scopus检索!】 【北京大学一级教授莅临本会,欢迎专家学者积极报名参会,即享现场直面交流机会,助力大家求学/科研之路!】 第五…...
Qoder 全新「上下文压缩」功能正式上线,省 Credits !
Qoder 全新「上下文压缩」功能正式上线,高效管理会话上下文,节省开发成本,同时保持高效协作!你是否经历过与 AI Coding 工具协作编程时,对话越来越长,回答却开始变慢,甚至跑偏?在使用 AI Coding 工具过程中,是否觉得 tokens 消耗过快,越来越不经用? Qoder 全新「上下…...
journald 持久化 + 限额脚本
#!/usr/bin/env bash # --------------------------------------------------------- # Enable persistent systemd-journald logs with disk limits # Tested on: AlmaLinux 9 / CentOS Stream 9 # Author: 四点 # ---------------------------------------------------------…...
【2025-09-14】连岳摘抄
23:59一个人要想战胜自己的恐慌,就必须在自身与全人类的命运间建立关联。一个人要想坦然生活下去,就必须明白自己是全人类的一分子。——阿尔弗雷德阿德勒该讨厌的人就得讨厌,这样才能开心。该讨厌的人假装不讨厌,自己就不能开心。一个人利用你,侮辱你,当然应该讨厌。你性…...
深入解析:PAT乙级_1125 子串与子列_Python_AC解法_含疑难点
深入解析:PAT乙级_1125 子串与子列_Python_AC解法_含疑难点pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...
ESP32-S3 与GPS北斗通信返回定位/海拔/速度数据的测试代码
1.设备选用了银尔达企业店的 M100PG(DTU固件)贴片卡-单北斗模块 https://item.taobao.com/item.htm?id=718803061339&mi_id=0000qaxoKpzXrjCqKjNVBO442w3_i_Vz_sY6iyO-vASV8-s&spm=tbpc.boughtlist.suborder_itempic.d718803061339.67002e8dTIrFEQ&sku_properties…...
GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.8.0发布 新增仪表盘和检索功能
前言 很久没更新这个组件了,主要是没想到加什么东西 后来经过群友提醒,其实可以加个仪表盘的功能,方便在任务比较多的时候监听执行情况. (PS:有些群友的定时任务已经干到了上百条..) 说加就加.. 所以就有了2.8的版本.. 2.8.0正式发布. 更新内容: 1.新增任务界面搜索功能,可根据…...
AIGEO助力企业破局
商务部9月13日发布公告,就美国对华集成电路领域相关措施发起反歧视调查,这一事件凸显了核心技术自主可控的紧迫性。在AI搜索优化领域,不少中国企业正积极创新突破外部限制,跑一跑自研的AIGEO产品便是其中典型。您是否正为企业曝光度低、市场影响力不足而发愁?跑一跑AIGEO产…...
东南大学数据库课程06-Database Design
Database Design 目录Database DesignData DependencyNormalization of Relational Schema1NF2NFProblems of non 2NF3NFProblems of non 3NFSummaryER Model and ER DiagramDatabase Design MethodRequirement AnalysisConcept DesignLogic DesignPhysical DesignSummary Data…...
MacOS升级15.2后的问题(二):无法修改mac网络地址
升级新的系统版本后,安全策略有变动,无法直接修改mac网络地址,只能绕过去 1.打开《系统设置》->《网络》->《其他服务》->《管理虚拟接口》 2.点击《+》号新增,名字自己随便取,记住BSD名称就行3.打开终端,输入指令,例如刚刚我新增的test1 对应BSD名称 bridge2 …...
东南大学数据库课程07-Distributed Database Systems
Distributed Database Systems 目录Distributed Database SystemsIntroductionDatabase DistributionStrategies of Data DistributionUnit of Data DistributionProblems Caused by Data DistributionFederated DatabaseQuery Optimization in DDBMSRecovery Mechanism in DDB…...
HCIA——VLAN间通信
...
Xdebug安装与PhpStorm调试配置
一、Xdebug 介绍 Xdebug 是 PHP 的一个扩展,提供了多种功能以改善 PHP 开发体验。单步调试:在脚本执行时于集成开发环境(IDE)或编辑器中逐行调试代码的一种方式。PHP 错误报告的改进:改进的 var_dump() 函数,针对提示、警告、错误和异常提供堆栈跟踪,以突出显示导致错误…...
vue - 内置指令
Vue3 提供了一系列内置指令,用于简化 DOM 操作和实现常见功能。这些指令以 v- 前缀开头,通常用于模板中,以下是详细分类及解析: 一、核心渲染指令 用于控制元素的渲染逻辑和数据绑定。v-text功能:更新元素的文本内容(相当于 textContent)。示例: <span v-text="…...
东南大学数据库课程02-DataModel数据模型
Data Model 数据模型 目录Data Model 数据模型2.1 Hierarchical Data ModelBasic IdeaHierarchical Data SchemaVirtual Record2.2 Network Data Model2.3 Relational Data ModelBasic Idea相关术语Relation,Tuple,Attribute,Column,DomainPrimary KeyForeign Key, Reference I…...
Torch核心数据结构Tensor(张量)
本文pytorch的入门系列文章第一篇,首先介绍了张量tensor这一基础内容,尤其详细介绍其关键概念自动求导autograd原理及简单应用。1 基本概念 tensor是一个多维数组,类似于NumPy中的ndarray,但tensor可以在GPU上进行高效计算,这是它与ndarray的重要区别之一。它可以表示标量…...
vue - 进阶
响应式: 进阶 customRef() 创建一个自定义的 ref,显式声明对其依赖追踪和更新触发的控制方式。类型 function customRef<T>(factory: CustomRefFactory<T>): Ref<T>type CustomRefFactory<T> = (track: () => void,trigger: () => void ) =>…...