03:TIM定时器

2023-10-27

目录

一:TIM

1:介绍

2:定时器的分类

3:基本定时器

4:通用定时器

 5:高级定时器

6:定时器的基本结构

二:定时中断功能

A:定时器定时器中断

1:连接图

​编辑 

2:步骤

3:函数介绍

4:代码

三:外部时钟功能

A:定时器外部时钟

1:连接图

2:函数介绍 

3:外部时钟代码


一:TIM

1:介绍

        TIM(Timer)定时器

        定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

        16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 (计数器、预分频器、自动重装寄存器构成时基单元)

        不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

         根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

2:定时器的分类

 STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

3:基本定时器

1 :  预分频器+CNT计数器+自动重装载寄存器=时基单元

2 : 基本定时器只能选择内部时钟;他们都为16位的

预分频器 : 可以对72MHZ的计数时钟进行预分频处理; 对输入的基准频率提前进行一个分频的操作

eg : 预分频器写0,那就是不分频,或者说是1分频 ; 输出频率=输入频率=72MHz

预分频器写1,那就是2分频,输出频率(实际分频系数)=输入频率/2=36MHz

预分频器写2,那就是3分频,输出频率(实际分频系数)=输入频率/3= 24MHz

所以预分频器的值和实际的分频系数相差了1;  实际分频系数=预分频器的值+1

计数器 : 计数器可以对预分频后的计数时钟进行计数,预分频器每来一个上升沿计数器就+1

        所以计数器的值在计时过程中会不断地自增运行,直到达到目标值(自动重装载寄存器)然后产生中断,然后在重新开始计数

自动重装载寄存器(固定值) : 储存的是我们的计数目标,产生中断的目标值,(当计数器达到目标值就产生中断)

流程: 基准时钟------->预分频器------>计数器<--------->自动重装载计数器

计数器不断自增,会和自动重装载寄存器比较,当两个的值相同时,产生更新中断和更新事件;

cpu会响应更新中断

4:通用定时器

 5:高级定时器

6:定时器的基本结构

二:定时中断功能

A:定时器定时器中断

我们使用的是通用定时器TIM2在案列中(内部时钟)

1:连接图

 

2:步骤

1: 开启时钟 (RCC)

2: 选择时基单元的时钟 (TIM_InternalClockConfig--选择内部时钟)

3: 配置时基单元  (TIM_TimeBaseInit)

4 : 使能更新中断( TIM_ITConfig中断时钟控制)

5: NICV的配置   (见 02: STM32)

6: 启动定时器  (TIM_Cmd)

3:函数介绍

在stm32f10x tim.h文件中的函数-----时钟源选择函数   (选择时基单元的时钟)

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);


void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);


void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);


void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);


void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);


void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);

TIM_InternalClockConfig : 选择内部时钟

TIM_ITRxExternalClockConfig : 选择TIR其他定时器的时钟

TIM_TIxExternalClockConfig : 选择TIx捕获通道的时钟

TIM_ETRClockMode1Config : 选择ETR通过外部时钟模式1输入的时钟

TIM_ETRClockMode2Config : 选择ETR通过外部时钟模式2输入的时钟

TIM_ETRConfig : 单独用来配置ETR引脚的预分频器、极性、滤波器这些参数的

 在stm32f10x tim.h文件中的函数-------时基单元函数

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

TIM_TimeBaseInit : 时基单元初始化,;TIMX选择某个定时器;  TIM_TimeBaseInitStruct:结构体包含了TIM配置的一些参数;

 在stm32f10x tim.h文件中的函数-------中断输出控制函数

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

TIM_ITConfig : 使能中断输出信号

 在stm32f10x tim.h文件中的函数-------运行控制函数函数

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

 TIM_Cmd : 选择启动那个定时器, 选择使能还有失能

 在stm32f10x tim.h文件中的函数-------单独修改初始化函数中的重要参数

不能为了某一个参数.直接重新初始化,太关于麻烦,直接更改某一个参数即可

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);


void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
 

void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
 

uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
 

TIM_PrescalerConfig :  单独写预分频值

TIM_CounterModeConfig : 改变计数器的计数模式

TIM_ARRPreloadConfig : 自动重装器预装功能配置

TIM_SetCounter : 给计数器写入一个值

TIM_SetAutoreload : 给自动重装器写入一个值

TIM_GetCounter : 获取当前计数器的值

TIM_GetPrescaler :获取当前的预分频器的值

在stm32f10x tim.h文件中的函数--其他函数

void TIM_DeInit(TIM_TypeDef* TIMx);

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

TIM_DeInit : 恢复缺省配置

TIM_TimeBaseStructInit : 结构体变量赋一个默认值

4:代码

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Timer.h"
int16_t Num;

