
- 外文名
- The timer
- 作 用
- 计时
- 中文名
- 定时器
- 性 质
- 科学用品
-
定时器
2019-04-08 17:23:021.设置定时器 1.1setTimeout() 作用:到达间隔时间之后,只调用一次回调函数 **语法: ** window.setTimeout(回调函数, 间隔时间) window可以省略 间隔时间以毫秒为单位 返回这个定时器的标识符,是数字类型 ...1.设置定时器
1.1setTimeout()
作用:到达间隔时间之后,只调用一次回调函数
**语法: ** window.setTimeout(回调函数, 间隔时间)
- window可以省略
- 间隔时间以毫秒为单位
- 返回这个定时器的标识符,是数字类型
javascript // 创建一个定时器,1秒后执行 // timerId指向这个定时器的标识符 var timerId = setTimeout(function () { console.log('Hello World'); }, 1000);
2.1 setInterval()
作用: 每隔一个间隔时间,就调用一次回调函数
**语法: ** window.setInterval(回调函数, 间隔时间)
- window可以省略
- 间隔时间以毫秒为单位
- 返回这个定时器的唯一标示符,是数字类型
javascript // 创建一个定时器,每隔1秒调用一次 //timerId 指向这个定时器的标识符 var timerId = setInterval(function () { var date = new Date(); console.log(date.toLocaleTimeString()); }, 1000);
2.清除定时器
6.2.1 clearTimeout()
**作用: **清除以setTimeout方法设置的定时器
语法: widnow.clearTimeout(定时器的标识符) window可以忽略
6.2.2 clearInterval()
**作用: **清除以setInterval方法设置的定时器
语法: widnow.clearInterval(定时器的标识符) window可以忽略
小结:
- 设置定时器 setTimeout 和 setInterval
- 清除定时器 clearTimeout 和 clearInterval
-
js中两种定时器,setTimeout和setInterval的区别
2017-03-31 09:22:03//定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = window.setTimeout(hello,1000); var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法 window.clearTimsetTimeout只在指定时间后执行一次,代码如下:
<script> //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = window.setTimeout(hello,1000); var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法 window.clearTimeout(t1);//去掉定时器 </script>
setInterval以指定时间为周期循环执行,代码如下:
//实时刷新时间单位为毫秒 setInterval('refreshQuery()',8000); /* 刷新查询 */ function refreshQuery(){ $("#mainTable").datagrid('reload',null); }
两种方法根据不同的场景和业务需求择而取之,一般情况下setTimeout用于延迟执行某方法或功能,
setInterval则一般用于刷新表单,对于一些表单的假实时指定时间刷新同步
销毁两种定时器方法:
//清除Timeout的定时器,
传入id(创建定时器时会返回一个id) clearTimeout(i);
//清除Interval的定时器,
传入id(创建定时器时会返回一个id) clearInterval(j);
-
【STM32】通用定时器的基本原理(实例:定时器中断)
2018-04-18 10:09:30《STM32中文参考手册V10》-第14章通用定时器 STM32的定时器 STM32F103ZET6一共有8个定时器,其中分别为: 高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。 ...STM32F1xx官方资料:
《STM32中文参考手册V10》-第14章通用定时器
STM32的定时器
STM32F103ZET6一共有8个定时器,其中分别为:
高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。
他们之间的区别情况见下表:
STM32定时器的区别 定时器种类 位数 计数器模式 发出DMA请求 捕获/比较通道个数 互补输出 特殊应用场景 高级定时器 16 向上、向下、向上/下 可以 4 有 带死区控制盒紧急刹车,可应用于PW
M电机控制
通用定时器 16 向上、向下、向上/下 可以 4 无 通用。定时计数,PWM输出,输入捕获
,输出比较
基本定时器 16 向上、向下、向上/下 可以 0 无 主要应用于驱动DAC STM32的通用定时器
通用定时器功能特点描述
STM32的通用定时器是由一个可编程预分频器(PSC)驱动的16位自动重装载计数器(CNT)构成,可用于测量输入脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。
STM3 的通用TIMx(TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
- 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上);
- 16位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT);
- 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值;
- 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
- 输入捕获
- 输出比较
- PWM生成(边缘或中间对齐模式)
- 单脉冲模式输出
- 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
- 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):
- 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
- 输入捕获
- 输出比较
- 支持针对定位的增量(正交)编码器和霍尔传感器电路
- 触发输入作为外部时钟或者按周期的电流管理
STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
- 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
- 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
- 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
简单地理解三种计数模式,可以通过下面的图形:
通用定时器工作流程
对于这个定时器框图,分成四部分来讲:最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、左下部分(输入捕获)、右下部分(PWM输出)。这里主要介绍一下前两个,后两者的内容会在后面的文章中讲解到。
计数时钟的选择
计数器时钟可由下列时钟源提供:
- 内部时钟(TIMx_CLK)
- 外部时钟模式1:外部捕捉比较引脚(TIx)
- 外部时钟模式2:外部引脚输入(TIMx_ETR)
- 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
内部时钟源
从图中可以看出:由AHB时钟经过APB1预分频系数转至APB1时钟,再通过某个规定转至TIMxCLK时钟(即内部时钟CK_INT、CK_PSC)。最终经过PSC预分频系数转至CK_CNT。
那么APB1时钟怎么转至TIMxCLK时钟呢?除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。
例如:默认调用SystemInit函数情况下:SYSCLK=72M、AHB时钟=72M、APB1时钟=36M,所以APB1的分频系数=AHB/APB1时钟=2。所以,通用定时器时钟CK_INT=2*36M=72M。最终经过PSC预分频系数转至CK_CNT。
时基单元
时基单元包含:计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动装载寄存器(TIMx_ARR)三部分。
对不同的预分频系数,计数器的时序图为:
计数模式
此时,再来结合时钟的时序图和时基单元,分析一下各个计数模式:
向上计数模式
向下计数模式
中央对齐模式
通用定时器相关配置寄存器
计数器当前值寄存器(TIMx_CNT)
作用:存放计数器的当前值。
预分频寄存器(TIMx_PSC)
作用:对CK_PSC进行预分频。此时需要注意:CK_CNT计算的时候,预分频系数要+1。
自动重装载寄存器(TIMx_ARR)
作用:包含将要被传送至实际的自动重装载寄存器的数值。
注意:该寄存器在物理上实际上对应着2个寄存器。一个是我们直接操作的,另一个是我们看不到的,这个看不到的寄存器叫做影子寄存器。实际上真正起作用的是影子寄存器。根据TIMx_CR1位的APRE位的设置,APRE=0时,预装载寄存器的内容就可以随时传送到影子寄存器,此时两者是互通的;APRE=1时,在每一次更新事件时,才将预装在寄存器的内容传送至影子寄存器。
控制寄存器(TIMx_CR1)
作用:对计数器的计数方式、使能位等进行设置。
这里有ARPE位:自动重装载预装载允许位。ARPE=0时,TIMx_ARR寄存器没有缓冲;ARPE=1时,TIMx_ARR寄存器被装入缓冲器。
DMA/中断使能寄存器(TIMx_DIER)
作用:对DMA/中断使能进行配置。
通用定时器超时时间
超出(溢出)时间计算:
Tout=(ARR+1)(PSC+1)/TIMxCLK
其中:Tout的单位为us,TIMxCLK的单位为MHz。
这里需要注意的是:PSC预分频系数需要加1,同时自动重加载值也需要加1。
- 为什么自动重加载值需要加1,因为从ARR到0之间的数字是ARR+1个;
- 为什么预分频系数需要加1,因为为了避免预分频系数不设置的时候取0的情况,使之从1开始。
这里需要和之前的预分频进行区分:由于通用定时器的预分频系数为1~65535之间的任意数值,为了从1开始,所以当预分频系数寄存器为0的时候,代表的预分频系数为1。而之前的那些预分频系数都是固定的几个值,比如1、4、8、16、32、64等等,而且可能0x000代表1,0x001代表4,0x010代表8等等。也就是说,一边是随意的定义(要从1开始),另一边是宏定义了某些值(只有特定的一些值)。
比如,想要设置超出时间为500ms,并配置中断,TIMxCLK按照系统默认初始化来(即72MHz),PSC取7199,由此可以计算出ARR为4999。
也就是说,在内部时钟TIMxCLK为72MHz,预分频系数为7199的时候,从4999递减至0的事件是500ms。
通用定时器相关配置库函数
- 1个初始化函数
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
作用:用于对预分频系数、计数方式、自动重装载计数值、时钟分频因子等参数的设置。
- 2个使能函数
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
作用:前者使能定时器,后者使能定时器中断。
- 4个状态标志位获取函数
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
作用:前两者获取(或清除)状态标志位,后两者为获取(或清除)中断状态标志位。
定时器中断的一般步骤
实例要求:通过TIM3的中断来控制DS1的亮灭,DS1是直接连接在PE5上的。
- 使能定时器时钟。调用函数:RCC_APB1PeriphClockCmd();
- 初始化定时器,配置ARR、PSC。调用函数:TIM_TimeBaseInit();
- 开启定时器中断,配置NVIC。调用函数:void TIM_ITConfig();NVIC_Init();
- 使能定时器。调用函数:TIM_Cmd();
- 编写中断服务函数。调用函数:TIMx_IRQHandler()。
下面按照这个一般步骤来进行一个简单的定时器中断程序:
//通用定时器3中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx } //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 LED1=!LED1; } }
int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); //LED端口初始化 TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms while(1) { LED0=!LED0; delay_ms(200); } }
定时器中断的程序和串口中断的程序非常类似,可以将两者结合起来进行比对着学习【STM32】串口相关配置寄存器、库函数(UART一般步骤) 。
同时强调一下,在中断处理函数内,需要判断中断来源和及时清除中断标志位。
-
【STM32】通用定时器的PWM输出(实例:PWM输出)
2018-04-19 15:22:43STM32F1xx官方资料: ...STM32的通用定时器分为TIM2、TIM3、TIM4、TIM5,而每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。 STM32的定时器除了TIM6和TIM7(基本定时器...STM32F1xx官方资料:
《STM32中文参考手册V10》-第14章 通用定时器
通用定时器PWM概述
STM32定时器输出通道引脚
这里以TIM3为例来讲解。STM32的通用定时器分为TIM2、TIM3、TIM4、TIM5,而每个定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。
STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32最多可以同时产生30路PWM输出!
从图中的内容可以看出,TIM3的4个通道相对应的各个引脚以及重映射情况下的各个引脚的位置。
PWM的工作原理
在通用定时器框图中,主要涉及到最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、右下部分(PWM输出)这三个部分。这里主要讲解一下右下部分(PWM输出),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。
下面以向上计数为例,简单地讲述一下PWM的工作原理:
- 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
- 当CNT小于CCRx时,TIMx_CHx通道输出低电平;
- 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
这个时候就可以对其下一个准确的定义了:所谓脉冲宽度调制模式(PWM模式),就是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
PWM的通道概览
每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。
捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。
- 在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
- 在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较。
- CCR1寄存器:捕获/比较值寄存器:设置比较值;
- CCMR1寄存器:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1或者PWM模式2;
- CCER寄存器:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
- CCER寄存器:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。
PWM输出的模式区别
通过设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式:
- PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
- PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
注意:PWM的模式只是区别什么时候是有效电平,但并没有确定是高电平有效还是低电平有效。这需要结合CCER寄存器的CCxP位的值来确定。
例如:若PWM模式1,且CCER寄存器的CCxP位为0,则当TIMx_CNT<TIMx_CCR1时,输出高电平;同样的,若PWM模式1,且CCER寄存器的CCxP位为2,则当TIMx_CNT<TIMx_CCR1时,输出低电平。
PWM的计数模式
向上计数模式
下面是一个PWM模式1的例子。当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。
向下计数模式
在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式下不能产生0%的PWM波形。
中央对齐模式
当TIMx_CR1寄存器中的CMS位不为’00’时,为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位设置,比较标志可以在计数器向上计数时被置’1’、在计数器向下计数时被置’1’、或在计数器向上和向下计数时被置’1’。TIMx_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。
自动加载的预加载寄存器
在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
在TIMx_CRx寄存器的ARPE位,决定着是否使能自动重装载的预加载寄存器。
根据TIMx_CR1位的APRE位的设置,APRE=0时,预装载寄存器的内容就可以随时传送到影子寄存器,此时两者是互通的;APRE=1时,在每一次更新事件时,才将预装在寄存器的内容传送至影子寄存器。
简单的说:ARPE=1,ARR立即生效;APRE=0,ARR下个比较周期生效。
PWM相关配置寄存器
捕获/比较模式寄存器1(TIMx_CCMR1)
捕获/比较模式寄存器总共2个,TIMx_CCMR1和TIMx_CCMR2。TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。该寄存器的某些位在不同模式下功能不一样,上面一层对应输出而下面一层对应输入。
其中模式设置位OCxM位,此位由3位组成,一共可以配置成7种模式,我们使用的是PWM模式,所以这三位必须为110/111。
作用:在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作。
捕获/比较使能寄存器(TIMx_CCER)
作用:在PWM输出模式下,确定PWM的输出极性和输出使能。
捕获/比较寄存器1(TIMx_CCR1)
作用:在PWM输出模式下,确定比较的值。
PWM相关配置库函数
- 1个输出初始化函数
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
作用:在四个通道中选择一个,初始化PWM输出模式、比较输出极性、比较输出使能、比较值CCRx的值。
- 1个参数设置函数
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
作用:在四个通道中选择一个,设置比较值。通常在初始化函数中已经设置了比较值,此函数用于除初始化之外的修改。
- 2个使能函数
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
作用:前者在四个通道中选择一个,使能输出比较预装载,后者使能自动重装载的预装载寄存器允许位。
PWM的一般步骤
实例要求:使用TIM3来产生PWM输出,并使用TIM3的通道2,把通道2重映射到PB5,产生PWM来控制DS0的亮度。
- 使能定时器和相关IO口时钟。调用函数:RCC_APB1PeriphClockCmd();RCC_APB2PeriphClockCmd();
- 初始化IO口为复用功能输出。调用函数:GPIO_Init();
- 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射。调用函数:RCC_APB2PeriphClockCmd();GPIO_PinRemapConfig();
- 初始化定时器。调用函数:ARR,PSC等:TIM_TimeBaseInit();
- 初始化输出比较参数。调用函数:TIM_OC2Init();
- 使能预装载寄存器。调用函数:TIM_OC2PreloadConfig();
- 使能定时器。调用函数:TIM_Cmd();
- 不断改变比较值CCRx,达到不同的占空比效果。调用函数:TIM_SetCompare2()。
下面按照这个一般步骤来进行一个简单的PWM输出程序:
//TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 }
int main(void) { u16 led0pwmval=0; u8 dir=1; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz while(1) { delay_ms(10); if(dir)led0pwmval++; else led0pwmval--; if(led0pwmval>300)dir=0; if(led0pwmval==0)dir=1; TIM_SetCompare2(TIM3,led0pwmval); } }
-
vue定时器和关闭定时器
2019-03-13 22:23:15@vue定时器和关闭定时器 vue定时器和关闭定时器 mounted() { clearInterval(this.timer) this.setTimer() }, distroyed: function () {//并没用 console.log('distroyed') clearInterval(this.... -
python 定时器,轮询定时器
2018-01-10 15:35:00python 定时器默认定时器只执行一次,第一个参数单位S,几秒后执行 import threading def fun_timer(): print('Hello Timer!') timer = threading.Timer(1, fun_timer) timer.start() 改成以下可以执行多次 ... -
STM32F4 定时器(基本定时器)操作寄存器版
2018-10-04 14:59:02定时器本质定时器的本质:计数器 定时器的构成:时钟源+计数器+重载值 1、stm32的定时器 stm32定时器数量较多、功能比较强;不同的定时器功能有不同。 stm32的定时器进行类型划分。分为三类:①基本定时器;②通用... -
STM32通用定时器使用详解
2018-08-12 09:45:571.通用定时器基本介绍 通用定时器包括TIM2、TIM3、TIM4和TIM5 STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。... -
设置定时器与清除定时器
2019-01-18 15:20:24设置定时器与清除定时器 (作者:杨先金;撰写时间:2019年1月18日) 一, 设置定时器 下面我们来讲讲如何设置一个定时器,首先你得定义一个空的变量(比如:timer)来接收定时器,相当于把它存放到你定义的这个变量... -
VUE 设置定时器和清理定时器
2019-04-25 09:31:20使用钩子函数对定时器进行清理,失败了,1、在data中声明要设置的定时器名称:data() { return { timer: null // 定时器名称 } },复制代码2、在mounted中创建定时器:this.timer = (() =&g... -
基于硬件定时器的软件定时器
2020-05-14 21:17:51讲到定时器,大家多多少少都会接触到硬件定时器,但是由于有时候资源的限制,又难免会出现使用软件定时器的情况,但是讲定时器需要从硬件定时器开始讲,软件定时器是在其基础之上延伸出来的。 硬件定时器 1.一般硬件... -
定时器 / setTimeout延迟 / setInterval间隔 / clearTimeout、clearInterval清除定时器 / 定时器管理 / ...
2019-09-14 13:16:26定时器的作用: 每隔一段时间或者延迟一段时间,执行一段指定的代码。 定时器的分类: 1.延迟定时器 setTimeout (timeout超时) 2.间隔定时器 setInterval (interval间隔) 清除(关闭)定时器: ... -
【STM32】HAL库 STM32CubeMX教程六----定时器中断
2019-08-13 09:10:04今天我们来学习定时器,32的定时器有着非常丰富的功能,输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与... -
Qt定时器:QObject类的定时器和定时器类QTimer
2016-09-12 00:00:25Qt定时器:QObject类的定时器和定时器类QTimer。 -
EXTJS 定时器
2017-11-14 17:23:00EXTJS 定时器 -
JS循环定时器和炸弹定时器
2019-04-23 16:44:21循环定时器 setinterval();循环定时器:规定时间间隔执行一次,像闹钟一样,不关闭继续执行 setinterval(code,millisec,lang); Code:必需。要调用的函数或要执行的代码串 Millisec:必需。 Lang:可选。 2.... -
js定时器
2019-05-22 19:24:08js的定时器主要是分为三种:单词定时器、循环/多次定时器、删除定时器 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title&... -
stm32 定时器 通用定时器
2017-08-10 14:34:042个基本定时器(TIM6、TIM7) 4个通用定时器(TIM2、 TIM3、 TIM4和TIM5) 2个高级定时器(TIM1、TIM8) 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作TIMx主要功能 16位向上、向下... -
nodejs定时器
2019-08-23 16:33:241、一次性定时器 //一次性定时器 var timer=setTimeout(回调函数,时间) var timer=setTimeout(()=>{ console.log(‘哈哈哈!蹦蹦蹦’); },3000); //清除一次性定时器clearTimeout clearTimeout(timer); //周期... -
JS 定时器
2019-01-17 15:57:20定时器的定义: 让程序每隔一段时间间隔反复执行一项任务 定时器分为:周期性定时器和一次性定时器 周期性定时器: 让程序每隔一段时间反复执行一项任务 如何操作: 1、任务函数 function task(){...} 2... -
JS定时器
2019-01-08 16:33:30JS设置定时器和清除定时器 在做项目中难免会碰到需要实时刷新,动画依次出现等等需求,这时候就需要定时器登上我们的代码舞台了,所以今天我们就先来了解一下JS定时器的设置和清除吧。 一、启用定时器 window对象... -
SysTick定时器
2019-02-13 22:38:291.SysTick定时器 SysTick定时器也叫滴答定时器,是Cortex-M3的一个外设,嵌在NVIC。它是一个24位向下递减的定时器,每计数一次需要时间是1/SYSTICK,SYSTICK是系统定时器时钟,其可以直接取自系统时钟也可以8分频后... -
STM32——高级定时器、通用定时器、基本定时器的区别
2020-03-25 09:55:23——高级定时器、通用定时器、基本定时器的区别 TIM1和TIM8定时器的功能包括【增强型】: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535... -
【STM32】通用定时器的输入捕获(实例:输入捕获)
2018-04-20 10:30:16STM32F1xx官方资料: 《STM32中文参考手册V10》-第14章 通用定时器 ...这里主要讲解一下左下部分(输入捕获),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。 输入捕获... -
javascript定时器,取消定时器,及js定时器优化方法
2019-07-03 10:33:22版权声明:转载请附链接,就这个要求。...启动定时器: window.setInterval(Method,Time) Method是定时调用的js方法:Time是间隔时间,单位是毫秒 取消定时器: clearInterval(Method); 那么问题来...
-
第1章 Java入门基础及环境搭建【java编程进阶】
-
(新)备战2021软考信息安全工程师顺利通关套餐
-
CFD在金融中的应用-初步
-
16日模拟总结
-
有刷电机正交编码PID调速
-
[机器学习]模型评估指标:ROC/AUC,KS,GINI,Lift/Gain, PSI 总结
-
华为大数据视频资料
-
备战2021年软考信息系统项目管理师考试顺利通关
-
[论文解读]DeepGauge: Multi-Granularity Testing Criteria for Deep Learning Systems
-
(新)备战2021软考信息安全工程师基础知识套餐
-
杭电OJ第11页2070~2074算法题(C语言)
-
跟我练内测小分队学习礼包
-
合工大机器人技术实验报告
-
git32位下载最新中文版
-
前端性能优化
-
11.什么是类变量,什么是成员变量,什么是局部变量,他们分别存在jvm的什么区域内,这些区域中,那些是线程安全的,那些是线程不安全的。
-
基于arduino——pid循迹小车.zip
-
js函数使用return终止函数后页面仍然跳转
-
web自动化实战之BasePage
-
神舟SIS662芯片组bios准系统U50SI1