当前位置: 首页 > news >正文

STM32定时器(定时、输出比较)

我是这样理解定时器的定时器的定时功能就是定时器内部自己产生波形进行定时定时器的输出比较就是定时器把产生的波形通过引脚输出给了外部设备并且这个波形不一定非得是方波可以调节占空比。我是这样理解输入捕获的外部设备比如某一个信号源会产生波形然后把这个信号源送入stm32的某一个引脚这个引脚就可以通过输入捕获的方式去测量信号源发出的信号至于怎么测就是我把定时器配置成输入捕获的模式然后设置一些特定的参数就可以这样就是输入捕获。这就是我目前对定时器的理解。输出比较输入捕获是要在输出比较的基础之上去理解的。定时器之所以能够实现定时就是因为定时器其实就是一个计数器这个计数器可以产生波形用来计时最关键的就是这个计数器就是CNT所以我感觉定时器最重要的部分就是CNT。捕获/比较寄存器是输入捕获和输出比较共用的当使用输入捕获时他就是捕获寄存器。 当使用输出比较时他就是比较寄存器。在输出比较中会比较CNT和CCR的值CNT计数自增CCR是我们给定的一个值当CNT大于CCR、小于CCR或等于CCR时输出就会对应的置0、1。4个通道有各自的CCR寄存器但是他们是共用一个CNT计数器的。使用PWM波形是用来等效的实现一个模拟信号的输出。分辨率就是用来决定当我的占空比想要设置50%时我的ccr的值应该是多少ARR越大50%占空比的误差就越小分辨率就越高。PWM的频率计数器的更新频率定时器时钟源频率/预分频器PSC1/自动装载值ARR1高级定时器的输出比较通道我驱动H桥电机的时候可以使用高级定时器使用高级定时器的时候会用到一个通道高级定时器的一个通道就可以去控制电机的正转和反转。也可以使用基本定时器但是使用基本定时器会用到两个通道分别去控制电机的正反转。定时器基本定时的功能在我的代码当中没有开启NVIC标志位但这个中断请求不会被CPU接收因此不会跳转到中断服务函数去执行我的操作。只有当我开启了NVIC这个硬件事件才会触发CPU去执行中断函数。所以说定时器溢出中断产生的标志位。定时时长总结一下就是我现在让外部时钟产生72兆Hz的脉冲波。现在的情况就是外部时钟会源源不断的产生脉冲波然后让定时器的CnT进行计数因为定时器是16位的所以最大的arr二只能是65536假如没有对定时器进行分屏的话就是会以72兆Hz的频率去计数这个时候我的计数器会每秒计数72000000个假如我对他进行2分频的话我的计数器就会每秒计36000000这样我的速度就会比原来慢二倍但是我的arr的值还是那些。想要计数的脉冲是不变的但是我的速度慢了二倍。所以用的时间就会长二倍这样就可以实现定时多二倍。频率最小取倒数之后时间就是最大的72M/65536/65536这是最慢的频率定时器级联总结一下就是对于第一个定时器当第一个定时器进行2分频捕获到72兆Hz外部时钟源的第二个上升沿的时候第一个定时器就会计数一假设第一个定时器会用5秒的时间溢出那么第二个定时器检测到第一个定时器溢出就是相当于第一个定时器检测到了外部时钟源的第二个上升沿假设没有对溢出进行分屏的话那么定时的时间就是5×65536假如对溢出进行分频的话并且假设是2分频定时的时间就会是5*2*65536。时基单元定时器当中的时基单元就是用来计数的只要是用到了定时器不管你使用到了定时器的计时功能还是输入捕获功能还是输入比较功能都得要这个时基单元进行计数。 时基单元就是那个计数器CNT是定时器的心脏是所有高级功能PWM、输入捕获、输出比较的基石。定时器进行定时的功能的时候cnt就是在加11这样的。在定时器进行输出比较功能的时候cnt就是当CT加到特定的数值的时候波形就会改变。基本定时器主从触发DAC它能让内部硬件在不受程序的控制下实现自动运行会极大减轻CPU的负担在使用DAC的时候可能会用DAC输出一段波形那就需要每隔一段时间来触发一次DAC让它输出下一个电压点如果按正常思路实现的话就是先设置一个定时器产生中断每隔一段时间在中断程序中调用代码手动触发一次DAC转换然后DAC输出这样会使主程序处于频繁被中断的状态会影响主程序的运行和其他中断的响应。使用主模式可以把定时器的更新事件映射到触发输出TRGO的位置然后TRGO直接接到DAC的触发转换引脚上这样定时器的更新就不需要再通过中断来触发DAC转换了整个过程不需要软件的参与实现了硬件的自动化通用定时器简单定时器级联比如可以先初始化TIM3然后使用主模式把他的更新事件映射到TRGO上接着再初始化TIM2选择的是ITR2对应的就是TIM3的TRGO然后后面再选择时钟为外部时钟模式1这样TIM3的更新事件就可以驱动TIM2的实际单元也就实现了定时器的级联定时器级联代码的实现#include stm32f10x.h /** * brief 初始化TIM3作为主定时器产生更新事件到TRGO * note TIM3的更新事件将作为TIM2的时钟源 */ void TIM3_Master_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 开启TIM3时钟APB1总线最大时钟频率72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3基本配置 TIM_TimeBaseInitStructure.TIM_Period 999; // 自动重装载值计数到999产生更新事件 TIM_TimeBaseInitStructure.TIM_Prescaler 7199; // 预分频器7200分频 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频不分频 TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器高级定时器用 TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure); // 初始化TIM3时基单元 // 配置TIM3为主模式将更新事件映射到TRGO触发输出 // TRGO信号将连接到TIM2的触发输入 TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); // 使能TIM3计数器开始工作 TIM_Cmd(TIM3, ENABLE); } /** * brief 初始化TIM2作为从定时器使用TIM3的TRGO作为时钟源 * note TIM2工作在从模式时钟由TIM3的更新事件提供 */ void TIM2_Slave_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 开启TIM2时钟APB1总线 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2基本配置 TIM_TimeBaseInitStructure.TIM_Period 65535; // 最大自动重装载值提供更长的定时周期 TIM_TimeBaseInitStructure.TIM_Prescaler 0; // 预分频器为0不分频 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频不分频 TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器 TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); // 初始化TIM2时基单元 // 选择ITR2作为触发输入TIM3的TRGO对应内部触发输入ITR2 // ITR2是TIM2的内部触发源2对应TIM3的TRGO输出 TIM_SelectInputTrigger(TIM2, TIM_TS_ITR2); // 设置TIM2为从模式选择外部时钟模式1 // 在此模式下TIM2使用TIM3的TRGO作为时钟源 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); // 使能TIM2计数器开始工作 TIM_Cmd(TIM2, ENABLE); } /** * brief 配置TIM2更新中断 * note 当TIM2计数溢出时会产生更新中断 */ void TIM2_Interrupt_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; // 配置NVIC嵌套向量中断控制器 NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn; // TIM2中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; // 抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; // 子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; // 使能该中断通道 NVIC_Init(NVIC_InitStructure); // 初始化NVIC // 使能TIM2更新中断当计数器溢出时产生中断 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); } /** * brief 主函数 * note 程序入口初始化系统后进入主循环 */ int main(void) { // 系统时钟初始化根据实际配置通常设置为72MHz SystemInit(); // 先初始化主定时器TIM3必须先初始化主定时器 TIM3_Master_Config(); // 再初始化从定时器TIM2TIM2依赖TIM3的触发信号 TIM2_Slave_Config(); // 如果需要中断配置TIM2中断 TIM2_Interrupt_Config(); // 主循环 while(1) { // 此处可以添加其他应用程序代码 // TIM2的中断服务函数会处理定时事件 } } /** * brief TIM2中断服务函数 * note 当TIM2发生更新中断时自动调用此函数 */ void TIM2_IRQHandler(void) { // 检查是否是更新中断计数器溢出 if (TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) { // 处理TIM2更新事件 // 这里可以添加你的处理代码例如 // - 翻转LED灯 // - 执行定时任务 // - 更新显示内容等 // 清除TIM2更新中断标志位 // 注意必须清除标志位否则会持续进入中断 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } /** * 定时器级联工作原理说明 * * 1. TIM3配置 * - 时钟源内部时钟72MHz * - 分频7200分频 → 10kHz * - 周期1000次计数 → 更新频率10Hz100ms一次 * - 每次更新事件产生TRGO输出 * * 2. TIM2配置 * - 时钟源TIM3的TRGO10Hz * - 不分频直接计数 * - 周期65536次计数 → 约6553.6秒溢出一次 * * 3. 级联效果 * - TIM3每100ms产生一次更新事件 * - 每个更新事件使TIM2计数一次 * - TIM2约每6553.6秒产生一次更新中断 * - 实现了长周期定时功能 */外部时钟模式1用内部时钟初始化代码/** * brief 配置TIM3使用内部时钟源并初始化基本参数 * param 无 * retval 无 */ void TIM3_InternalClock_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 1. 开启TIM3的时钟挂在APB1总线上 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 2. 配置定时器基本参数 TIM_TimeBaseInitStructure.TIM_Period 999; // 自动重装载值 (ARR)计数到10000-999产生更新 TIM_TimeBaseInitStructure.TIM_Prescaler 7199; // 预分频器 (PSC)7200分频 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频与内部时钟无关用于滤波器 TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 重复计数器高级定时器特有通用定时器写0即可 // 【核心】此函数调用后TIM3默认就使用内部时钟源但计数器还未启动 TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure); // 修正参数前应加 // 3. 可选清除更新中断标志避免首次进入中断 TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 4. 使能TIM3的计数器定时器开始根据内部时钟计数 TIM_Cmd(TIM3, ENABLE); }定时器输入通道1TI1FP1:/** * brief 配置TIM3使用外部时钟模式1时钟源为TI1FP1TIM3_CH1引脚 * param 无 * retval 无 */ void TIM3_ExternalClock_TI1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; // 1. 开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA时钟TIM3_CH1在PA6引脚 // 2. 配置GPIO引脚PA6作为TIM3_CH1输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; // TIM3_CH1对应PA6引脚 GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD; // 下拉输入根据外部信号选择 // GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入也可用 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 初始化定时器基本参数注意此时钟参数基于外部时钟计算 TIM_TimeBaseInitStructure.TIM_Period 0xFFFF; // 自动重装载值根据需要设置 TIM_TimeBaseInitStructure.TIM_Prescaler 0; // 预分频器不分频每个外部脉冲计数1次 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; // 高级定时器用TIM3写0 TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure); // 4. 配置输入通道1建立TI1到TI1FP1的信号路径 TIM_ICInitStructure.TIM_Channel TIM_Channel_1; // 通道1 TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; // 选择上升沿有效 TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; // 直接映射到TI1输入 TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; // 不分频每个边沿都检测 TIM_ICInitStructure.TIM_ICFilter 0x0; // 不滤波 TIM_ICInit(TIM3, TIM_ICInitStructure); // 5. 【核心配置】选择触发源为TI1FP1 TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // 6. 【核心配置】设置为外部时钟模式1 TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // 7. 使能定时器开始等待外部时钟脉冲 TIM_Cmd(TIM3, ENABLE); }定时器的TRGO作为时钟源/** * brief 配置TIM2为主定时器产生TRGO信号 * param 无 * retval 无 */ void TIM2_Master_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 1. 开启TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 2. 配置TIM2基本参数使用内部时钟 TIM_TimeBaseInitStructure.TIM_Period 999; // 自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler 7199; // 预分频器72MHz/720010kHz TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); // 3. 【关键】配置TIM2为主模式将更新事件映射到TRGO输出 TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // 4. 使能TIM2 TIM_Cmd(TIM2, ENABLE); } /** * brief 配置TIM3为从定时器使用TIM2的TRGO作为时钟源 * param 无 * retval 无 */ void TIM3_Slave_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 1. 开启TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 2. 配置TIM3基本参数参数基于TRGO频率计算 TIM_TimeBaseInitStructure.TIM_Period 99; // 自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler 0; // 预分频器不分频 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure); // 3. 【关键】选择内部触发源ITR // 需要查阅芯片数据手册的内部触发连接表 // 对于STM32F1TIM2的TRGO通常连接到TIM3的ITR0 TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0); // 4. 【关键】设置为外部时钟模式1 TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // 5. 使能TIM3开始等待TIM2的TRGO脉冲 TIM_Cmd(TIM3, ENABLE); } /** * brief 主函数中调用顺序 */ int main(void) { // 初始化系统时钟等... TIM2_Master_Config(); // 先配置主定时器 TIM3_Slave_Config(); // 再配置从定时器 while(1) { // 可以通过读取TIM3-CNT来验证计数 } }定时器输入通道2TI2FP2/** * brief 配置TIM3使用外部时钟模式1时钟源为TI2FP2TIM3_CH2引脚 * param 无 * retval 无 */ void TIM3_ExternalClock_TI2_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; // 1. 开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA时钟TIM3_CH2在PA7引脚 // 2. 配置GPIO引脚PA7作为TIM3_CH2输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_7; // TIM3_CH2对应PA7引脚 GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD; // 下拉输入根据外部信号选择 // GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入也可用 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 初始化定时器基本参数 TIM_TimeBaseInitStructure.TIM_Period 0xFFFF; // 自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler 0; // 预分频器不分频 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure); // 4. 配置输入通道2建立TI2到TI2FP2的信号路径 TIM_ICInitStructure.TIM_Channel TIM_Channel_2; // 【改为通道2】 TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; // 选择上升沿有效 TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; // 直接映射到TI2输入 TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; // 不分频 TIM_ICInitStructure.TIM_ICFilter 0x0; // 不滤波 TIM_ICInit(TIM3, TIM_ICInitStructure); // 5. 【核心改变】触发源改为TI2FP2 TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); // 6. 设置为外部时钟模式1 TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1); // 7. 使能定时器外部触发输入ETR:/** * brief 配置TIM3使用外部时钟模式2时钟源为ETR引脚 * param 无 * retval 无 */ void TIM3_ExternalClock_ETR_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 1. 开启时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟TIM3_ETR在PB5引脚以STM32F103为例 // 2. 配置GPIO引脚PB5作为TIM3_ETR输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_5; // TIM3_ETR对应PB5引脚请查阅具体芯片数据手册 GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入 // GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; // 上拉输入根据外部信号驱动能力选择 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // 3. 初始化定时器基本参数 TIM_TimeBaseInitStructure.TIM_Period 0xFFFF; // 自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler 0; // 预分频器ETR脉冲直接驱动计数器 TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure); // 4. 【核心配置】配置ETR引脚参数 // 参数定时器ETR预分频器ETR极性ETR滤波器 TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, // ETR预分频器关闭每个ETR脉冲计数1次 TIM_ExtTRGPolarity_NonInverted, // ETR极性不反相上升沿有效 0x0); // ETR滤波器不滤波 // 5. 使能定时器开始等待ETR引脚脉冲 TIM_Cmd(TIM3, ENABLE); }注意我要是想用内部时钟的话只需要软件上进行配置就可以但是我想要外部时钟的话比如etr2的话就需要在某一个引脚上面去。传递脉冲波还有就是输入捕获通道一的话也得给这个通道一传递一个脉冲波这时候定时器才能进行开启时钟。外部模式1的情况中定时器输入通道1TI1FP1 、定时器输入通道2TI2FP2 外部触发输入ETR是需要用到外部的引脚的但是定时器的TRGO作为时钟源时内部连接的用不到引脚。高级定时器预分频时序公式
http://www.gsyq.cn/news/1352585.html

