STM32通用定时器

合集下载

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)⾼级定时。

⽂章结构:——> ⼀、定时器基本介绍——> ⼆、普通定时器详细介绍TIM2-TIM5——> 三、定时器代码实例⼀、定时器基本介绍之前有⽤过野⽕的学习板上⾯讲解很详细,所以直接上野⽕官⽅的资料吧,作为学习参考笔记发出来⼆、普通定时器详细介绍TIM2-TIM52.1 时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输⼊脚(TIx)·外部时钟模式2:外部触发输⼊(ETR)·内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器Timer1⽽作为另⼀个定时器Timer2的预分频器。

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

TIM2-TIM5的时钟不是直接来⾃于APB1,⽽是来⾃于输⼊为APB1的⼀个倍频器。

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

{假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作⽤,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。

⼀般APB1和APB2的RCC时钟配置放在初始化函数中例如下⾯的void RCC_Configuration(void)配置函数所⽰,将APB1进⾏2分频,导致TIM2时钟变为72MHZ输⼊。

如果是1分频则会是36MHZ输⼊,如果4分频:CKINT=72MHZ/4x2=36MHZ; 8分频:CKINT=72MHZ/8x2=18MHZ;16分频:CKINT=72MHZ/16x2=9MHZ}1//系统时钟初始化配置2void RCC_Configuration(void)3 {4//定义错误状态变量5 ErrorStatus HSEStartUpStatus;6//将RCC寄存器重新设置为默认值7 RCC_DeInit();8//打开外部⾼速时钟晶振9 RCC_HSEConfig(RCC_HSE_ON);10//等待外部⾼速时钟晶振⼯作11 HSEStartUpStatus = RCC_WaitForHSEStartUp();12if(HSEStartUpStatus == SUCCESS)13 {14//设置AHB时钟(HCLK)为系统时钟15 RCC_HCLKConfig(RCC_SYSCLK_Div1);16//设置⾼速AHB时钟(APB2)为HCLK时钟17 RCC_PCLK2Config(RCC_HCLK_Div1);18 //设置低速AHB时钟(APB1)为HCLK的2分频(TIM2-TIM5输⼊TIMxCLK频率将为72MHZ/2x2=72MHZ输⼊)19 RCC_PCLK1Config(RCC_HCLK_Div2);20//设置FLASH代码延时21 FLASH_SetLatency(FLASH_Latency_2);22//使能预取指缓存23 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);24//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz25 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);26//使能PLL27 RCC_PLLCmd(ENABLE);28//等待PLL准备就绪29while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);30//设置PLL为系统时钟源31 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);32//判断PLL是否是系统时钟33while(RCC_GetSYSCLKSource() != 0x08);34 }35//允许TIM2的时钟36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);37//允许GPIO的时钟38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);39 }APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。

STM32通用定时器原理及应用

STM32通用定时器原理及应用

一、通用定时器原理STM32系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM 互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。

其它6个为普通定时器,时钟由APB1的输出产生。

下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图:实际上STM32的CPU文档给出的图与这个图略有区别。

但是我们还是想研究这个图。

原因是这个图对我们思路的理解比较有帮助。

从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。

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

可能有同学还是有点不理解,OK,我们举一个例子说明。

假定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之TIM通用定时器

STM32之TIM通用定时器

STM32之TIM通⽤定时器本⽂介绍如何使⽤STM32标准外设库配置并使⽤定时器,定时器就是设置⼀个计时器,待计时时间到之后产⽣⼀个中断,程序接收到中断之后可以执⾏特定的程序,跟现实中的闹钟功能类似。

与延时功能不同,定时器计时过程中程序可以执⾏其他程序。

最简单直观的应⽤为定时翻转指定IO引脚。

本例程使⽤通⽤定时器TIM3,每100ms翻转GPIOB的Pin5输出,如果该引脚外接有LED灯,可以看到LED灯周期性的闪烁。

STM32F103VE系列共有8个定时器,分为基本定时器、通⽤定时器和⾼级定时器,其中通⽤定时器包括TIM2/3/4/5共4个,如果⼀个定时器不够⽤,可以启动其他⼏个定时器。

本⽂适合对单⽚机及C语⾔有⼀定基础的开发⼈员阅读,MCU使⽤STM32F103VE系列。

TIM通⽤定时器分为两部分,初始化和控制。