extern int16_t Num;
void Timer_init(void){
//第一步是开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//第二步,选择时基单元的时钟 (stm23上电默认使用的是内部时钟,这一行代码可以省略)
TIM_InternalClockConfig(TIM2);
//第三步,配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
/*计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
					       = CK_PSC / (PSC + 1) / (ARR + 1
	定时频率=72M/(PSC+1)/(ARR+1)
	72MHZ=72000KHZ
	72000KHZ/7200=10KHZ=10000HZ
	T=1/F   T=1/10000hz=0.0001s=0.1ms
	然后以0.1ms的周期计10 000个数,所以就是1s
	
	*/
TIM_TimeBaseInitStructure.TIM_Period=10000-1;			//自动重装载寄存器ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;  //预分频器PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//高级定时器特有的(重复寄存器)
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
//第四使能更新中断

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	
TIM_ClearFlag(TIM2, TIM_FLAG_Update);  //手动清除更新中断标志位
	
//第五步NICV的配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
	
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
//第六步启动定时器
TIM_Cmd(TIM2,ENABLE);
}

void TIM2_IRQHandler(){
	//检查中断标志位
	if (	TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		//清除标志位
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}


int main(void)
{
	OLED_Init();
	Timer_init();
	OLED_ShowString(1, 1, "Num:");
	
	while (1)
	{
		OLED_ShowNum(1,5,Num,5);
	}
}

为什么要清除中断标志位

响应中断条件是:中断使能中断标志同时成立

单片机要靠查询中断标志来判断是否要进入中断,如果你不清除中断标志,本次中断退出,单片机又会检测到中断标志,因此重复进入中断

在STM32微控制器中,中断是一种重要的机制,用于响应外部事件或内部条件的变化。当一个中断事件发生时,相应的中断标志位会被置位(1),以表示中断事件已经发生。但是,在处理完中断之后,必须清除中断标志位(0),以确保下一次中断事件的正确触发。

清除中断标志位的主要目的有以下几个方面:

1. 防止重复触发:如果不清除中断标志位,当中断处理程序退出后,如果中断标志位仍然保持置位状态,可能会导致重复触发中断。这样会导致中断处理程序不停地执行,影响系统正常运行。

2. 确保正确的中断优先级:在STM32微控制器中,不同的外设和中断源具有不同的优先级。当多个中断源同时触发时,只有优先级最高的中断源会被处理。如果不清除中断标志位,可能会导致错误的中断源被处理,影响系统的功能和性能。

3. 确保正确的中断嵌套:STM32微控制器支持中断的嵌套执行。当一个高优先级的中断正在执行时,如果有一个更高优先级的中断进来,系统会自动挂起当前中断,转而执行更高优先级的中断。在挂起期间,中断标志位可能会保持置位状态。当更高优先级的中断执行完毕后,必须清除该中断的标志位,以便继续执行之前挂起的中断。

因此,为了确保中断系统的正确运行,必须在中断处理程序中清除相应的中断标志位。这可以通过写入相应的寄存器或调用相应的函数来实现。

时间的计算

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
                           = CK_PSC / (PSC + 1) / (ARR + 1
    定时频率=72M/(PSC+1)/(ARR+1)

首先72M进行7200分频,得到是10K的计数频率

在10K频率下,记10000个数,就是1s的时间

Arr是自动重装 psc预分频

方表明最大值是0-65535。-1表示有偏差

频率的单位是Hz; 周期的单位是s;

Hz<KHz<MHz; 都是千进的

s秒,ms毫秒,us微秒,ns纳秒;  都是千进的

72M进行7200分频,得到10KHz的计数频率。

T=1/F 所以T=1/10 000hz = 0.0001s = 0.1ms

然后以0.1ms的周期计10 000个数,所以就是1s
 

    72MHZ=72000KHZ
    72000KHZ/7200=10KHZ=10000HZ
    T=1/F   T=1/10000hz=0.0001s=0.1ms
    然后以0.1ms的周期计10 000个数,所以就是1s

三:外部时钟功能

A:定时器外部时钟

1:连接图

2:函数介绍 

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

TIM_GetCounter :   它用于获取定时器计数器的当前值

TIM_ETRClockMode2Config : 选择ETR通过外部时钟模式2输入的时钟


3:外部时钟代码


#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
extern int16_t Num;
void Timer_init(void){
//第一步是开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
GPIO_InitTypeDef A;
A.GPIO_Mode=GPIO_Mode_IPU;  //上拉
A.GPIO_Pin=GPIO_Pin_0;
A.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&A);
//第二步,选择时基单元的时钟 (stm23上电默认使用的是内部时钟,这一行代码可以省略)
	//TIM_ExtTRGPolarity_NonInverted 高电平或者上升沿有效
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0f);//选择ETR通过外部时钟模式2输入的时钟

	
//第三步,配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
/*计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
					       = CK_PSC / (PSC + 1) / (ARR + 1
	定时频率=72M/(PSC+1)/(ARR+1)
	72MHZ=72000KHZ
	72000KHZ/7200=10KHZ=10000HZ
	T=1/F   T=1/10000hz=0.0001s=0.1ms
	然后以0.1ms的周期计10 000个数,所以就是1s
	
	*/
TIM_TimeBaseInitStructure.TIM_Period=10-1;			//自动重装载寄存器ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;  //预分频器PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//高级定时器特有的(重复寄存器)
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
//第四使能更新中断

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//手动清除更新中断标志位
	
//第五步NICV的配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
	
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
//第六步启动定时器
TIM_Cmd(TIM2,ENABLE);
}