相关文章:

  • 解决Keil C166工具链版本兼容性问题
  • AndroidWheelView性能优化:避免滑动冲突与内存泄漏的7个技巧
  • Schwinger模型与轴子物理:对称性破缺的数值研究
  • 基于视觉预测的无线网络资源调度:从CV/RNN到URLLC与eMBB协同优化
  • 傲梅分区助手下载安装教程和扩容C盘分区调整教程 (附安装包)
  • 微信小程序 思政考核管理系统
  • 使用SW2000TSN增加激光雷达接入端口
  • Keil MDK中RETVAL文件读取错误的解决方案
  • 计算机视觉——九、图像分割
  • TCP MSS调整:嵌入式网络开发中的关键优化
  • 3D高斯泼溅技术实现实时4D天气模拟
  • ARM处理器命名后缀解析与技术演进
  • Shader Graph边缘光原理与实战:从菲涅尔效应到世界空间法线
  • HTML实现DOCX文档版题库图文考试系统(修订)
  • 个人投资助手Excel与通达信联动——多软件协同选股盯盘
  • 《Sysinternals实战指南》ZoomIt 学习笔记(11.12):LiveZoom 实时放大——无闪屏放大与多屏演示技巧
  • 《Sysinternals实战指南》ZoomIt 学习笔记(11.10):键入模式——在桌面上直接打字讲解的最佳实践
  • 企业直播核心功能深度指南:互动、录制与数据分析
  • 2026年照片去水印软件app排行榜|免费去水印工具实测推荐
  • prerender-loader完全指南:轻松实现Webpack预渲染提升首屏加载速度
  • 为什么选择SecHex-Spoofy?对比5款HWID工具,这款开源神器究竟强在哪里
  • 2026年企业网盘本地部署方案深度解析:6款主流产品技术架构与选型指南
  • ViMax时序连贯性保持:如何确保多镜头视频的时间线一致性
  • Vintageous高级玩法:自定义键映射与宏录制全攻略
  • AXI协议非安全可缓冲传输的安全处理机制
  • Awesome Yew完全指南:探索Rust WebAssembly前端开发的终极资源库
  • 解决国产手机权限适配难题:Permissions4M注解回调与Listener回调全解析
  • 2026年靠谱的温州卡包批量定做公司哪家好 - 品牌宣传支持者
  • 你的 FlashAttention 真的在跑吗?几个简单方法确认
  • nodejs后端服务如何接入taotoken实现异步调用多模型对话能力