1. 初始化分两步:通⽤中断、TIM。

1.1. 通⽤中断:优先级分组、中断源、优先级、使能优先级分组:设定合适的优先级分组中断源:选择指定的TIM中断源:TIM3_IRQn优先级:设定合适的优先级使能:调⽤库函数即可1.2. TIM:时钟、预分频器、定时器周期、分频因⼦、计数模式、初始化定时器、开启定时器中断、使能计数器。

结构体:typedef struct{uint16_t TIM_Prescaler;uint16_t TIM_CounterMode;uint16_t TIM_Period;uint16_t TIM_ClockDivision;uint8_t TIM_RepetitionCounter;} TIM_TimeBaseInitTypeDef;时钟:需要使能定时器时钟//开启定时器时钟,即内部时钟CK_INT=72MRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);预分频器:默认定时器时钟频率为72M,那么预分频器设置为71,那么⼀次计数为1us//时钟预分频数为71,则计数器计数⼀次时间为1usTIM_TimeBaseStructure.TIM_Prescaler = 71;定时器周期:设置为999,那么产⽣⼀次定时器中断的时间为1ms//⾃动重装载寄存器为999,则产⽣⼀次中断时间为1msTIM_TimeBaseStructure.TIM_Period = 1000 - 1;计数模式:⼀般选择向上计数模式// 计数器计数模式,选择向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;时钟分频因⼦:⼀般选择1分频// 时钟分频因⼦,选择1分频TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;重复计数器的值:仅对⾼级定时器有效,⽆需设置初始化定时器:调⽤库函数即可//初始化定时器TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);开启定时器中断//开启计数器中断TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);使能计数器//使能计数器TIM_Cmd(TIM3, ENABLE);2. 处理2.1. 中断服务函数定时器TIM3的中断服务函数名称为TIM3_IRQHandler ()。

STM32F103ZET6通用定时器

STM32F103ZET6通用定时器

STM32F103ZET6通⽤定时器1、通⽤定时器简介  通⽤定时器是由⼀个可编程预分频器驱动的16位⾃动装载计数器构成。

通⽤定时器可以应⽤于多种场合,如测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和PWM)。

使⽤通⽤定时器的预分频器和RCC时钟控制器的预分频器,脉冲长度和输出波形周期可以在⼏个微秒到⼏个毫秒间调整。

STM32内有多个通⽤定时器,每个通⽤定时器都是完全独⽴的,没有互相共享任何资源。

通⽤定时器的主要功能包括: 16位向上、向下、向上/向下⾃动装载计数器。

16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值。

4个独⽴通道可以实现4路:输⼊捕获、输出⽐较、PWM输出、单脉冲模式输出。

使⽤外部信号控制定时器和定时器互连的同步电路。

⽀持针对定位的增量(正交)编码器和霍尔传感器电路。

通⽤定时器框图如下:2、通⽤定时器的时基单元 通⽤定时器的时基单元主要由⼀个16位计数器和与其相关的⾃动装载寄存器。

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

通⽤定时器的计数器的时钟由预分频器分频得到,⾄于预分频器之前的时钟在时钟选择的时候回说到。

通⽤定时器的计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,在计数器运⾏时仍可以读写。

如下图红⾊框部分就是通⽤定时器的时基部分: 时基单元包含: CNT计数器(TIMx_CNT)。

PSC预分频器(TIMx_PSC)。

⾃动重装载寄存器(TIMx_ARR)。

CNT 计数器和⾃动重装载寄存器: TIMx_ARR寄存器是预先装载的,写或读TIMX_ARR寄存器将访问预装载寄存器。

通⽤定时器根据TIMx_CR1寄存器中的ARPE 位,来决定写⼊TIMx_ARR寄存器的值是⽴即⽣效还是要等到更新事件(溢出)后才⽣效。

在计数器运⾏的过程中,ARPE位的作⽤如下: 当ARPE = 0时,写⼊TIMx_ARR寄存器的值⽴即⽣效,即TIMx_CNT计数器的计数范围⽴马更新。

stm32定时器原理

stm32定时器原理

stm32定时器原理
STM32定时器是一个硬件计数器,可用于计算时间间隔、触发外
设或执行定期任务等。

它的基本工作原理是通过一个时钟源来驱动计
数器,当计数器达到一个预设值时,就会产生一个中断或触发外设。

