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定时器 的相关文章

  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • allegro画PCB如何更新元件的PCB封装

    allegro画PCB如何更新元件的PCB封装 一 更新单个器件的PCB封装 首先菜单栏选择Place gt Update Symbols 如下图 注意此案例是更新了C0805封装 中更新封装 就将上图第二个红色方框中的勾选即可 二 更新某
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • stm32毕设分享 stm32单片机酒精浓度酒驾检测系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 MQ 3酒精乙醇传感器模块 SIM800C模块 5 软件说明 系统框图
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 太阳诱电 | 陶瓷电容器的静电容量相关

    陶瓷电容器的静电容量会因温度而变化吗 电容器的静电容量的温度特性是什么 陶瓷电容器的静电容量随周围的温度而变化 静电容量因温度而变化的现象 称为静电容量的温度特性 这是由于陶瓷电容器使用的材料造成的 也是所有陶瓷电容的常有现象 以下是本公司
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • 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 定时器外部