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

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器(一) - 基本定时器知识

在这里插入图片描述

这节开始学习一下TIM定时器功能,从字面意思上理解,定时器的基本功能就是用来定时,与定时器相结合,可以实现一些周期性的数据发送、采集等功能,比如定时发送USART数据、ADC定时采集数据、与GPIO结合测量信号输入脉宽以及产生输出波形,常用的PWM波控制电机就是定时器的一种应用。

在STM32F42xxx系列控制器中,有2个高级控制定时器、10个通用定时器和2个基本定时器以及2个看门狗定时器。控制器上所有定时器都是彼此独立,不共享任何资源。高级控制定时器包含通用定时器的所有功能,通用定时器包含基本定时器的所有功能。其特性参见下表:

定时器类型Timer计数器分辨率计数器类型预分频系数DMA请求生成捕获/比较通道互补输入最大接口时钟(MHz)最大定时器时钟(MHz)
高级控制TIM116位递增、递减、递增/递减1~65536490(APB2)180
通用TIM232位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM316位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM416位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM532位递增、递减、递增/递减1~65536445(APB1)90/180
基本TIM616位递增1~65536045(APB1)90/180
基本TIM716位递增1~65536045(APB1)90/180
高级控制TIM816位递增、递减、递增/递减1~65536490(APB2)180
通用TIM916位递增1~65536290(APB1)180
通用TIM1016位递增1~65536190(APB1)180
通用TIM1116位递增1~65536190(APB1)180
通用TIM1216位递增1~65536245(APB1)90/180
通用TIM1316位递增1~65536145(APB1)90/180
通用TIM1416位递增1~65536145(APB1)90/180

这里需要注意,所有定时机器预分频系数都是在1~65536之间取值,且都为整数。最大定时器时钟可以通过RCC_DCKCFGR寄存器进行配置,可配置值为90/180MHz。

一、基本定时器功能框图

基本定时器的功能框图包含了基本定时器最核心的内容,其结构如下图:

在这里插入图片描述

在上图中,绿框中是对定时器的图标解释,黑框带阴影方框中,方框内容一般为寄存器名称,比如上面的自动重载寄存器(TIMx_ARR)和PSC(TIMx_PSC)预分频寄存器,方框加阴影效果主要是为了突出表示该寄存后面还有一个寄存器,只是这个寄存器我们无法进行操作,这里我们称之为影子寄存器,而上面我们可以操作的寄存器我们称之为源寄存器。影子寄存器是在程序运行时真正起到作用的,源寄存器只是给我们提供读写功能,当特定事件发生时,才会把源寄存器的值拷贝给其影子寄存器。多个影子寄存器一起使用可以达到同步更新多个寄存器内容。

下面向下趋势的折线箭头表示为一个事件,向上趋势的这下箭头表示中断和DMA输出,以上图为例,在自动重载寄存器左侧带有字母“U”的是按图标,表示在更新事件生成时就把自动重载寄存器内容拷贝到影子寄存器内,寄存器右边的时间图标、中断和DMA输出图标表示在自动重载寄存器与计数器寄存器值相等时生成事件、中断和DMA输出。

在了解图示图标后,下来我们逐项分析下基本定时器框图:

1、时钟源

既然要实现定时的功能,就必须要给定时器提供时钟源实现计数,基本定时器时钟只能使用内部时钟,而高级和通用定时器可以选择外部时钟源或者其他定时器等待模式。可以通过RCC专用始终配置寄存器(RCC_DCKCFGR)的TIMPRE位设置所有定时器的时钟频率,一般改为设置为默认值0。从而使得上面表中的可选最大定时器时钟为90MHz,即基本定时器的内部时钟CK_INT频率为90MHz。

基本定时器只能使用内部时钟,当TIM6和TIM7控制寄存器1(TIMx_CR1)的GEN位置1时,启动基本定时器,并且预分频器的始终来源位CK_INT。

2、控制器

控制器用于控制实现定时器功能,控制其复位、使能、计数等其基础功能,基本定时器还专门用于DAC转换触发。

3、计数器

基本定时器计数过程中主要针对三界寄存器,分别位计数器寄存器TIMx_CNT、预分频器寄存器TIMx_PSC、自动重载寄存器TIMx_ARR,这三个寄存器均为16位有效位,可以设置的值为0~65535。