STM32的定时器包括多个不同类型的定时器,其中最常用的是通用定时器(TIM)和高级定时器(TIM)。

通用定时器具有多个计数通道和各种计数模式,可用于生成PWM
信号、测量时间间隔、定期触发DMA传输等。

通用定时器通常具有16
位或32位计数器,可以配置为计数器模式、定时器模式或PWM输出模式。

配置定时器时,需要设置时钟源、计数器分频器、计数器周期等
参数。

通常使用的时钟源包括内部时钟、外部时钟和GPIO输入,计数
器分频器可以用来降低时钟频率以适应不同的计数范围,计数器周期
则可以用来设置定时器的时间间隔。

高级定时器主要用于复杂的PWM和定时器应用,它具有更多的计
数通道和计数模式,并支持定制化的计数器功能。

与通用定时器不同,高级定时器通常具有16位和32位计数器,并且可以独立工作或耦合
在一起使用,以实现更高精度的计时和PWM生成。

配置高级定时器时,需要设置时钟源、计数器分频器、计数器周期、PWM占空比等参数。

同时,高级定时器还支持多种触发模式、中断模式和DMA传输模式,可
用于实现各种复杂的功能。

第6章 STM32通用定时器2

第6章 STM32通用定时器2

6.2 通用定时器相关寄存器
预分频器寄存器:TIMx_PSC
预分频器可以将计数器的时钟频率(CK_PSC)按1到 65536之间的任意值分频,它是一个16位寄存器。 这个寄存器带有缓冲区,它能够在工作时被改变。新的 预分频器参数在下一次更新事件到来时被采用。
什么是“更新事件(UEV)”?
“更新事件(UEV)” :当计数器溢出的时候产生一次 UEV事件,另外还可以在事件寄存器TMx_EGR中的UG 位软件写入产生一次事件更新; 当UEV事件来临时,所有影子寄存器载入寄存器中的值 ,从而实现所有带影子寄存器的同步更新;而不启用影 子寄存器的情况下,只能实现写那个寄存器更新那个寄 存器,这可能造成相关联的寄存器产生冲突矛盾。
嵌入式单片机原理及应用
电气工程学院仪器科学与工程系
退出
1 2 3 4 5 6 7 8 9 10 11
ARM嵌入式系统概述 STM32单片机结构和最小系统 基于标准外设库的C语言程序设计基础 STM32通用输入输出GPIO STM32外部中断 STM32通用定时器 STM32通用同步/异步收发器USART 直接存储器存取DMA STM32的模数转换器ADC STM32的集成电路总线I2C STM32的串行外设接口SPI
1. NVIC设置:NVIC用来完成中断分组、中断通道选择、中断优先 级设置及使能中断的功能
声明NVIC结构体 NVIC_InitTypeDef S
选择中断分组 NVIC_PriorityGroupConfig()
设置响应优先级 S.NVIC_IRQChannelSubPriori ty
选择中断通道 S.NVIC_IRQChannel
中断使能 S.NVIC_IRQChannelCmd

STM32高级定时器、通用定时器TIMx、基本定时器TIM6和TIM7的区别

STM32高级定时器、通用定时器TIMx、基本定时器TIM6和TIM7的区别

STM32高级定时器、通用定时器TIMx、基本定时器
TIM6和TIM7的区别
TIM1 和TIM8 定时器的功能包括:●16 位向上、向下、向上/下自动装载计数器●16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535 之间的任意数值●多达4 个独立通道:─输入捕获─输出比较─PWM 生成(边缘或中间对齐模式) ─单脉冲模式输出●死区时间可编程的互补输出●使用外部信号控制定时器和定时器互联的同步电路●允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器●刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态●如下事件发生时产生中断/DMA:─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─输入捕获─输出比较─刹车信号输入●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理TIMx 主要功能通用TIMx (TIM2、TIM3、TIM4 和TIM5)定时器功能包括:●16 位向上、向下、向上/向下自动装载计数器●16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536 之间的任意数值●4 个独立通道:─输入捕获─输出比较─PWM 生成(边缘或中间对齐模式) ─单脉冲模式输出●使用外部信号控制定时器和定时器互连的同步电路●如下事件发生时产生中断/DMA:─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─输入捕获─输出比较●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理TIM6 和TIM7 定时器的主要功能包括:。

stm32_TIM V3.0

stm32_TIM V3.0

