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

普中STM32F103ZET6开发攻略(四)

接续上文:普中STM32F103ZET6开发攻略(三)-CSDN博客

点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!!

目录

接续上文:普中STM32F103ZET6开发攻略(三)-CSDN博客

4. 定时器中断实验

4.1 实验目的

4.2 实验原理

4.3 实验环境

4.4 实验思路

4.5 实验代码

4.6 实验思考与拓展

4.6.1 如何修改定时器参数,实现不同的闪烁频率?

4.6.2 如何使用不同的定时器(如 TIM2、TIM3)同时控制多个 LED?

4.6.3 如何实现两个 LED 交替闪烁的效果?

4.6.4 如何通过修改中断优先级,实现不同定时器中断间的优先级控制?

4.6.5 定时器中断与轮询延时方式控制 LED 闪烁各有什么优缺点?

4.6.6 如何利用定时器的 PWM 功能实现 LED 亮度渐变效果?

4.7 注意事项

一、核心概念区分

1. APB 总线时钟(PCLK)

2. 定时器时钟频率(TIMx_CLK)

二、定时器定时参数计算逻辑

定时时间计算公式:


4. 定时器中断实验

4.1 实验目的

  1. 熟悉STM32F10x微控制器的定时器中断系统结构和基本操作

  1. 掌握STM32标准库函数对定时器中断的配置方法

  1. 学会使用定时器中断方式控制LED闪烁

  1. 理解定时器参数计算、中断优先级设置和中断服务函数编写原则

4.2 实验原理

1. 定时器基本原理

STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。STM32的定时器系统可以按照预设的时间间隔产生中断,主要包括以下功能:

定时计数:可设置预分频系数和自动重装载值

触发中断:计数到达设定值时触发中断服务函数

多通道定时:拥有多个通道可独立配置

2. 通用定时器简介

STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能:

(1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

(2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。

(3)4个独立通道(TIMx_CH1-4),这些通道可以用来作为:

A.输入捕获

B.输出比较

C. PWM 生成(边缘或中间对齐模式)

D.单脉冲模式输出

(4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。

(5)发生如下事件时产生中断/DMA请求:

A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

C.输入捕获

D.输出比较

(6)支持针对定位的增量(正交)编码器和霍尔传感器电路

(7)触发输入作为外部时钟或者按周期的电流管理

3. 中断优先级控制

STM32微控制器通过嵌套向量中断控制器(NVIC)管理各种中断请求。中断优先级分为抢占优先级和响应优先级。抢占优先级决定是否可以打断当前正在执行的中断服务函数;响应先级决定同时发生的同级抢占优先级中断的执行顺序。

4. 定时器时钟来源与计算

STM32的定时器时钟与系统时钟密切相关,TIM2-TIM7连接在APB1总线上。当APB1分频系数为1时,定时器时钟等于APB1总线时钟;当APB1分频系数大于1时,定时器时钟等于APB1总线时钟的2倍。

定时时间计算公式:

其中,Tout为定时时间(秒),per为自动重装载值,psc为预分频系数,Tclk为定时器时钟频率(通常为72MHz)。

4.3 实验环境

  • 开发板:STM32F103ZET6

  • IDE:Keil MDK 5 /Visual Studio

  • 调试工具:CMSIS-DAP

4.4 实验思路

将上一个实验的外部中断控制改为定时器实现即可。

编写Time相关的头、源文件即可。

4.5 实验代码

time.h

#ifndef __TIME_H
#define __TIME_H
​
#include "stm32f10x.h"
​
void TIM3_Int_Init(uint16_t arr, uint16_t psc);  // TIM3 初始化
void TIM4_Int_Init(uint16_t arr, uint16_t psc);  // TIM4 初始化
​
#endif
​

time.c

#include "time.h"
#include "led.h"
​
void TIM3_Int_Init(uint16_t arr, uint16_t psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;
​RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
​TIM_TimeBaseStructure.TIM_Period = arr;        // 自动重装载值TIM_TimeBaseStructure.TIM_Prescaler = psc;     // 预分频系数TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
​TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);     // 允许更新中断TIM_Cmd(TIM3, ENABLE);                         // 启动定时器
​NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
​
void TIM4_Int_Init(uint16_t arr, uint16_t psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;
​RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
​TIM_TimeBaseStructure.TIM_Period = arr;TIM_TimeBaseStructure.TIM_Prescaler = psc;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
​TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);TIM_Cmd(TIM4, ENABLE);
​NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
​

以上关于定时器源文件的代码:

通过配置两个定时器(TIM3 和 TIM4),实现了两个独立的周期性中断源,可用于执行不同频率或优先级的任务。典型应用场景包括:

  • TIM3:按键扫描、低优先级定时任务。

  • TIM4:LED 闪烁控制、高优先级定时任务。

通过调整arrpsc参数,可灵活控制中断频率。

led.h

#ifndef __LED_H
#define __LED_H
​
#include "stm32f10x.h"
​
#define LED0_GPIO_PORT GPIOB
#define LED0_GPIO_PIN  GPIO_Pin_5 //LED0
​
#define LED1_GPIO_PORT GPIOE
#define LED1_GPIO_PIN  GPIO_Pin_5 //LED1
​
void LED_Init(void);
void LED0_TOGGLE(void);
void LED1_ON(void);
void LED1_OFF(void);
​
#endif
​

led.c

#include "led.h"
​
void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 开启 GPIOB 和 GPIOE 的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
​//配置PB5(LED0)GPIO_InitStructure.GPIO_Pin = LED0_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED0_GPIO_PORT, &GPIO_InitStructure);
​//配置PE5(LED1)GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
​//低电平输出GPIO_ResetBits(LED0_GPIO_PORT, LED0_GPIO_PIN);GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
}
​
void LED0_TOGGLE(void)
{LED0_GPIO_PORT->ODR ^= LED0_GPIO_PIN;
}
​
void LED1_ON(void)
{GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
}
​
void LED1_OFF(void)
{GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
}
​

实验现象:

  1. 将工程程序编译后下载到开发板内,可以看到 DS0 指示灯不断闪烁(闪烁频率不做要求),表示程序正常运行。DS1 指示灯每隔 500ms 状态取反一次,实现 1 秒钟闪烁一次。

  1. 修改 TIM4 初始化函数参数值,设定 1 秒钟的定时中断,让 DS1 指示灯 1 秒钟状态反转一次,实现 2 秒钟闪烁一次。

  1. 使用 TIM3 的更新中断控制 DS1 指示灯闪烁,闪烁时间自定义。

4.6 实验思考与拓展

4.6.1 如何修改定时器参数,实现不同的闪烁频率?

定时器的闪烁频率由 arr(自动重装载值)和 psc(预分频系数)决定。计算公式如下:

定时器时钟 = APB1时钟 × 2 = 72MHz  // 假设APB1分频系数为2
计数频率 = 定时器时钟 / (psc + 1)
中断周期 = (arr + 1) / 计数频率
闪烁频率 = 1 / (2 × 中断周期)  // 亮灭各一次

若要实现 1Hz 闪烁(亮 0.5 秒,灭 0.5 秒):

// 1Hz闪烁
void TIM3_Int_Init(void) {uint16_t arr = 35999;    // 自动重装载值uint16_t psc = 999;      // 预分频系数// 其他配置代码保持不变
}

计算过程

  1. 计数频率 = 72MHz / (999+1) = 72kHz

  2. 中断周期 = (35999+1) / 72kHz = 0.5 秒

  3. 闪烁频率 = 1 / (2×0.5 秒) = 1Hz

4.6.2 如何使用不同的定时器(如 TIM2、TIM3)同时控制多个 LED?

步骤

  1. 分别初始化不同定时器

    // 初始化TIM2控制LED1
    void TIM2_Int_Init(uint16_t arr, uint16_t psc) {// 配置TIM2,代码类似TIM3NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;// 其他配置...
    }
    ​
    // 初始化TIM3控制LED2
    void TIM3_Int_Init(uint16_t arr, uint16_t psc) {// 配置TIM3,代码类似之前
    }
  2. 编写独立的中断服务函数

    void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {LED1_Toggle();  // 切换LED1状态TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
    }
    ​
    void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {LED2_Toggle();  // 切换LED2状态TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
    }
  3. 在主函数中初始化两个定时器

    int main(void) {TIM2_Int_Init(35999, 999);  // 1HzTIM3_Int_Init(17999, 999);  // 2Hzwhile(1);
    }
4.6.3 如何实现两个 LED 交替闪烁的效果?

方法一:使用单个定时器,在中断中交替控制两个 LED:

uint8_t led_state = 0;
​
void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {if (led_state == 0) {LED1_On();LED2_Off();} else {LED1_Off();LED2_On();}led_state = !led_state;  // 切换状态TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}

方法二:使用两个定时器,配置相同频率但相位差 180°:

// TIM2初始化(控制LED1)
void TIM2_Int_Init(void) {// 配置TIM2,启动后立即计数
}
​
// TIM3初始化(控制LED2)
void TIM3_Int_Init(void) {// 配置TIM3,但延迟启动(例如在main中延时后启动)HAL_Delay(500);  // 延迟0.5秒TIM_Cmd(TIM3, ENABLE);
}

4.6.4 如何通过修改中断优先级,实现不同定时器中断间的优先级控制?

步骤

  1. 配置优先级分组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // 2位抢占+2位子优先级
  2. 设置不同的抢占优先级

    // TIM2(高优先级)
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  // 最高抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    ​
    // TIM3(低优先级)
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  // 次高抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

规则

  • 抢占优先级高的中断可打断低优先级中断。

  • 抢占优先级相同的中断按子优先级排序,但不能互相打断。

4.6.5 定时器中断与轮询延时方式控制 LED 闪烁各有什么优缺点?
特性定时器中断轮询延时
CPU 占用空闲时不占用 CPU延时期间 CPU 被阻塞
响应速度即时响应其他事件延时期间无法响应其他事件
精度由定时器时钟决定,精度高受系统负载影响,精度低
多任务支持可并行处理多个任务难以同时执行其他任务
资源消耗需要配置定时器和中断仅需简单循环

推荐使用定时器中断的场景

  • 需要高精度定时(如 PWM 控制、通信协议)。

  • 低功耗设计(中断唤醒,平时休眠)。

  • 同时处理多个任务(如按键检测与 LED 控制)。

4.6.6 如何利用定时器的 PWM 功能实现 LED 亮度渐变效果?

步骤

  1. 配置定时器为 PWM 模式

    void TIM3_PWM_Init(uint16_t arr, uint16_t psc) {TIM_OCInitTypeDef TIM_OCInitStructure;// 基本定时器配置(同前)// ...// PWM模式配置TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;  // 初始占空比TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM3, &TIM_OCInitStructure);  // 配置通道1TIM_Cmd(TIM3, ENABLE);  // 启动定时器
    }
  2. 在主循环中调整占空比

    int main(void) {uint16_t pulse_val = 0;uint8_t direction = 1;  // 1: 增加,0: 减少TIM3_PWM_Init(999, 71);  // 1kHz PWM频率while(1) {if (direction) {pulse_val++;  // 增加亮度if (pulse_val >= 1000) direction = 0;} else {pulse_val--;  // 减少亮度if (pulse_val == 0) direction = 1;}TIM_SetCompare1(TIM3, pulse_val);  // 更新占空比HAL_Delay(5);  // 延时控制渐变速度}
    }

效果

  • 占空比从 0% 到 100% 逐渐变化,LED 亮度从暗到亮再到暗循环。

  • 通过调整arrpsc可改变 PWM 频率,影响 LED 闪烁效果。

4.7 注意事项

  1. 定时器初始化前必须先使能相应的定时器时钟

  1. 中断服务函数中必须清除中断标志位,否则会造成中断反复触发

  1. 定时器参数计算需考虑时钟频率与所需时间的关系

    定时时间计算公式:

  1. 中断服务函数应尽量简短,避免长时间占用CPU

  1. 使用标准库函数时,需要注意头文件的包含和依赖关系

  1. 避免在中断服务函数中使用过长的延时函数

  1. 注意区分定时器时钟频率与APB总线时钟的关系,正确计算定时参数

一、核心概念区分
1. APB 总线时钟(PCLK)
  • 定义:APB(Advanced Peripheral Bus)是微控制器中连接低速外设(如定时器、UART、I2C 等)的总线,其时钟频率由系统时钟(如 HSI、HSE)分频得到。

  • 分类:

    • APB1:通常用于低速外设(如 TIM2~TIM7),最大频率一般≤36MHz(不同芯片型号可能不同)。

    • APB2:用于高速外设(如 TIM1、TIM8 等高级定时器),最大频率可达系统时钟频率(如 72MHz)。

  • 来源:系统时钟经AHB 总线分频器分频后,再经APB 预分频器得到 PCLK1(APB1)和 PCLK2(APB2)。

2. 定时器时钟频率(TIMx_CLK)
  • 定义:定时器实际运行的时钟频率,直接决定定时器的计数速度。

  • 来源:

    • 对于基本定时器(如 TIM6、TIM7)*和*通用定时器(如 TIM2~TIM5): 定时器时钟频率 TIMx_CLK = PCLKx × 2(当 APB 预分频系数≠1 时),或 TIMx_CLK = PCLKx(当 APB 预分频系数 = 1 时)。 这是因为 STM32 的定时器在 APB 总线预分频系数不为 1 时,会自动将时钟频率加倍(补偿机制)。

    • 对于高级定时器(如 TIM1、TIM8): 定时器时钟频率 TIMx_CLK = PCLKx(无论 APB 预分频系数是否为 1)。

二、定时器定时参数计算逻辑

定时器的核心参数包括:

  • 预分频器(PSC):对定时器时钟频率进行分频,得到计数时钟频率。

  • 自动重装载值(ARR):计数器从 0 开始向上计数,达到 ARR 值后触发中断或事件。

定时时间计算公式:
  • 参数说明:

    • (TIMx_CLK):定时器时钟频率(单位:Hz)。

    • PSC:预分频器值(寄存器中写入的是 PSC 值,实际分频系数为 PSC+1)。

    • ARR:自动重装载值(实际计数周期为 ARR+1)。因为是从0开始计数的。

       

      文章有写的不当的地方,欢迎在评论区中指正修改。如果感觉文章实用对你有帮助,欢迎点赞收藏和关注,你的点赞关注就是我动力,大家一起学习进步。

      有不懂的可以在评论区里提出来哟,博主看见后会及时回答的。

相关文章:

普中STM32F103ZET6开发攻略(四)

接续上文:普中STM32F103ZET6开发攻略(三)-CSDN博客 点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 目录 接续上文:普中STM32F103ZET6开发攻略&am…...

ck-editor5的研究 (5):优化-页面离开时提醒保存,顺便了解一下 Editor的生命周期 和 6大编辑器类型

前言 经过前面的 4 篇内容,我们已经慢慢对 CKEditor5 熟悉起来了。这篇文章,我们就来做一个优化,顺便再补几个知识点: 当用户离开时页面时,提醒他保存数据了解一下 CKEditor5 的 六大编辑器类型了解一下 editor 实例对…...

[3D GISMesh]三角网格模型中的孔洞修补算法

📐 三维网格模型空洞修复技术详解 三维网格模型在扫描、重建或传输过程中常因遮挡、噪声或数据丢失产生空洞(即边界非闭合区域),影响模型的完整性与可用性。空洞修复(Hole Filling)是计算机图形学和几何处…...

11.2 java语言执行浅析3美团面试追魂七连问

美团面试追魂七连问:关于Object o New Object() ,1请解释一下对象的创建过程(半初始化) 2,加问DCL要不要volatile 问题(指令重排) 3.对象在内存中的存储布局(对象与数组的存储不同),4.对象头具体包括什么.5.对象怎么定位.6.对象怎么分配(栈-线程本地-Eden-Old)7.在…...

MySQL 全量、增量备份与恢复

一.MySQL 数据库备份概述 备份的主要目的是灾难恢复,备份还可以测试应用、回滚数据修改、查询历史数据、审计等。之前已经学习过如何安装 MySQL,本小节将从生产运维的角度了解备份恢复的分类与方法。 1 数据备份的重要性 在企业中数据的价值至关…...

【25.06】FISCOBCOS使用caliper自定义测试 通过webase 单机四节点 helloworld等进行测试

前置条件 安装一个Ubuntu20+的镜像 基础环境安装 Git cURL vim jq sudo apt install -y git curl vim jq Docker和Docker-compose 这个命令会自动安装docker sudo apt install docker-compose sudo chmod +x /usr/bin/docker-compose docker versiondocker-compose vers…...

MonoPCC:用于内窥镜图像单目深度估计的光度不变循环约束|文献速递-深度学习医疗AI最新文献

Title 题目 MonoPCC: Photometric-invariant cycle constraint for monocular depth estimation of endoscopic images MonoPCC:用于内窥镜图像单目深度估计的光度不变循环约束 01 文献速递介绍 单目内窥镜是胃肠诊断和手术的关键医学成像工具,但其…...

如何计算H5页面加载时的白屏时间

计算 H5 页面加载时的 白屏时间(First Paint Time)是前端性能优化的重要指标,通常指从用户发起页面请求到浏览器首次渲染像素(如背景色、文字等)的时间。以下是几种常用的计算方法: 1. 使用 Performance AP…...

SpringAI系列 - MCP篇(三) - MCP Client Boot Starter

目录 一、Spring AI Mcp集成二、Spring AI MCP Client Stater三、spring-ai-starter-mcp-client-webflux集成示例3.1 maven依赖3.2 配置说明3.3 集成Tools四、通过SSE连接MCP Server五、通过STDIO连接MCP Server六、通过JSON文件配置STDIO连接一、Spring AI Mcp集成 Spring AI…...

【深度学习新浪潮】以Dify为例的大模型平台的对比分析

我们从核心功能、适用群体、易用性、可扩展性和安全性五个维度展开对比分析: 一、核心功能对比 平台核心功能多模型支持插件与工具链Dify低代码开发、RAG增强、Agent自律执行、企业级安全支持GPT-4/5、Claude、Llama3、Gemini及开源模型(如Qwen-VL-72B),支持混合模型组合可…...

Asp.net core 使用EntityFrame Work

安装以下Nuget 包 Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Design Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer或者Npgsql.EntityFrameworkCore.PostgreSQL 安装完上述Nuget包之后,在appset…...

isp中的 ISO代表什么意思

isp中的 ISO代表什么意思 在摄影和图像信号处理(ISP,Image Signal Processor)领域,ISO是一个用于衡量相机图像传感器对光线敏感度的标准参数。它最初源于胶片摄影时代的 “国际标准化组织(International Organization …...

AI Coding 资讯 2025-06-03

Prompt工程 RAG-MCP:突破大模型工具调用瓶颈,告别Prompt膨胀 大语言模型(LLM)在工具调用时面临Prompt膨胀和决策过载两大核心挑战。RAG-MCP创新性地引入检索增强生成技术,通过外部工具向量索引和动态检索机制,仅将最相关的工具信…...

2024年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:最近的斐波那契数 斐波那契数列 Fn 的定义为:对 n ≥ 0 有 Fn+2 = Fn+1 + Fn,初始值为 F0 = 0 和 F1 = 1。所谓与给定的整数 N 最近的斐波那契数是指与 N 的差之绝对值最小的斐波那契数。 本题就请你为任意给定的整数 N 找出与之最…...

3d GIS数据来源与编辑工具

1、卫星遥感 2、航空摄影测量 3、地面实测技术 全站仪 3维扫描 3D GIS数据制作全流程详解 一、数据采集:多源数据获取 3D GIS数据的制作需从多维度采集地理空间信息,以下是主要采集方式及适用场景: (一)遥感与航测…...

NeRF PyTorch 源码解读 - 体渲染

文章目录 1. 体渲染公式推导1.1. T ( t ) T(t) T(t) 的推导1.2. C ( r ) C(r) C(r) 的推导 2. 体渲染公式离散化3. 代码解读 1. 体渲染公式推导 如下图所示,渲染图像上点 P P P 的颜色值 c c c 是累加射线 O P → \overrightarrow{OP} OP 在近平面和远平面范围…...

SpringBoot 数据库批量导入导出 Xlsx文件的导入与导出 全量导出 数据库导出表格 数据处理 外部数据

介绍 poi-ooxml 是 Apache POI 项目中的一个库,专门用于处理 Microsoft Office 2007 及以后版本的文件,特别是 Excel 文件(.xlsx 格式)和 Word 文件(.docx 格式)。 在管理系统中需要对数据库的数据进行导…...

解决:install via Git URL失败的问题

为解决install via Git URL失败的问题,修改安全等级security_level的config.ini文件,路径如下: 还要重启: 1.reset 2.F5刷新页面 3.关机服务器,再开机(你也可以省略,试试) 4.Wind…...

OpenCV CUDA模块特征检测------创建Harris角点检测器的GPU实现接口cv::cuda::createHarrisCorner

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数创建一个 基于 Harris 算法的角点响应计算对象,专门用于在 GPU 上进行高效计算。 它返回的是一个 cv::Ptrcv::cuda::Cornernes…...

【氮化镓】钝化层对p-GaN HEMT阈值电压的影响

2021年5月13日,中国台湾阳明交通大学的Shun-Wei Tang等人在《Microelectronics Reliability》期刊发表了题为《Investigation of the passivation-induced VTH shift in p-GaN HEMTs with Au-free gate-first process》的文章。该研究基于二次离子质谱(SIMS)、光致发光(PL)…...

C++:优先级队列

目录 1. 概念 2. 特征 3. 优先级队列的使用 1. 概念 优先级队列虽然名字有队列二字,但根据队列特性来说优先级队列不满足先进先出这个特征,优先级队列的底层是用堆来实现的。 优先级队列是一种容器适配器,就是将特定容器类封装作为其底层…...

睡眠分期 html

截图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>睡眠图表</title><script src…...

Java求职者面试:Spring、Spring Boot、Spring MVC与MyBatis技术深度解析

Java求职者面试&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术深度解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释什么是Spring框架&#xff1f;它的核心功能是什么&#xff1f; JY&#xff1a;Spring是一个开源的Java/Java EE企业级应用开…...

Github 2025-05-29 Go开源项目日报Top9

根据Github Trendings的统计,今日(2025-05-29统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9Assembly项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:27…...

前端项目种对某个文件夹进行大小写更改,git识别不到差异导致无变化

问题背景 开发过程中可能遇到一个文件名要更改大小写&#xff0c;但是更改后之后本地会有变化&#xff0c;但是git识别不到差异化&#xff0c;正常去更改一个文件名称git差异化会出现删除了原有文件,新增了一个新文件,但是更改大小写则不会 如何解决 在终端中输入git config…...

AWS VPC 网络详解:理解云上专属内网的关键要素

全面解读 AWS VPC、子网、安全组、路由与 NAT 网关的实际应用 在使用 AWS 云服务的过程中&#xff0c;许多用户最先接触的是 EC2&#xff08;云服务器&#xff09;。但你是否曾遇到过这样的情况&#xff1a;实例启动正常&#xff0c;却无法访问公网&#xff1f;或者数据库无法…...

Ubuntu24.04.2 + kubectl1.33.1 + containerdv1.7.27 + calicov3.30.0

Ubuntu24.04.2 kubectl1.33.1 containerdv1.7.27 calicov3.30.0 安装Ubuntu24.04.2 kubectl1.33.1 containerdv1.7.27 calicov3.30.0 1.安装Ubuntu24.04.2&#xff0c;设置阿里云镜像地址 $ sudo vim /etc/apt/sources.list.d/ubuntu.sources URIs: https://mirrors.aliy…...

循环神经网络(RNN)全面教程:从原理到实践

循环神经网络(RNN)全面教程&#xff1a;从原理到实践 引言 循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典神经网络架构&#xff0c;在自然语言处理、语音识别、时间序列预测等领域有着广泛应用。本文将系统介绍RNN的核心概念、常见变体、实现方法以及实际…...

uniapp 键盘顶起页面问题

关于uniapp中键盘顶起页面的问题。这是一个在移动应用开发中常见的问题&#xff0c;特别是当输入框位于页面底部时&#xff0c;键盘弹出会顶起整个页面&#xff0c;导致页面布局错乱。 pages.json 文件内&#xff0c;在需要处理软键盘的页面添加 softinputMode 配置&#xff1…...

利用TOA与最小二乘法直接求解

为了利用到达时间&#xff08;TOA&#xff09;和最小二乘法直接求解&#xff0c;我们首先需要理解TOA定位的基本原理和最小二乘法的应用。 步骤1: 理解TOA定位原理 到达时间&#xff08;TOA&#xff09;定位是通过测量信号从发射源到达接收器的时间来确定位置的一种方法。假设…...