预分频寄存器PSC:预分频器PSC有一个输入时钟CK_PSC和一个输出时钟CK_CNT,输入时钟CK_PSC来源于控制器,基本定时器只有内部时钟源,所以CK_PSC实际等于CK_INT,即90MHz。当需要不同的定时频率时,可以通过设置预分频器PSC的值可以得到不同的时钟输出CK_CNT,计算公式如下:
f C K C N T = f C K P S C / ( P S C [ 15 : 0 ] + 1 ) fCKCNT = fCKPSC/(PSC[15:0]+1) fCKCNT=fCKPSC/(PSC[15:0]+1)
在这里插入图片描述

上图中明确表示了将预分频从1改为4时计数器变化过程,在1分频时,CK_PSC和CK_CNT频率相同。向TIMx_PSC寄存器写入新值时,并不会马上更新CK_CNT的输出频率,需要等到更新事件发生时,把TIMx_PSC寄存器值更新到影子寄存器中,才能产生效果。当更新为4分频后,CK_PSC每产生4个脉冲时,CK_CNT才会产生1个脉冲。

当定时器使能时(CNT_EN = 1),计数器COUNTER根据CK_CNT的频率向上计数,意思就是当CK_CNT每产生一个脉冲,TIMx_CNT的值就累加1。当TIMx_CNT的值与TIMx_ARR的值一致时会自动生成事件,并且TIMx_CNT自动清零,然后开始下一轮计数,如此往复。

因此我们只需要设置CK_PSC和TIMx_ARR这两个寄存器的值,就可以控制事件生成的事件,一般的应用程序就是在事件生成的会点函数中运行,在TIMx_CNT递增至TIMx_ARR值相等时,我们称之为定时器上溢。

自动重载寄存器TIMx_ARR用于存放与计数器值比较的数值(设定值),如果两个数值相等就生成事件,将相关事件标志位置位,生成DMA和中断输出。TIMx_ARR有影子寄存器,可通过RIMx_CR1寄存器的ARPE位控制影子寄存器功能,如果ARPE位置1,影子寄存器有效,当且只有事件更新时,才会将TIMx_ARR值赋值给影子寄存器,如果ARPE位为0,修改TIMx_ARR值则可以马上生效。

4、定时器周期计算

通过上面的内容,我们直到定时时间生成时间主要由TIMx_PSC和TIMx_ARR两个寄存器值决定,这个称之为定时器的周期。假如我们需要一个1s周期的定时器,该如何设置这两个寄存器的值呢?

假设我们先设置TIMx_ARR寄存器的值为9999,则表示当TIMx_CNT从0开始计数,当累加到9999个脉冲后,生成事件,合计就是10000次,那么如果此时时钟源周期为100us,就刚好得到了1s的定时周期。

如此我们只需要关注如何设置TIMx_PSC寄存器值,使得CK_CNT输出为100us(1/0.0001 = 10000Hz)周期的时钟即可。预分频的输入时钟CK_PSC为90Mhz,根据上面提供的CK_CNT计算公式得到PSC = 90MHz / 10000Hz - 1 = 9000 - 1 = 8999。

OK,定时器的基本内容学习完了,下来就是了解一下与定时器相关的结构体了。

二、定时器相关结构体

标准库中对定时器外设建立了四个初始化结构体,其中基本定时只用到一个,即TIM_TimeBaseInitTypeDef,该结构体成员用于设置定时器基本工作参数,并由定时器基本初始化配置函数TIM_TimeBaseInit调用。

TIM_TimeBaseInitTypeDef结构体定义在stm32f4xx_tim.h中,TIM_TimeBaseInit函数定义在stm32f4xx_tim.c中,首先我们先看一下TIM_TimeBaseInitTypeDef结构体定义:

typedef struct {uint16_t TIM_Prescaler; 			// 预分频器uint16_t TIM_CounterMode; 			// 计数模式uint32_t TIM_Period; 			    // 定时器周期uint16_t TIM_ClockDivision; 		// 时钟分频uint8_t TIM_RepetitionCounter; 		// 重复计算器
} TIM_TimeBaseInitTypeDef;

定时器预分频器TIM_Prescaler:时钟源经过该分频器之后输出的才是定时器时钟,该值设置的为TIM_PSC寄存器的值,可设置范围为065535,可实现165536分频。

定时器计数模式TIM_CounterMode:可视之为向上计数、向下计数以及三种中心对其模式,基本定时器只能为向上计数,即TIMx_CNT只能从0开始递增,并且无需初始化。

定时器周期TIM_Period:实际就是设置自定重载寄存器的值,当事件生成时更新到影子寄存器,可设置范围为0~65535。

