STN32--定时器计数器(向上计数模式基本配置)

合集下载

STM32定时器有什么功能?STM32的用法详解

STM32定时器有什么功能?STM32的用法详解

STM32定时器有什么功能?STM32的用法详解
2.2 计数器模式
TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。

向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。

在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

2.3 编程步骤
1. 配置系统时钟;
2. 配置NVIC;
3. 配置GPIO;
4. 配置TIMER;
其中,前3项在前面的笔记中已经给出,在此就不再赘述了。

第4项配置TIMER有如下配置:
(1)利用TIM_DeInit()函数将Timer设置为默认缺省值;
(2)TIM_InternalClockConfig()选择TIMx来设置内部时钟源;
(3)TIM_Perscaler来设置预分频系数;
(4)TIM_ClockDivision来设置时钟分割;
(5)TIM_CounterMode来设置计数器模式;。

stm32通用定时器

stm32通用定时器

stm32通用定时器STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。

时钟源问题:名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。

其中TIM1&TIM8称为高级控制定时器(advanced control tim er).他们所在的APB2总线也比APB1总线要好。

APB2可以工作在72MHz下,而APB1最大是36MHz。

定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。

下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。

有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。

再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。

如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。

能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

STM32的定时器定时时间计算(计数时间和中断定时时间)

STM32的定时器定时时间计算(计数时间和中断定时时间)

STM32的定时器定时时间计算(计数时间和中断定时时间)时基单元可编程⾼级控制定时器的主要部分是⼀个16位计数器和与其相关的⾃动装载寄存器。

这个计数器可以向上计数、向下计数或者向上向下双向计数。

此计数器时钟由预分频器分频得到。

计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运⾏读写仍然有效。

时基单元包含:●计数器寄存器(TIMx_CNT)●预分频器寄存器 (TIMx_PSC)●⾃动装载寄存器 (TIMx_ARR)●重复次数寄存器 (TIMx_RCR)⾃动装载寄存器是预先装载的,写或读⾃动重装载寄存器将访问预装载寄存器。

根据在TIMx_CR1寄存器中的⾃动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被⽴即或在每次的更新事件UEV时传送到影⼦寄存器。

当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时,产⽣更新事件。

更新事件也可以由软件产⽣。

随后会详细描述每⼀种配置下更新事件的产⽣。

计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)时,CK_CNT才有效。

(更多有关使能计数器的细节,请参见控制器的从模式描述)。

注意,在设置了TIMx_CR寄存器的CEN位的⼀个时钟周期后,计数器开始计数。

预分频器描述预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。

它是基于⼀个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。

因为这个控制寄存器带有缓冲器,它能够在运⾏时被改变。

新的预分频器的参数在下⼀次更新事件到来时被采⽤。

尤其注意的是当发⽣⼀个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。

●重复计数器被重新加载为TIMx_RCR寄存器的内容。

●⾃动装载影⼦寄存器被重新置⼊预装载寄存器的值(TIMx_ARR)。

STM32学习笔记4通用定时器基本定时功能

STM32学习笔记4通用定时器基本定时功能

STM32学习笔记(4):通用定时器基本定时功能1.STM32的Timer简介STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。

今天主要是研究剩下的8个定时器。

其中TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生。

TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。

因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。

2.普通定时器TIM2-TIM52.1时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)(TIx):外部输入脚1外部时钟模式·.·外部时钟模式2:外部触发输入(ETR)·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

由于今天的学习是最基本的定时功能,所以采用内部时钟。

TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。

这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。

APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。

通过倍频器给定时器时钟的好处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2-TIM5仍然可以得到较高的时钟频率。

STM32-基本定时器TIM6-TIM7基本定时功能

STM32-基本定时器TIM6-TIM7基本定时功能

STM32-基本定时器TIM6-TIM7基本定时功能1. STM32的TImer简介STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

其中系统嘀嗒定时器是前文中所描述的SysTIck,看门狗定时器以后再详细研究。

今天主要是研究剩下的8个定时器。

定时器计数器分辨率计数器类型预分频系数产生DMA请求捕获/比较通道互补输出TIM1TIM816位向上,向下,向上/向下1-65536之间的任意数可以4有TIM2TIM3TIM4TIM516位向上,向下,向上/向下1-65536之间的任意数可以4没有TIM6TIM716位向上1-65536之间的任意数可以0没有其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。

TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。

因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。

2基本定时器TIM6-TIM72.1 时钟基本特征基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。

它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。

实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。

这2个定时器是互相独立的,不共享任何资源。

2.2 TIM6-7主要特征TIM6和TIM7定时器的主要功能包括:●16位自动重装载累加计数器●16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值分频。

STM32定时器的基础知识

STM32定时器的基础知识

STM32定时器的基础知识:STM32定时器是STM32系列微控制器中的一个重要的硬件模块,它主要用于产生定时中断和PWM信号。

以下是关于STM32定时器的基础知识:1.定时器分类 STM32定时器可以分为通用定时器和高级定时器两类。

其中,通用定时器包括TIM2、TIM3、TIM4和TIM5,它们都具有定时器/计数器、PWM输出和输入捕获等功能;高级定时器包括TIM1、TIM8、TIM9、TIM10、TIM11,它们除了拥有通用定时器的功能外,还具有编码器接口、高级PWM输出、同步功能等。

2.定时器模式 STM32定时器有四种模式:向上计数模式、向下计数模式、向上/向下计数模式和中央对齐模式。

其中,向上计数模式是最常用的模式,它从0计数到设定值后产生中断或触发事件。

3.定时器时钟 STM32定时器时钟可以从内部时钟源(如HSI、HSI14、HSI48、LSI、LSE等)或外部时钟源(如HSE、PLL等)中选择。

时钟频率的选择会影响定时器的分辨率和计数速度。