每一个定时器都有4个独立通道,并具有输入捕获、输出比较、PWM生成及 单脉冲模式输出。 TIM_OCMode_Timing :输出比较时间模式 (输出引脚冻结无效) TIM_OCMode_Active :输出比较主动模式 匹配时设置输出引脚为有效电平,当计数值为比较/捕获寄存器值相同时,强 制输出为高电平) TIM_OCMode_Inactive :输出比较非主动模式 (匹配时设置输出引脚为无效电平,当计数值为比较/捕获寄存器值相同时,强 制输出为低电平) TIM_OCMode_Toggle :输出比较触发模式 (翻转。当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平) PWM的模式1或模式2中,只有比较结果改变了或在输出比较模式中从冻结模 式切换到pwm的模式时,OC1REF电平才改变。
4.定时器的死区和 刹车功能: 高级定时器TIM1和TIM8具有刹车功能,即刹车管脚有效时强制输出输出低 电平,刹车管脚无效时按正常输出。 TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; TIM_BDTRInitStructure.TIM_DeadTime = 0; TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); 其中: 1) TIM_BreakPolarity 设置了刹车管脚的电平,有TIM_BreakPolarity_Low和 TIM_BreakPolarity_High两种选择,当为TIM_BreakPolarity_Low时,刹车管脚输入 低电平时刹车; TIM_BreakPolarity_High时,刹车管脚输入高电平时刹车。

通用定时器-定时实验

通用定时器-定时实验

通用定时器-定时实验二、预备知识STM32中一共有11个定时器,其中2个高级控制定时器,4个通用定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

编程步骤:1、配置系统时钟;2、配置NVIC;3、配置GPIO;4、配置TIMER;第4项配置TIMER有如下配置:(1)利用TIM_DeInit()函数将Timer设置为默认缺省值;(2)TIM_InternalClockConfig()选择TIMx来设置内部时钟源;(3)TIM_Perscaler来设置预分频系数;(4)TIM_ClockDivision来设置时钟分割;(5)TIM_CounterMode来设置计数器模式;(6)TIM_Period来设置自动装入的值(7)TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器(8)TIM_ITConfig()来开启TIMx的中断其中(3)-(6)步骤中的参数由TIM_TimerBaseInitTypeDef结构体给出。

步骤(3)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。

CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0–65535。

步骤(4)中的时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。

TIM_ClockDivision的参数如下表:数字滤波器(ETR,TIx)是为了将ETR进来的分频后的信号滤波,保证通过信号频率不超过某个限定。

步骤(7)中需要禁止使用预装载缓冲器。

当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。

STM32F4通用定时器详细讲解

STM32F4通用定时器详细讲解
14 TIM3捕获/比较寄存器2 (TIM3_CCR2)
15 TIM3捕获/比较寄存器3 (TIM3_CCR3)
16 TIM3捕获/比较寄存器4 (TIM3_CCR4)
1 Timer3用来做定时中断
与之相关的时基单元寄存器有
10 TIM3计数器(TIM3_CNT)
11 TIM3预分频器(TIM3_PSC)
1TIM3控制寄存器1 (TIM3_CR1)
ቤተ መጻሕፍቲ ባይዱ作用:1使能自动重载TIM3_ARR
2定时器的计数器递增或递减计数。
3事件更新。
4计数器使能
2TIM3控制寄存器2 (TIM3_CR2)
3TIM3从模式控制寄存器(TIM3_SMCR)
4TIM3DMA/中断使能寄存器(TIM3_DIER)
作用:1:使能事件更新中断
定时器时钟上文已经讲了,由于Timer3挂在APB1总线上
故Timer3进入中断的周期为(CK_PSC+1)*(TIM3_ARR+1)/84000000秒
频率为84000000/[(CK_PSC+1)*(TIM3_ARR+1)] Hz
利用官方库函数实现每500ms进入中断,改变LED灯的电平,程序如下
3:外部时钟模式2:外部触发输入TIMx_ETR,仅适用于TIM2、TIM3、TIM4,TIM3,对应着PD2引脚
4:内部触发输入:一个定时器触发另一个定时器。
时钟源可以通过TIMx_SMCR相关位进行设置。这里我们使用内部时钟。
定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK,故当APBx_Prescaler不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK,定时器时钟等于HCLK。

第八章 STM32定时器