时钟分频TIM_ClockDivision:设置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比。基本定时器没有此项功能,不用设置。

重复计数器TIM_RepetitionCounter:该项输入高级控制寄存器的专用寄存器位,利用它可以控制输出PWM的个数,基本寄存器中无需设置。

综上,虽然定时器初始化结构体由5个成员,但是对于基本定时器来说,只需要设置其中两个就可以,其余的暂时不涉及。

OK ,关于定时器的基本知识,下来我们实践一下使用基本定时器操作LED以1s的节奏闪烁。

三、实验

这里实现使用基本定时器控制LED以1s的节拍闪烁,编程思路如下:

  1. 初始化RGB彩灯GPIO;
  2. 开启基本定时器时钟;
  3. 设置定时器周期和预分频器;
  4. 启动定时器更新中断,并开启定时器;
  5. 定时器中断服务函数实现RGB彩灯翻转。

宏定义

#ifndef __BSP_TIM_H__
#define __BSP_TIM_H__
#include "stm32f4xx.h"
#define BASE_TIM           		TIM6
#define BASE_TIM_CLK       		RCC_APB1Periph_TIM6
#define BASE_TIM_IRQn      		TIM6_DAC_IRQn
#define BASE_TIM_IRQHandler     TIM6_DAC_IRQHandler
void TIMx_Config(void);
#endif  /*__BSP_TIM_H__*/

NVIC配置

static void TIM_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         //设置中断组为0NVIC_InitStruct.NVIC_IRQChannel = BASE_TIM_IRQn;        //设置中断来源为TIM中断NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;  //设置为抢占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;         //设置子优先级NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;            //通道使能NVIC_Init(&NVIC_InitStruct);
}

TIM结构体初始化

static void TIM_Mode_Config(void)
{TIM_TimeBaseInitTypeDef TIM_InitStruct;RCC_APB1PeriphClockCmd(BASE_TIM_CLK,ENABLE);        //开启TIM6时钟TIM_InitStruct.TIM_Period = 9999;                   //设置定时器周期为9999次,从0开始计数,因此为10000-1,定时1sTIM_InitStruct.TIM_Prescaler = 8999;                //设置预分频器值,这个已经计算过了,设置8999即可。TIM_TimeBaseInit(BASE_TIM,&TIM_InitStruct);         //初始化定时器TIM_ClearFlag(BASE_TIM,TIM_FLAG_Update);            //清除定时器更新中断标志位TIM_ITConfig(BASE_TIM,TIM_IT_Update,ENABLE);        //开启定时器更新中断TIM_Cmd(BASE_TIM,ENABLE);                           //使能定时器
}

使用外设第一件事一定是开时钟!千万不要忘了,TIM6的时钟位于APB1总线,开启即可。

这里我们以1s为周期闪烁LED灯,因此设定定时器周期为应该为10000*(100us),因此此处设置10000-1 = 9999。

预分频器值就按照上面我们计算的值进行设置即可。

中断服务子程序

#include "bsp_tim.h"
#include "bsp_led.h"
void BASE_TIM_IRQHandler(void)				//记得在stm32f4xx_it.h中声明
{if ( TIM_GetITStatus( BASE_TIM, TIM_IT_Update) != RESET ) {LED_G_TOGGLE;TIM_ClearITPendingBit(BASE_TIM , TIM_IT_Update);}
}

main函数

#include "stm32f4xx.h"
#include "bsp_usart_dma.h"
#include "bsp_led.h"
#include "bsp_tim.h"
#include <stdio.h>
int main(void)
{LED_Config();DEBUG_USART1_Config();TIMx_Config();printf("\r\n---------------TIM基本定时器实验----------------\r\n");while(1){}
}

最终效果:
在这里插入图片描述

相关文章:

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 基本定时器知识 这节开始学习一下TIM定时器功能&#xff0c;从字面意思上理解&#xff0c;定时器的基本功能就是用来定时&#xff0c;与定时器相结合&#xff0c;可以实现一些周期性的数据发送、采集等功能&#…...

轮廓检测与处理

轮廓检测 先将图像转换成二值 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 ret, thresh cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 变为二值&#xff0c;大于127置为255&#xff0c;小于100置为0.使用cv2.findContours(thresh, cv2.RETR_TREE, cv2.…...

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…...

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…...

GLTF编辑器-位移贴图实现破碎的路面

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图是一种可以用于增加模型细节和形状的贴图。它能够在渲染时针…...

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现SSA-BiLSTM麻雀算法优化…...