4.定时器中断 STM32定时器可以通过产生中断来实现定时器功能。

可以设置定时器的计数值和预分频值来控制中断的触发时间。

在中断服务程序中可以执行需要定时的任务,如更新LCD显示、采集传感器数据等。

5.定时器PWM输出 STM32定时器可以产生PWM信号,通过调节占空比和周期可以实现不同的输出波形。

PWM输出可以应用于电机控制、LED灯控制、音频合成等场合。

6.定时器输入捕获 STM32定时器还可以用于输入捕获,即通过输入引脚捕获外部信号的边沿,并将捕获的时间戳保存在定时器的寄存器中。

输入捕获常用于测量脉冲宽度、频率等应用。

7.定时器输出比较 STM32定时器还可以进行输出比较,即将定时器的计数值与设定的比较值进行比较,当计数值等于比较值时触发中断或输出事件。

输出比较常用于控制LED、蜂鸣器、继电器等应用。

8.定时器互联 STM32定时器可以通过互联功能进行互联,即将多个定时器连接在一起形成一个大的定时器,以提高计数范围和精度。

STM32定时器定时时间配置总结

STM32定时器定时时间配置总结

STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。

在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。

首先,我们需要选择定时器的工作模式。

STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。

基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。

根据具体的应用需求,选择合适的工作模式。

其次,我们需要选择定时器的时钟源。

STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。

内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。

然后,我们需要选择定时器的时钟分频系数。

定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。

我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。

时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。

接着,我们需要配置定时器的计数器重载值。

定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。

通过改变计数器重载值,可以实现不同的定时时间。

计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。

最后,我们需要配置定时器的中断。

定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。

在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。

通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。

需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。

stm32定时器参考资料

stm32定时器参考资料

一、本课内容概述这一课的主要内容是STM32系统时钟定时器systick的配置以及如何产生精确延时。

通常实现Delay(N)函数的方法为:for(i = 0; i <= x; i ++);x --- 对应于对应于N 毫秒的循环值对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

注:全局变量TimingDelay 必须定义为volatile二、 SysTick的配置使用方法外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick 效验值设置成9,将SysTick 时钟设置为9MHz,就能够产生1us的时间基值,即SysTick产生1us的中断。

使用ST的函数库使用systick的方法1、调用SysTick_CounterCmd() 失能SysTick计数器2、调用SysTick_ITConfig () 失能SysTick中断3、调用SysTick_CLKSourceConfig() 设置SysTick时钟源。

4、调用SysTick_SetReload() 设置SysTick重装载值。

5、调用SysTick_ITConfig () 使能SysTick中断6、调用SysTick_CounterCmd() 开启SysTick计数器7、去掉stem32f10x_conf.c文件里面关于SysTick的注释,包含编译相关文件8、在FWLIB里面加入stm32f10x_systick.c9、修改工程设置,把中断向量表指向FLASH空间:project-option-C/C++ Complier-Processor-Defined symbols改为VECT_TAB_FLASH 相关程序1.(1)建立systick.c文件2.新建systick.c文件,作为systick相关函数的子函数,子函数里面应包括:SysTick_Init,SysTickDelayUs, TimingDelayMs_Decrement三个函数,由于程序用到一个存放中断计数值的全局变量,而我们将次变量和main.c文件中定义,因此还要在这个文件中做外部引用定义:extern vu32 TimingDelay;,再把系统初始化头文件包括,就完成了此文件的建立:#include "systemInit.h"。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一:TIMER-1:定时器上溢,查询溢出后取反LED.
故频率计算:f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;
定时器的基本设置:
1、设置预分频数,得到CK_CNT,
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
CK_CNT 的计数频率=72M/(7199+1)=10K ;
2、设置自动重装载寄存器,当计数值达到这个寄存器锁存数值时,溢出产生事件
TIM_TimeBaseStructure.TIM_Period = 9999;
10K/(9999+1)=1HZ ,也就是1S 溢出一次;
3、设置计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
从0计数到ARR 产生溢出事件;
4、 设置时间分割值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
5、 初始化定时器2
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
6、清楚标志
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
7、打开定时器
TIM_Cmd(TIM2, ENABLE);
8、在主函数中查询TIM_FLAG_Update 标志置位了就清除标志:
if(TIM_GetFlagStatus (TIM2,TIM_FLAG_Update )!=RESET)
{
TIM_ClearFlag (TIM2,TIM_FLAG_Update);
if( GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8)==0)
GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET);
else
GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET);
}
时钟预分频 CK_PSC 加减计数器 CK_CNT 达到ARR 的值产生事件
实验二、TIMER-1:定时器上溢,中断溢出后取反LED.
利用中断的方法:
步骤一:定时器的配置
1、设置预分频数,得到CK_CNT,
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
CK_CNT的计数频率=72M/(7199+1)=10K;
2、设置自动重装载寄存器,当计数值达到这个寄存器锁存数值时,溢出产生事件
TIM_TimeBaseStructure.TIM_Period = 9999;
10K/(9999+1)=1HZ ,也就是1S溢出一次;
3、设置计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
从0计数到ARR产生溢出事件;
4、设置时间分割值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
5、初始化定时器2
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
6、打开中断溢出中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
7、打开定时器
TIM_Cmd(TIM2, ENABLE);
步骤二:编写中断配置
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
注意:加黑的部分,如果你在RAM中编程就要定义VECT_TAB_RAM ,如果在FLASH 编程,则需要NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);如果没有这条预编译语句的话,则很可能会存在进不去中断的错误。

步骤三:编写中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)));
GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)));
}
}
进入中断判断是不是TIM_IT_Update置位了,如果是的话,清除标志位,将PA8,PD2控制的LED灯取反。

相关文档
最新文档