第八章 STM32定时器
/*对C端口初始化,即0,1,2,3管脚输出0*/
GPIO_ResetBits(GPIOC,GPIO_Pin_0); GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_ResetBits(GPIOC,GPIO_Pin_2); GPIO_ResetBits(GPIOC,GPIO_Pin_3); }
TIM_Perscaler:用户设定的预分频系数, 其值范围从0~65535,为1999
8.7 TIM2应用实例概述
void Timer_Configuration(void) { /*定义TIM结构体变量*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period=35999; TIM_TimeBaseStructure.TIM_Prescaler=1999; TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_Cmd(TIM2,ENABLE);
8.7 TIM2应用实例概述
4.定时器的初始化
定时时间T的计算公式: T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK =(35999+1)*(1999+1)/72MHz=1s

第六章STM32 定时器的使用

第六章STM32 定时器的使用

}
}
步骤五:配置main函数,实现定时器控制跑马灯。
volatile u32 time;
int i=0;
int main(void) { SystemInit(); //配置系统时钟为72控制跑马灯(P190)
1.理解STM32通用定时器的结构和基本工作原理; 2.掌握STM32通用定时器初始化和操作方法; 3.理解中断概念; 4.掌握STM3中断服务程序的写法。
硬件设计 硬件连接图如下,实验板上stm32f103x处理器
通过配置GPIO实现如下功能:D3~D6轮流点亮,点亮时 间持续1秒。
软件设计 步骤一:添加库函数,以及操作函数。 添加相应库函数:
操作函数有:USER/main.c ;stm32f10x_it.c ;led.h; led.c ;timer.h;timer.c;TIM2_IRQHandler()。 步骤二:在timer.h函数中设置宏定义和函数声明:
void TIM2_NVIC_Config(void); void TIM2_Config(void);
TIN_TimBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = (10000 - 1); //自动重装的计数值
TIM_TimeBaseStructure.TIM_Prescaler =7200-1 ; // 预分频系数
立即加载计数器(ARPE=0)
更新事件时加载计数器(ARPE=0)
6.2.2 计数器模式 1. 向上计数模式:计数器从0计数到设定的数值,然 后重新从0开始计数并且产生一个计数器溢出事件。
计数器时序图(内部时钟分频因子为1)

STM32通用定时器

STM32通用定时器

STM32的定时器功能很强大,学习起来也很费劲儿.其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER做个剖析。

实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用……TIMER主要是由三部分组成:1、时基单元。

2、输入捕获。

3、输出比较。

还有两种模式控制功能:从模式控制和主模式控制。

一、框图让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了…为了方便的看图,我对里面出现的名词和符号做个注解:TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输入ETRP:分频后的外部触发输入 ETRF:滤波后的外部触发输入ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。

TI1FP1/2:滤波后定时器1/2的输入TRGI:触发输入 TRGO:触发输出CK_PSC:应该叫分频器时钟输入CK_CNT:定时器时钟。

(定时周期的计算就靠它)TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号xICx:输入比较x ICxPS:分频后的ICxOCx:输出捕获x OCxREF:输出参考信号关于框图还有以下几点要注意:1、影子寄存器。

有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);(详细请参考版主博客/STM32/401461/message.aspx)2、输入滤波机制在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率Fdts来采样N次进行滤波的。

STM32定时器所支持的三种计数模式及计数过程

STM32定时器所支持的三种计数模式及计数过程

STM32定时器所支持的三种计数模式及计数过程STM32常规定时器主要包括基本定时器、通用定时器和高级定时器。

不论哪一类定时器,都有个共同的计数定时单元,我们把它称之为时基单元。

该单元主要由三部分组成:分频模块、计数模块、自动重装载模块。

分频模块用来对外来的计数时钟进行分频,这里有个分频计数器,通过它来实现对时钟的分频功能。

与之对应的有个分频器寄存器TIMx_PSC,用来配置和存放分频比、分频系数。

计数模块用来对来自分频器输出的计数脉冲进行计数。

相应的这里有个寄存器—计数器寄存器TIMx_CNT,为了把该计数器跟别的计数器区别开来,不妨称它为核心计数器。

自动重装载模块用来配合计数器溢出,当计数器溢出时为之赋予初始计数值的功能单元。

与之相应的有个自动重装载寄存器TIMx_ARR.当自动重装载寄存器TIMx_ARR修改生效后就可以自动地作为计数器的计数边界或重装值。

关于自动重装及自动重装载寄存器TIMx_ARR是个相对比较难理解的地方,尤其关于ARR寄存器数据的含义。

我们在看STM32参考手册时,很难一下子理解得很到位,往往需要结合上下文内容反复阅读后去领会。

关于计数器的溢出与重装,在手册里只有些零散且并不算清晰的介绍,这里尽力跟大家做些交流,以供参考。

当计数器溢出时,自动重装载器为计数器重装计数初始值。

自动重装寄存器【ARR】为计数器设置计数边界或初始值,决定计数脉冲的多少或计时周期长短。

比如:计数器向上计数时,计到多少发生溢出;向下计数时从多少开始往下计数。

平常我们泛泛地说ARR寄存器为计数器提供计数边界或重装值,但它的具体含义及使用需要结合计数器的计数模式才能确定。

那一起看看STM32定时器所支持的三种计数模式及计数过程。

【文中图片可以点击放大观看】。

STM32学习笔记(5):通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出1.TIMER输出PWM基本概念脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

简单一点,就是对脉冲宽度的控制。

一般用来控制步进电机的速度等等。

STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM 输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。

1.1PWM输出模式STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。

模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。

而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。

1.2PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7定时器复用功能重映射”一节。

在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。

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

STM32通用定时器
一、定时器的基础知识
三种STM32定时器区别
通用定时器功能特点描述:
STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
位于低速的APB1总线上(APB1)
16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。

16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。

4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
①输入捕获
②输出比较
③ PWM 生成(边缘或中间对齐模式)
④单脉冲模式输出
可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。

如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):
①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
③输入捕获
④输出比较
⑤支持针对定位的增量(正交)编码器和霍尔传感器电路
⑥触发输入作为外部时钟或者按周期的电流管理
STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。

使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。

STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

定时器框图:
倍频得到),外部时钟引脚,可以通过查看数据手册。

也可以是TIMx_CHn,此时主要是实现捕获功能;
框图中间的时基单元
框图下面左右两部分分别是捕获输入模式和比较输出模式的框图,两者用的是同一引脚,不能同时使用。

二、定时器相关的寄存器和寄存器操作库函数
时钟选择, 计数器时钟可以由下列时钟源提供:
时钟选择
①内部时钟(CK_INT)
②外部时钟模式1:外部输入脚(TIx)
③外部时钟模式2:外部触发输入(ETR)
④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

内部时钟选择
时钟计算方法:
除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。

计数器模式,通用定时器可以向上计数、向下计数、向上向下双向计数模式。

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

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

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

向下计数模式(时钟分频因子=1)
定时器中断实验相关寄存器
计数器当前值寄存器CNT
预分频寄存器TIMx_PSC
自动重装载寄存器(TIMx_ARR)
控制寄存器1(TIMx_CR1)
DMA中断使能寄存器(TIMx_DIER)
常用库函数
定时器参数初始化:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); 定时器使能函数:
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalStateNewState)
定时器中断使能函数:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalStateNewState);
状态标志位获取和清除
FlagStatusTIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatusTIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
三、编程实现
定时器中断实现步骤
①能定时器时钟。

RCC_APB1PeriphClockCmd();
② 初始化定时器,配置ARR,PSC。

TIM_TimeBaseInit();
③开启定时器中断,配置NVIC。

void TIM_ITConfig();
NVIC_Init();
④ 使能定时器。

TIM_Cmd();
⑥ 编写中断服务函数。

TIMx_IRQHandler();
Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk
程序示例:
void TIM_Init(int arr,int pse){
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructe;
NVIC_InitTypeDef NVIC_InitStruct;
//1.能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//2.初始化定时器,配置ARR,PSC
TIM_TimeBaseInitStructe.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructe.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructe.TIM_Period = arr;
TIM_TimeBaseInitStructe.TIM_Prescaler = pse;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructe);
//3.开启定时器中断,配置NVIC
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
//4.使能定时器
TIM_Cmd(TIM2,ENABLE);
}
//5.编写中断服务函数
void TIM2_IRQHandler(){
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){
if(GPIO_ReadOutputDataBit(GPIOF,GPIO_Pin_6))
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
else
GPIO_SetBits(GPIOF,GPIO_Pin_6);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}。

相关文档
最新文档