void TIM2_IRQHandler(){
	//检查中断标志位
	if (	TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		//清除标志位
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}

}



uint16_t  Timer_GetCounter(void){
	//TIM_GetCounter。它用于获取定时器计数器的当前值。
	return TIM_GetCounter(TIM2);  
}



uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_init();
	
	OLED_ShowString(1, 1, "Num:");
	OLED_ShowString(2, 1, "CNT:");
	
	while (1)
	{
		OLED_ShowNum(1, 5, Num, 5);
		OLED_ShowNum(2, 5, Timer_GetCounter(), 5);
	}
}

本实验实验了外部时钟(对外式红外传感计数器),当对外式红外传感计数器达到了某个数值是触发定时器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

03:TIM定时器 的相关文章

  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 【MCU简单且容易理解的工作原理】

    SOC是啥 System on Chip 一个芯片 但是片上有好多东西的意思 市面上的AI芯片 包括你知道的麒麟xxx 骁龙xxx等等一些列手机芯片都是SOC 对于SOC设计者来讲 显然要知道码农们码出来的一行行代码是如何在SOC上跑起来的
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • 学习STM32正点原子好吗?

    今日话题 学习STM32正点原子好吗 正点原子的教程内容简单明了 代码也清晰直接 使初学者能够轻松理解其功能和使用方法 尤其对于需要快速完成大学作业等任务的大学生来说 可以直接借鉴并稍作修改 便可满足需求 正点原子提供的资料通俗易懂 适合用
  • 会stm32有机会进大公司吗?

    今日话题 会stm32有机会进大公司吗 我本科期间参与了飞思卡尔和电赛等比赛 使用过多种单片机 但渐渐发现单片机只是其中的一小部分 不要过分迷恋所谓的单片机基础和技巧 更值得深入研究的是C语言 如果你对此感兴趣 我愿意无偿分享一个资源包 其
  • 物联网项目分享 Stm32单片机的音乐播放器设计 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • 太阳诱电树立超高端产品概念,与电子产业同步发展

    无论是传统的手机 家电 安防 汽车 医疗 交通 建筑的智能化转型 还是从物联网 工业4 0 智能硬件 互联网 一场基于大数据 互联网 应用软件等技术的硬件复兴热潮正在席卷全球 没有新东西出来 每家都一样 这一长期以来的争议一直困扰着CEAT
  • 太阳诱电 | 陶瓷电容器的静电容量相关

    陶瓷电容器的静电容量会因温度而变化吗 电容器的静电容量的温度特性是什么 陶瓷电容器的静电容量随周围的温度而变化 静电容量因温度而变化的现象 称为静电容量的温度特性 这是由于陶瓷电容器使用的材料造成的 也是所有陶瓷电容的常有现象 以下是本公司
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • Mysql 联合索引最左匹配原则

    最左前缀匹配原则 在MySQL建立联合索引时会遵守最左前缀匹配原则 即最左优先 在检索数据时从联合索引的最左边开始匹配 Mysql会一直向右匹配直到遇到范围查询 gt lt between like 就停止匹配了 就比如 a 3 and b
  • 算法学习笔记:labuladong--滑动窗口

    算法技巧的思路非常简单 就是维护一个窗口 不断滑动 然后更新答案 int left 0 right 0 while right lt s size 增大窗口 window add s right right while window nee
  • Python中 sys.argv[]的用法简明解释

    因为是看书自学的python 开始后不久就遇到了这个引入的模块函数 且一直在IDLE上编辑了后运行 试图从结果发现它的用途 然而结果一直都是没结果 也在网上查了许多 但发现这个问题的比较详细的解释只有一个版本 大部分都是转载和复制的 给的都
  • 大数据入门学习

    https www cnblogs com xing901022 p 6195422 html
  • redis之list基本操作

    我们存多个数据用hash的时候它是没有顺序的 我们平时操作 实际上数据很多情况下都是有顺序的 那有没有一种能够用来存储带有顺序的这种数据模型呢 list就专门来干这事儿 一 list类型 数据存储需求 存储多个数据 并对数据进入存储空间的顺
  • 常用的两个免费可以商用的cc0协议图片网站

    什么是CC0协议CC0是CC协议 知识共享 是Creative Commons在中国大陆地区的通用译名 一般简称为CC CC既是该国际组织的名称缩写 也是一种版权授权协议的统称 以外的一种新的版权声明协议 采用该协议即代表作者宣布放弃该创作
  • ROS Noetic版本 rosdep找不到命令 不能使用的解决方法

    使用rosdep指令来安装开源包所需的依赖是很方便的 本文主要介绍ROS Noetic版本中使用rosdep 报错找不到命令 rosdep不能使用的解决方法 rosdep 找不到命令 Command rosdep not found but
  • nginx 中文url rewrite 404

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 原料 nginx with debug或openresty 背景 项目中有用户图片库需求 允许用户自定义文件夹 然后上传图片到该文件夹 当用户自定义的文件夹为中文或者访问u
  • 微信第三方平台之代开发小程序(二)

    第二部分 快速创建小程序 必须全网发布成功 注 第一部分 全网发布前的准备 请看我前面的文章 1 权限集准备 全网发布成功后才可生效 2 第三方收集法人微信 法人姓名 企业名称 信用代码四个商户信息外加第三方客服电话 3 企业名称需与工商部
  • 【python教程入门学习】Python教程第1篇:下载和安装Python

    Python是当下流行的通用编程语言 简单易学 容易上手 且 钱 景广阔 在网络爬虫 数据挖掘分析 人工智能 运营运维 日常工作效率提升 无不有Python的影子 因此 今天跟大家分享Python的下载和安装教程 第一步 下载Python最
  • 域名服务详解(域名解析流程和分类)

    一 基本概念 访问互联网是依靠IP地址的 但IP地址多种多样 很难记忆 所以使用域名服务 代替IP地址输入 1 hosts文件 1 位置 Windows系统在C Windows System32 drivers etc hosts 需要超级
  • usdt充值btc网络(非节点钱包地址)

    1 此充值具有一定的交易风险 请一定做好判断 步骤 用户绑定其他交易所的地址 往平台充值 只能使用用户绑定的钱包地址充值 否则无法确认充值成功 用户先填写充值金额 gt 生成充值订单 gt 通过平台设置的收币钱包地址充值 gt 填写充值产生
  • ReactNative组件生命周期

    组件生命周期详解 组件生命周期基础知识 组件 又名控件 是一段独立可复用的代码 在React Native应用开发中 组件是页面最基本的组成部分 和React的组件一样 RN的组件也有自己的生命周期 在RN应用开发中 组件的生命周期指组件初
  • jvm知识梳理

    1 java虚拟机的组成 java虚拟机主要由四部分组成 1 ClassLoader 按特定格式加载class文件到内存中 2 runtime data area jvm内存空间模型 3 execution engine 命令解析器 4 n
  • layui上传如何带参数到后台

    https www jacksonlhj cn articles 2022 03 18 1647584610237 html
  • 【C语言学习日记】 两个整数做简单加减乘除运算

    include
  • C++中访问类的私有数据成员的第三种方法

    我们知道 C 的类是有封装性的 那么对于私有数据成员我们如果想在类外访问 一般而言无外乎这么两种方法 1 通过公有的成员函数2 通过友元这是两种通常的做法 还有一种是比较 反常 的 但是同样也可以达到这样的目的 那就是通过类的基地址偏移来访
  • 相机型号总结

    相机型号 价格 一 富士 二 奥林巴斯 三 索尼 四 佳能 五 尼康 六 理光 价格 一 富士 1 GFX系列 富士最高端的机器 像素5000w 价格3w 7w 2 X系列 主流的富士相机 XH 防抖功能 XT X Pro X E XA 平
  • 工业互联网平台创新发展白皮书 附下载地址

    工业互联网平台创新发展白皮书 2018 是在工业和信息化部信息化和软件服务业司的指导下 由国家工业信息安全发展研究中心 两化融合服务联盟 产业互联网发展联盟开展调研 搜集 分析了62个平台 229个工业企业应用案例组织编写而成 从总体 行业
  • 03:TIM定时器

    目录 一 TIM 1 介绍 2 定时器的分类 3 基本定时器 4 通用定时器 5 高级定时器 6 定时器的基本结构 二 定时中断功能 A 定时器定时器中断 1 连接图 编辑 2 步骤 3 函数介绍 4 代码 三 外部时钟功能 A 定时器外部