docker安装Nacos和Rabbitmq

一、安装Nacos 首先需要拉取对应的镜像文件&#xff1a;&#xff08;切换版本加上对应版本号即可&#xff0c;默认最新版&#xff09; docker pull nacos/nacos-server 接着挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p …...

Android MVC 写法

前言 Model&#xff1a;负责数据逻辑 View&#xff1a;负责视图逻辑 Controller&#xff1a;负责业务逻辑 持有关系&#xff1a; 1、View 持有 Controller 2、Controller 持有 Model 3、Model 持有 View 辅助工具&#xff1a;ViewBinding 执行流程&#xff1a;View >…...

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…...

js for和forEach 跳出循环 替代方案

1 for循环跳出 for(let i0;i<10;i){if(i5){break;}console.log(i) }在函数中也可以return跳出循环 function fn(){for(let i0;i<10;i){if(i5){return;}console.log(i)} } fn()for ... of效果同上 2 forEach循环跳出 break会报错 [1,2,3,4,5,6,7,8,9,10].forEach(i>…...

如何使用ArcGIS Pro自动矢量化建筑

相信你在使用ArcGIS Pro的时候已经发现了一个问题&#xff0c;那就是ArcGIS Pro没有ArcScan&#xff0c;在ArcGIS Pro中&#xff0c;Esri确实已经移除了ArcScan&#xff0c;没有了ArcScan我们如何自动矢量化地图&#xff0c;从地图中提取建筑等要素呢&#xff0c;这里为大家介绍…...

交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下…...

41.坑王驾到第七期:uniapp开发微信小程序引用组件时报错!

一、错误再现 页面login引用了一个组件register&#xff0c;运行至小程序开发工具报错。 xxx.js 已被代码依赖分析忽略&#xff0c;无法被其他模块引用。 二、解决办法 在微信小程序的配置文件中找到setting节点&#xff0c;增加两个配置项。 “ignoreDevUnusedFiles”: fa…...

挂载与解挂载

一. 挂载 1.什么是挂载 将系统中的文件夹和磁盘做上关联&#xff0c;使用文件夹等于使用磁盘 2.mount 2.1 格式 mount [ -t 类型 ] 存储设备 挂载点目录 mount -o loop ISO镜像文件 挂载点目录 注意&#xff1a;指明要挂载的设备 设备文件&#xff1a;例如:/dev/sda5 卷…...

UGUI Panel的显示和隐藏优化

unity UI如何开启&#xff08;显示&#xff09;或者关闭&#xff08;隐藏&#xff09;Panel界面&#xff0c;相信大家都是知道的&#xff0c;但是如何做最好呢&#xff1f; 可能大家一般开启/关闭界面的方法就是直接SetActive吧。这样做通常是可以的&#xff0c;简答快速地解决…...

Linux:多文件编辑

多文件编辑 1.使用vim编辑多个文件 编辑多个文件有两种形式&#xff0c;一种是在进入vim前使用的参数就是多个文件。另一种就是进入vim后再编辑其他的文件。 同时创建两个新文件并编辑 $ vim 1.txt 2.txt默认进入1.txt文件的编辑界面 命令行模式下输入:n编辑2.txt文件&…...

模式识别与机器学习-概率图模型

模式识别与机器学习-概率图模型 概率图模型三大基本问题表示推断学习 有向概率图模型例子三种经典的图 HMMViterbi 算法 谨以此博客作为复习期间的记录 概率图模型三大基本问题 概率图模型通常涉及三个基本问题&#xff0c;即表示&#xff08;Representation&#xff09;、推…...

RK3566 ANDROID 11 平台上适配移远EC200A

适配前理清楚一下调试的流程: 1.该模块为LGA封装,需要控制上电时序模块才能正常上电工作: 2.模块供电正常后,读取模组的PID 和VID 并将其ID添加到内核里面,确保USB转Serial端口能够正常生成: 3.生成ttyUSB0~ttyUSB2端口后,确保rild进程正常启动,能够正常加载ril库; …...

存算分离降本增效,StarRocks 助力聚水潭 SaaS 业务服务化升级

作者&#xff1a;聚水潭数据研发负责人 溪竹 聚水潭是中国领先的 SaaS 软件服务商&#xff0c;核心产品是电商 ERP&#xff0c;协同350余家电商平台&#xff0c;为商家提供综合的信息化、数字化解决方案。公司是偏线下商家侧的 toB 服务商&#xff0c;员工人数超过3500&#xf…...

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时&#xff0c;遇到了 hlist&#xff0c;这个 hlist 用起来像是普通的链表&#xff0c;但是为何使用 hlist&#xff0c;hlist 是怎么工作的&#xff1f; 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…...

几种设计模式介绍

前言 设计模式是一种用于解决软件开发中常见问题的通用解决方案&#xff0c;它可以提高代码的可读性、可维护性和可复用性。前端开发中也有很多应用设计模式的场景&#xff0c;比如处理异步操作、优化性能、封装复杂逻辑等。 前端开发中常见的设计模式有以下几种&#xff1a; …...

拓展操作(三) jenkins迁移到另一个机器

让清单成为一种习惯 互联网时代的变革,不再是简单的开发部署上线,持续,正确,安全地把事情做好尤其重要;把事情做好的前提是做一个可量化可执行的清单,让工程师就可以操作的清单而不是专家才能操作: 设定检查点 根据节点执行检查程序操作确认或边读边做 二者选其一不要太…...

重定向和转发的区别

重定向 1、定义 用户通过浏览器发送一个请求&#xff0c;Tomcat服务器接收这个请求&#xff0c;会给浏览器发送一个状态码302&#xff0c;并设置一个重定向的路径&#xff0c;浏览器如果接收到了这个302的状态码以后&#xff0c;就会去自动加载服务器设置的路径 一个页面跳转…...

基于ElementUI二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…...

linux cat命令改变功能显示当前文件行号

linux的cat命令使用-n显示多个文件行号时&#xff0c;行号是累加的&#xff0c;不是到了新文件就重新计数。这样满足不了我的需求。如果到了新文件能够重新计数&#xff0c;就能使用-nf&#xff08;在上一篇-f显示文件名功能的基础上&#xff09;加| grep xxx&#xff0c;既能直…...

Django-REST-Framework 如何快速生成Swagger, ReDoc格式的 REST API 文档

1、API 接口文档的几种规范格式 前后端分离项目中&#xff0c;使用规范、便捷的API接口文档工具&#xff0c;可以有效提高团队工作效率。 标准化的API文档的益处&#xff1a; 允许开发人员以交互式的方式查看、测试API接口&#xff0c;以方便使用将所有可暴露的API接口进行分…...

SpringBoot当中的Singleton和Prototype详解

在Spring Boot中&#xff0c;Singleton和Prototype是两种Bean的作用域。这两种作用域决定了Spring容器如何创建和管理Bean的实例。 Singleton&#xff08;单例&#xff09;&#xff1a; 当一个Bean被配置为Singleton作用域时&#xff0c;Spring容器在启动时只会创建该Bean的一个…...

LeetCode第1题 - 两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例 给定 nums [2, 7, 11, 15], …...

(14)Linux 地址空间的理解

前言&#xff1a;本章核心主题为 "进程地址空间"。 一、Linux 进程地址空间 程序地址空间是内存吗&#xff1f;不是&#xff01;程序地址空间不是内存&#xff01; 其实&#xff0c;我们称之为程序地址空间都不准确&#xff0c;应该叫 进程地址空间&#xff0c;这…...

Java中的设计模式

设计模式是软件开发中常见问题的可重用解决方案。在Java中&#xff0c;设计模式有助于提高代码的可维护性、可读性和可扩展性。以下是一篇关于Java中设计模式的文章&#xff0c;以帮助您更好地理解这些模式。 一、设计模式简介 设计模式是经过验证的解决方案&#xff0c;用于…...

Hadoop(2):常见的MapReduce[在Ubuntu中运行!]

1 以词频统计为例子介绍 mapreduce怎么写出来的 弄清楚MapReduce的各个过程&#xff1a; 将文件输入后&#xff0c;返回的<k1,v1>代表的含义是&#xff1a;k1表示偏移量&#xff0c;即v1的第一个字母在文件中的索引&#xff08;从0开始数的&#xff09;&#xff1b;v1表…...

Unity | 快速修复Animation missing错误

目录 一、背景 二、效果 三、解决办法 一、背景 最近在做2D 骨骼动画相关的Demo&#xff0c;我自己使用Unity引擎进行骨骼绑定并创建了anim后&#xff0c;一切正常&#xff0c;anim也能播放。但是昨天我修改Obj及子物体的名称&#xff08;由中文改为英文&#xff0c;如&…...

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…...

C++运算符重载(插入and提取)

介绍 本文主要介绍 插入(>>) and 提取(<<)的运算符重载 1.插入(>>) 提取(<<)只能是友元函数 2.插入关键词istream 例子&#xff1a;istream& operator>>(istream& in, sumber&Left) 3.提取关键词ostream 例子&#xff1a;ostream&a…...

C#高级 08Json操作

1.概念 Json是存储和交换文本信息的语法。类似于XML。Json比XML更小、更快、更易解析。Json与XML一样是一种数据格式。Json是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。Json采取完全独立于语言的文本格式&#xff0c; 但是也使用了类似于C语言的习惯。这些特性使…...

封装uniapp签字板

新开发的业务涉及到签字功能&#xff0c;由于是动态的表单&#xff0c;无法确定它会出现在哪里&#xff0c;不得已封装模块。 其中涉及到一个难点就是this的指向性问题&#xff0c; 第二个是微信小程序写法&#xff0c; 我这个写法里用了u-view的写法&#xff0c;可以自己修改组…...

Mybatis行为配置之Ⅳ—日志

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...

Java设计模式-外观模式

目录 一、影院管理项目 二、外观模式 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;原理类图 &#xff08;三&#xff09;解决影院管理 &#xff08;四&#xff09;注意事项和细节 &#xff08;五&#xff09;外观模式在MyBatis框架应用的源码分析 一…...

js+css实现颜色选择器

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>颜色选择器</title><style>.color-box {width: 50px;height: 50px;border: 1px solid #000;cursor: pointer;}</style> </head> <body><…...

Go语言中的包管理工具之Go Modules的使用

GoLang 中常用的包管理的方式 常用的有三种 Go PathGo VendorGo Modules 关于 Go Modules 1 ) 概述 Go的包管理&#xff0c;经过社区和官方的共同努力下&#xff0c;最终在百家争鸣后Go官方在 2018.8 推出了go 1.11版本中的Go Modules&#xff0c;并且很快成为一统江湖的包…...

【c/c++】指针例图基础详解

文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…...

TCP/IP的网络层(即IP层)之IP地址和网络掩码,在视频监控系统中的配置和应用

在给客户讲解我们的AS-V1000视频监控平台的时候&#xff0c;有的客户经常会配置错误IP地址的掩码和网关&#xff0c;导致出现一些网路问题。而在视频监控系统中&#xff0c;IP地址和子网掩码是用于标识网络中设备的重要标识符。IP地址被用来唯一地标识一个网络设备&#xff0c;…...

代码随想录刷题 | Day1

今日学习目标 一、基础 数组 array类 模板类vector 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的 而且大家如果使用C的话&…...

查看IOS游戏FPS

摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率&#xff08;FPS&#xff09;。通过克魔助手&#xff0c;开发者可以轻松监测游戏性能&#xff0c;以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中&#xff0c;了解游戏的帧率对于优化游戏性能至关重要…...

挑战Python100题(7)

100+ Python challenging programming exercises 7 Question 61 Print a unicode string "hello world". Hints: Use ustrings format to define unicode string. 打印一个unicode字符串“helloworld”。 提示:使用u“字符串”格式定义unicode字符串。 Solution…...

HarmonyOS自学-Day4(TodoList案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;TodoList小案例 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 HarmonyOS自学笔记&#xff0c;此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…...

LTPI协议的理解——2、LTPI实现的底层架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LTPI协议的理解——2、LTPI实现的底层架构 前言一、体系结构三、实现细节四、物理接口信号传输方法总结 前言 前面讲了LTPI的定义和大概结构&#xff0c;接下来继续理解LTPI…...

CentOS 8.2 安装 Mysql 5.7.26(单机)

Mysql二进制包: mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 1、卸载旧环境 rpm -qa|grep mysql rpm -qa|grep mariadb rpm -e XXX.rpm --nodeps # 强制卸载rpm包 rm -rf /etc/my.cnf rm -rf /etc/mysql rm -rf /usr/local/mysql 2、安装依赖包 yum -y install libaio yum…...

Vue Tinymce富文本组件自定义带下拉框的操作按钮

想实现如下效果 首先在init方法中的props&#xff0c;toolbar属性增加一个自定义按钮 增加一个setup方法 代码 setup: function(editor) { editor.ui.registry.addSplitButton(myDateButton, {text: 日期时间,onAction: (_) > editor.insertContent(getJsMonthDay(getNowDat…...

YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone

前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…...