STM32入门篇之通用定时器彻底研究

合集下载

05_STM32F4通用定时器详细讲解精编版

05_STM32F4通用定时器详细讲解精编版
1打开时钟,Timer3挂在APB1上,所以命令开启时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟
2时钟Timer3的配置。
TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装载值
Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1
主要功能是:1输入捕获——测量脉冲长度。
2输出波形——PWM输出和单脉冲输出。
Timer3有4个时钟源:
1:内部时钟(CK_INT),来自RCC的TIMxCLK
2:外部时钟模式1:外部输入TI1FP1与TI2FP2
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
3使能中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断。
4打开Timer3。
TIM_Cmd(TIM3,ENABLE); //使能定时器3
3:捕获/比较选择
8TIM3捕获/比较模式寄存器2 (TIM3_CCMR2)
9TIM3捕获/比较使能寄存器(TIM3_CCER)
1:上升沿触发or下降沿触发
2:捕获/比较输出使能
10 TIM3计数器(TIM3_CNT)
11 TIM3预分频器(TIM3_PSC)
计数器时钟频率CK_CNT等于fCK_PSC/ (PSC[15:0] + 1)。
1TIM3控制寄存器1 (TIM3_CR1)
作用:1使能自动重载TIM3_ARR

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 ()。

STM32通用定时器

STM32通用定时器

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的预分频器。

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通用定时器基本定时功能与PWM

STM32通用定时器基本定时功能与PWM

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)·外部时钟模式1:外部输入脚(TIx)·外部时钟模式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仍然可以得到较高的时钟频率。

2.2计数器模式TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。

STM32通用定时器库函数设置心得——新手必看

STM32通用定时器库函数设置心得——新手必看

STM32通用定时器库函数设置心得——新手必看STM32通用定时器是STM32微控制器系列中很重要的一个组件,它具有多种功能,包括定时器、PWM生成器、输入捕获和输出比较等。

在STM32中,定时器的使用非常广泛,常用于各种定时操作、计数操作和脉冲宽度调制等应用。

本文将对STM32通用定时器的库函数进行介绍,帮助新手快速掌握并应用。

首先,在使用STM32通用定时器之前,需要了解一些基本概念。

STM32通用定时器包括TIM2、TIM3、TIM4和TIM5等,它们具有相似的特性和功能,可以根据实际需求选择使用。

在使用定时器之前,需要开启其时钟,并进行相应的初始化设置。

1.定时器时钟的开启和初始化开启定时器的时钟,需要在RCC时钟控制寄存器中设置相应的位。

具体来说,需要设置APB1或APB2总线上的定时器时钟使能位,开启相应定时器的时钟。

初始化定时器,需要对定时器的模式、预分频值、计数模式、自动重装载寄存器和定时器中断进行设置。

其中,预分频值决定了定时器的时钟频率,计数模式决定了定时器的工作方式,自动重装载寄存器决定了定时器的溢出时间。

2.定时器中断的设置定时器中断用于定时触发一些操作,可以是定时执行一些函数、改变一些变量或者触发其中一种事件。

定时器的中断分为溢出中断和比较中断两种,可以根据实际需求选择使用。

在使用定时器中断之前,需要设置定时器的中断使能位,并在中断处理函数中编写相应的中断处理代码。

在中断处理函数中,可以根据具体需求进行相应的操作,比如改变一些标志位、执行一些函数或者发送一些数据。

3.定时器的计数和计时定时器的计数和计时是定时器的核心功能,它决定了定时器的工作方式和定时器值的变化规律。

定时器的计数可以根据实际需要进行设置,可以是向上计数、向下计数或者上下计数。

定时器的计时功能需要根据预分频值和自动重装载寄存器进行计算,以确定定时器的溢出时间和定时时间。

通过改变预分频值和自动重装载寄存器,可以实现不同的定时功能。

STM32通用定时器库函数设置心得——新手必看

STM32通用定时器库函数设置心得——新手必看

通用定时器STM32的通用定时器为:TIM2、TIM3、TIM4和TIM5在使用通用定时器时利用库函数直接设置定时器如下:1.使能定时器TIM_X的时钟:(X=2、3、4、5)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE);2.计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),其中计算关系如下:系统时钟(一般为72MHZ) = 定时器分频数 * 计数值假如分频数为7200,则定时器时钟为:72MHZ/7200=10KHZ,定时器每次计数时间间隔为1/10000秒,假如定时1秒,则要计数10000次,因此计数器的最大计数值为9999,因为计数器从零开始计数。

3.将计算好的分频数和计数值分别赋值以上面定时为例,如下:/自动重装的计数值TIM_TimeBaseStructure.TIM_Period = (10000 - 1);// 这个就是预分频系数TIM_TimeBaseStructure.TIM_Prescaler =7200 ;//数字滤波器,定时的时候不涉及此功能,为零即TIM_TimeBaseStructure.TIM_ClockDivision = 0;//计数模式选择,此处设置为向上模式TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounteMode_Up;//定时基本设置((X=2、3、4、5))TIM_TimeBaseInit(TIMX, &TIM_TimeBaseStructure);//清除定时器X的中断溢出标识TIM_ClearITPendingBit(TIMX, TIM_IT_Update);//开定时器X溢出中断TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);//计数器使能,开始工作TIM_Cmd(TIM5, ENABLE);到此通用定时器的定时功能配置完成,以上配置代码可写入void TIMX_Init(void)函数中,函数名自己可变。

stm32通用定时器

stm32通用定时器

stm32通用定时器STM32 的定时器功能十分强大,有TIME1 和TIME8 等高级定时器,也有TIME2~TIME5 等通用定时器,还有TIME6 和TIME7 等基本定时器和看门狗定时器以及系统时基定时器。

基本定时器(TIM6,TIM7)的主要功能:只有最基本的定时功能,基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。

通用定时器(TIM2~TIM5)的主要功能:除了基本的定时器的功能外,还具有测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。

高级定时器(TIM1,TIM8)的主要功能:高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等等。

两个看门狗定时器:独立看门狗、窗口看门狗。

系统时基定时器:SysTick,24位递减计数器,自动重加载,常用于产生延时ms级、us 级。

1、STM32 通用定时器简介STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的16 位自动装载计数器(CNT)构成。

STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。

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

STM32 的通用定时器TIMx (TIM2、TIM3、TIM4 和TIM5)功能包括:1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

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

3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:A.输入捕获。

STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究

STM32入门篇之通用定时器彻底研究STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。

写下下面的文字送给后来者,希望能带给你点启发。

在此声明,本人也是刚入门,接触STM32不足10天,所以有失误的地方请以手册为准,欢迎大家拍砖。

其实手册讲的还是挺全面的,只是无奈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次进行滤波的。

05_STM32F4通用定时器详细讲解

05_STM32F4通用定时器详细讲解

05_STM32F4通用定时器详细讲解STM32F4系列共有14个定时器,功能很强大。

14个定时器分别为:2个高级定时器:Timer1和Timer810个通用定时器:Timer2~timer5 和 timer9~timer142个基本定时器: timer6和timer7本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。

Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。

2 输出波形——PWM 输出和单脉冲输出。

Timer3有4个时钟源:1:内部时钟(CK_INT ),来自RCC 的TIMxCLK2:外部时钟模式1:外部输入TI1FP1与TI2FP23:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应着PD2引脚4:内部触发输入:一个定时器触发另一个定时器。

时钟源可以通过TIMx_SMCR 相关位进行设置。

这里我们使用内部时钟。

定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。

例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。

《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个,以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。

1 TIM3 控制寄存器 1 (TIM3_CR1)SYSCLK(最高AHB_Prescaler APBx_Prescaler作用:1使能自动重载TIM3_ARR2定时器的计数器递增或递减计数。

stm32通用定时器详解

stm32通用定时器详解

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

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

其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的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定时器一、STM32定时器概述STM32有8个16位定时器,根据功能分为三种:1)TIM6和TIM7是基本定时器,只具有基本定时功能,即计数值超过预设值后触发中断或DMA请求,与51单片机相似;2)TIM2,TIM3,TIM4,TIM5是通用定时器,除了基本定时器的功能外,还具有输入捕获和输出比较的功能,输入捕获可以用于测量输入脉冲的频率及脉冲宽度,输出比较可以输出PWM;3)TIM1和TIM8为高级定时器,该定时器内部结构相对复杂,比通用定时器多了BRK和DTG两个结构,即多了刹车和死区时间控制的功能,隐刺适用于电机控制。

二、基础/通用定时器TIMx_CNT为计数器,当累加或递减到重载寄存器TIMx_ARR的值时,产生溢出事件,但通用定时器比基本定时器多了一个捕获/比较寄存器TIMx_CCR才具有输入捕获和输出比较的功能,当用于输入时,该寄存器为捕获寄存器,当用于输出时,该寄存器为比较寄存器。

下面简介两种模式下的工作过程分析。

1.输入功能首先将定时器配置为向上计数,并设定好重载值,若被测量信号足够长,应当把重载寄存器TIMx_ARR中的值设得大一点。

此时TIMx_CCR是作为捕获寄存器,测量脉冲信号的过程分为以下三个过程:1)待测量的信号通过GPIO引脚输入到脉冲测量通道,当信号的上升沿来临时,脉冲计数器TIMx_CNT的值清零;2)TIMx_CNT开始累加,直到被测信号的下降沿来临,捕获寄存器TIMx_CCR2将TIMx_CNT中的值x存储下来;3)当被测信号的上升沿再次来临时,TIMx_CCR1将TIMx_CNT中的值y存储下来,然后TIMx_CNT清零,到此被测信号的一个周期结束。

由上可知,被测信号的周期为y+1个定时器周期,占空比为(x+1)/(y+1)。

2.输出功能此模式下TIMx_CCR 为比较寄存器,先将定时器配置为向上/向下计数,重载寄存器TIMx_ARR 的值为N ,比较寄存器TIMx_CCR 值为M ,计数器不断累加/递减,计数值与M 比较,比它大/小时输出高电平,反之低电平,也就生成了PWM 波,占空比Duty=M/(N+1),这些模式可以在定时器PWM 结构体中的相应值配置。

STM32的定时器

STM32的定时器

STM32的定时器调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。

我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。

然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。

理论上应该是行的通的。

刚开始俺使用的是TIM2的1 2 3通道,TIM4的2通道来进行频率的测量。

由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了。

请看一开始的程序,以TIM2的1,3通道为例子:TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道1TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_Dire ctTI; // 通道方向选择TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获TIM_ICInitStructure.TIM_ICFilter = 0x0; //TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; //选择通道3TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_Dire ctTI; //TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获TIM_ICInitStructure.TIM_ICFilter = 0x0; //TIM_ICInit(TIM2, &TIM_ICInitStructure);这个是输入捕获配置还需要做的工作就是(参考stm32参考手册的TIM的结构框图):/* Select the TIM2 Input Trigger: TI2FP2 【输入触发源选择】*/TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位/* Select the slave Mode: Reset Mode */TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); / /复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号/* Enable the Master/Slave Mode */TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_ Enable);//主从模式选择这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。

基于stm32通用定时器设置的学习心得

基于stm32通用定时器设置的学习心得

基于stm32通用定时器设置的学习心得为APB1 总线,所以首先,得将APB1 外设时钟打开。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);其次,就是定时器的相关参数信息的配置,这些参数信息都在TIM_TimeBaseInitTypeDef 这么一个结构体当中,所以得定义这么一个结构体变量。

结构体中的有关成员含义如下:TIM_TimeBaseInitStrcture.TIM_Prescaler = 0x1c20; //时钟预分频系数,看单词意思就知道了,即是将APB1 时钟进行相应分频得到一个合适的频率TIM_TimeBaseInitStrcture.TIM_CounterMode = TIM_CounterMode_Up; //计数模式TIM_TimeBaseInitStrcture.TIM_Period = 0x270f; //计数周期,即是往ARR 寄存器中填的一个自动转载值,这个值等于目标值-1TIM_TimeBaseInitStrcture.TIM_ClockDivision=TIM_CKD_DIV1; //这是数字滤波器的相关设置,定时的时候不用外部时钟,所以这个设为0 即可,TIM_CKD_DIV1 这个就是等价于0,你要是设为其他值也不影下面自然是初始化这个结构体当中的参数信息了。

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStrcture);再次,就是定时器中断的相关配置了,在配置中断的时候特别一定要注意顺序,否则就会出问题,我一开始就是没注意这个顺序问题,看着错误还不知道怎么回事,还好后面被我发现,哈哈。

在使能中断之前一定得先清掉中断中断标志位和中断挂起位,如下:TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);如果不先清掉挂起位和标志位,那么一使能中断,就立马进入中断服务函数,显然这不是我们想要的,我就被这个问题整了一下。

STM32之通用定时器

STM32之通用定时器

STM32之通用定时器STM32 中的定时器有多种,按功能分成2 个高级控制器定时器,4 个普通定时器,2 个基本定时器,2 个看门狗定时器,1 个系统滴答定时器SysTick。

定时器的关键是定时时间的计算。

比如用定时器控制继电器的开关的时候,需要延时一段时间才关闭或者开启,这时候离不开定时器定时。

通用定时器定时时间计算。

1 秒中断的基本实现:通用定时器模块的入口时钟经过分频得到计数器的时钟,用CK_CNT 表示,预分频器的系数为:TIMx_PSC,当TIMx_PSC=0 时,表示不分频,=1 时,2 分频。

以此类推。

公式为:CK_CNT=fclk_PSC/(PSC[15:0]+1),其中PSC 最大为65535.其次是TIM5 计数器的计数值的设置,TIM5 计数器以CK_CNT 为时钟来计数。

计数到设定值产生中断。

(1/分频后计数时钟)*计数值=设定时间。

以1 秒为例(1/(72MHz/7200))*10000=1s初始化通用定时器的一个重要的结构体TIM_TimeBaseInitTypeDefvoid TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef * TIM_TimeBaseInitStruct) 初始化TIMx 定时器时间基数单位。

其次还要清除中断待处理位,函数voidTIM_ClearITPendingBit(TIM_TypeDef* TIMx, u16 TIM_IT) 做了这项工作。

其中TIM_IT:待检查的TIM 中断待处理位。

void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState。

STM32定时器解析

STM32定时器解析
FunctionalState NewState) TIMx:x可以是2,3或者4,来选择TIM外设 NewState: 外设TIMx的新状态,ENABLE或者DISABLE 例:
/* Enables the TIM2 counter */ TIM_Cmd(TIM2, ENABLE);
函数TIM _ITCONFIG
更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/ 外部触发) ;
触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ; 输入捕获; 输出比较 ; 支持针对定位的增量(正交)编码器和霍尔传感器电路; 触发输入作为外部时钟或者按周期的电流管理。
6.2 通用定时器TIMX相关寄存器
状态寄存器(TIMX_SR)
位0 (UIF):更新中断标记 (Update interrupt flag) 当产生更新事件时该位由硬件置’1’。它由软件清’0’。 0:无更新事件产生; 1:更新中断等待响应。 当寄存器被更新时该位由硬件置’1’:
− 若TIMx_CR1寄存器的UDIS=0、URS=0,当TIMx_EGR寄存器的UG=1时产生更 新事件(软件对计数器CNT重新初始化);
例: /* Clear the TIM2 Capture Compare 1 flag */ TIM_ClearFlag(TIM2, TIM_FLAG_CC1);
函数TIM_CLEARITPENDINGBIT
功能描述:清除TIMx的中断待处理位 函数原形:void TIM_ClearITPendingBit (TIM_TypeDef* TIMx, u16
TIM_CounterMode_Down
TIM 向下计数模式
TIM_CounterMode_CenterAligned1 TIM 中央对齐模式1计数模式

stm32f407之通用定时器

stm32f407之通用定时器

stm32f407之通用定时器
通用定时器
通用定时器(TIM2 to TIM5)包括由可编程的分频器驱动一个的16位或32位自动重载计数器。

它们可用于多种用途,包括测量输入信号的脉冲长度(输入捕获)或生成的输出波形(输出比较和PWM)。

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

它们是完全独立的,不共享任何资源。

主要特点:
通用TIMx定时器功能包括:
1. 16位(TIM3和TIM4)或32位(TIM2和TIM5)计数器,向上,向下,向上/向下自动重装计数。

2. 16位可编程预分频器(可在运行时改变)用于在1到65535之间细分计数器的时钟频率。

3. 多达4个独立的通道可用于:
- 输入捕捉
- 输出比较
- PWM生成(边缘和中心对齐模式)
- 单脉冲输出模式
4. 使用外部信号控制定时器和定时器互连的同步电路
5. 对以下事件中断/ DMA的生成:
- 更新:计数器溢出/下溢,计数器初始化(通过软件或内部/外部触发)
- 触发事件(计数器开始,停止,初始化或内部/外部触发计数)
- 输入捕捉
- 输出比较
6. 支持针对定位增量(正交)编码器和霍尔传感器电路
7. 触发输入作为外部时钟或者按周期的电流管理。

STM32通用定时器使用详解

STM32通用定时器使用详解

STM32通用定时器使用详解1.通用定时器基本介绍•通用定时器包括TIM2、TIM3、TIM4和TIM5•STM32通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。

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

它们可以一起同步操作。

•定时器可以进行定时器基本定时,输出4路PWM,输入捕获o本文详细介绍这三个功能并且利用定时器3并且示例代码使用2.开发环境开发平台:keil5单片机:STM32F103ZET63.基本定时功能3.1定时器时钟来源分析STM32部分时钟树:3.1.1 首先我们我们的系统时钟(SYSCLK 72MHz)经过AHB分频器给APB1外设,但是APB1外设最大的只能到36Mhz,所以必须要系统时钟的二分频。

下面又规定了如果APB1预分频系数为1则频率不变,否则频率X2至定时器2~7,所以定时器2~7的时钟频率为还是72MHz3.1.2 分配给我们定时器的时钟是72MHz,我们可以根据自己的需求再设置定时器的分频,设置它的定时值/** 初始化定时器的时候指定我们分频系数psc,这里是将我们的系统时钟(72MHz)进行分频* 然后指定重装载值arr,这个重装载值的意思就是当我们的定时器的计数值达到这个arr时,定时器就会重新装载其他值.例如当我们设置定时器为向上计数时,定时器计数的值等于arr之后就会被清0重新计数* 定时器计数的值被重装载一次被就是一个更新(Update)* 计算Update时间公式Tout = ((arr+1)*(psc+1))/T clk公式推导详解:Tclk是定时器时钟源,在这里就是72Mhz我们将分配的时钟进行分频,指定分频值为psc,就将我们的T clk分了psc+1,我们定时器的最终频率就是T clk/(psc+1) MHz 这里的频率的意思就是1s中记T clk/(psc+1)M个数(1M=10的6次方) ,每记一个数的时间为(psc+1)/Tclk ,很好理解频率的倒数是周期,这里每一个数的周期就是(psc+1)/T clk 秒然后我们从0记到arr 就是 (arr+1)*(psc+1)/T clk举例:比如我们设置arr=7199,psc=9999我们将72MHz (1M等于10的6次方) 分成了(9999+1)等于7200Hz就是一秒钟记录9000数,每记录一个数就是1/7200秒我们这里记录9000个数进入定时器更新(7199+1)*(1/7200)=1s,也就是1s进入一次更新Update*///简单进行定时器初始化,设置预装载值和分频系数void MY_TIM3_Init(u16 arr,u16 psc){//初始化结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//1.分配时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//2.初始化定时器相关配置TIM_TimeBaseStructure.TIM_Period = arr;TIM_TimeBaseStructure.TIM_Prescaler = psc;/*在这里说一下这个TIM_ClockDivision 是设置与进行输入捕获相关的分频设置的这个值不会影响定时器的时钟频率,我们一般设置为TIM_CKD_DIV1,也就是不分频*/TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//3.打开定时器TIM_Cmd(TIM3,ENABLE);}/****************** 主函数 ********************///在主函数中我们可以调用初始化int main(){//定时器初始化MY_TIM3_Init(7199,9999);while(1){//检测更新标志位if(TIM_GetFlagStatus(TIM3,TIM_IT_Update)){//清除标志位TIM_ClearFlag(TIM3,TIM_IT_Update);//....(每隔一秒执行任务)}}}4.定时器输出PWM4.1基本介绍4.1.1 PWM是脉冲宽度调制,我们是通过改变脉冲的宽度来达到改变输出电压的效果,本质上就是调节占空比实现的,STM32除了基本定时器(TIM6,TIM7)不能输出PWM以外,其它的定时器都具有输出PWM,其中高级定时器(TIM1和TIM8)还能输出7路PWM,基本定时器(TIM2,TIM3,TIM4,TIM5)也可以输出4路PWM输出PWM是很有用的,比如我们可以通过控制电机来玩小车,或者通过输出PWM改变LED的亮度,制造呼吸灯等等4.1.2 我们通用定时器能输出PWM的IO口是固定的,虽然我们可以通过重映射可以改变引脚,具体是哪一些IO口我们要通过查阅STM32的参考手册这里涉及到一个重映射的概念,重映射就是管脚的外设功能映射到另一个管脚,但是不是可以随便映射的,具体对应关系参考手册上的管脚说明。

STM32 通用定时器基本原理

STM32 通用定时器基本原理
计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开 始计数并且产生一个计数器溢出事件。
②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后 从自动装入的值重新开始,并产生一个计数器向下溢出事件。
《手把手教你学STM32》
通用定时器基本 原理
适用平台
STM32F1xx 开发板
STM32F4xx 开发板
通用定时器
参考资料:
战舰/精英STM32F1开发板
《STM32F1开发指南-库函数版本》-第13,14,15章
miniSTM32F1开发板
《STM32不完全手册-库函数版本》 -第12,13,14章


DMA请

高级定时器
16 向上,向下,
(TIM1,TIM8)
向上/下
可以
通用定时器
16 向上,向下,
(TIM2~TIM5)
向上/下
可以
基本定时器 (TIM6,TIM7)
16 向上,向下, 向上/下
可以
捕获/比 互补输 较通道 出
4

4

0

特殊应用场景
带死区控制盒紧急刹车, 可应用于PWM电机控制 通用。定时计数,PWM输 出,输入捕获,输出比较
③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1, 产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然 后再从0开始重新计数。
通用定时器概述
通用定时器工作过程:
通用定时器概述
内部时钟CK_INT

基于stm32单片机的通用定时器配置

基于stm32单片机的通用定时器配置

基于stm32单片机的通用定时器配置stm32单片机的定时器资源相当丰富,它的定时器分为高级控制定时器、通用定时器和基本定时器,具体这些定时器资源在哪个系列的片子有就得看不同的片子的手册了。

他们具体有什么区别,我也是刚接触这个,看他的数据手册介绍也是茫然,主要是刚开始摸,那些功能都没用到,反正用做定时作用的话哪种定时器都行。

在这我就把我自己配置通用定时器的方法及心得简短做个总结,以防以后忘记了。

我配置的是定时器2(TIM2)。

通用定时器的时钟可来自于外部或内部,选用默认即是采用内部的。

通用定时器的时钟来源为APB1总线,所以首先,得将APB1外设时钟打开。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);其次,就是定时器的相关参数信息的配置,这些参数信息都在TIM_TImeBaseInitTypeDef这么一个结构体当中,所以得定义这么一个结构体变量。

结构体中的有关成员含义如下:TIM_TimeBaseInitStrcture.TIM_Prescaler = 0x1c20; //时钟预分频系数,看单词意思就知道了,即是将APB1时钟进行相应分频得到一个合适的频率TIM_TimeBaseInitStrcture.TIM_CounterMode = TIM_CounterMode_Up; //计数模式TIM_TimeBaseInitStrcture.TIM_Period = 0x270f; //计数周期,即是往ARR寄存器中填的一个自动转载值,这个值等于目标值-1TIM_TimeBaseInitStrcture.TIM_ClockDivision=TIM_CKD_DIV1; //这是数字滤波器的相关设置,定时的时候不用外部时钟,所以这个设为0即可,TIM_CKD_DIV1这个就是等价于0,你要是设为其他值也不影下面自然是初始化这个结构体当中的参数信息了。

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

STM32入门篇之通用定时器彻底研究STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。

写下下面的文字送给后来者,希望能带给你点启发。

在此声明,本人也是刚入门,接触STM32不足10天,所以有失误的地方请以手册为准,欢迎大家拍砖。

其实手册讲的还是挺全面的,只是无奈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/263170/message.aspx)3、输入引脚和输出引脚是相同的。

二、时基单元时基单元有三个部分:CNT、PSC、ARR。

CNT的计数方式分三种:向上、向下、中央对齐。

通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1.三、时钟源的选择这个是难点之一。

从手册上我们看到共有三种时钟源:1、内部时钟。

也就是选择CK_INT做时钟,这个简单,但是有一点要注意,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

例如AHP 72M,APB1 2分频36M,那么TIMER就是APB1的2倍频,即72M。

怎么选择内部时钟呢?只要将SMCR中SMS[2:0]弄成000就好了SMCR2、外部时钟模式1这个比较麻烦,时钟源选择的其实就是TRGI(触发输入),但触发输入选择挺多的,共8个……。

看框图,他们是:ITRx、TI1F_ED、TI1FP1、TI2FP2、ETRFITRx的东西跟定时器的级联有关,暂时不管他。

要进入这种时钟模式首先置SMS为111,当然这还没完,不像内部时钟那样,什么都配好了,这里你还得配置一下别的参数,比如选择TI1FP1,自然要对输入通道1的参数配置好,这样时钟才能按你需要的方式进来。

就是配框图这块相关寄存器CCMR1(输入)CCER15 14131211 10 9 8 7 6 5 432 10SMCR(CCIP)然后在SMCR中选择触发源(TS[2:0])为TI1这样输入通道就配好了!最后选择SMS为111,开启时钟(CR1中的CEN)。

现在时钟就是从TI1上的输入了,可以接个时钟源进行计数之类的。

同理,如果要用ETR就把它相关通道配好就可以了。

3、外部时钟模式2选择外部输入作为时钟,看框图:从图上可以看出ETR可以直接作为时钟输入也可以通过触发输入(TRGI)来作为时钟输入即在时钟模式1中触发源选择为ETR,两个效果上是一样的,看起来好像这个外部时钟模式2没什么用处,实际上不是的,他可以跟一些从模式(复位、触发、门控)进行组合。

比如当从模式选为触发时,我们不可能再通过触发源选择ETR了,因为从模式控制器被占了,好在有外部时钟模式2,我们选择这种模式后就可以把两者组合在一起完成一些功能了。

总结一下,STM32的时钟选择比较特别,在SFR中关于时钟选择配置位不再一块,不是说两个位在一起00、01、11就选择了而是由SMCR中SMS和ECE 来控制,这样感觉可以吧内部时钟与外部模式2同时打开(SMS:000,ECE:1),也可以吧外部模式1和外部模式2同时打开(SMS:111,ECE:1),实际上上述两种方式用的都是外部时钟2. 四、捕获比较通道这就是我说的定时器三个组成部分中的两个部分了。

核心是那个捕获比较寄存器。

看框图异或那块先不管他,好像跟编码器有关,输入有个特色就是可以把TI的输入搞到CC1上去,也可以把T2的输入搞到CC1上去,其实也可以把T1搞到CC1上去同时把T1搞到CC2上去,这样就有了后来的PWM输入。

输出上的特色是不直接输出,而是有个OC1REF,这样可以定义高有效还是低有效,输出自己需要的有效电平。

五、做实验讲了这么多你一定烦了吧,那么让我们搞点实际的吧,通过做实验来熟悉定时器,用到新知识时再在其中加以介绍。

实验一:TIMER-1:定时器上溢,中断中取反LED.现象:LED 周期2秒闪烁。

主要代码如下:TIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period=2000; //ARR的值TIM_TimeBaseStructure.TIM_Prescaler=0;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate);//时钟分频系数36000,所以定时器时钟为2KTIM_ARRPreloadConfig(TIM2, DISABLE);//禁止ARR预装载缓冲器 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);TIM_Cmd(TIM2, ENABLE); //开启时钟解释一下,首先得配好ARR,这是必须地。

然后配置预分频,为什么我先配为0再用TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate)配呢,原来PSC也有个预装载功能,却不像ARR和CRR那样有相关的位控制立即装载或更新事件装载。

也就是说只能更新事件来装载。

在上面函数中手工产生了一个更新事件,使PSC立刻生效。

CK_DIV暂时没用到。

计数模式配置为向上计数。

然后在中断中做下LED取反就可以了。

溢出周期怎么算?在这个实验里AHB为72M,APB1为36M,所以CK_INT为72M,36000分频变为2K.ARR=2000,所以1秒溢出1次。

相关寄存器:CR1ARRPSC接下来的4个实验跟输出通道有关系实验2TIMER-2:强置输出现象:LED 常亮例子比较简单关键是配好输出通道CCER15 14131211 10 9 8 7 6 5 432 10将通道1配为输出,输出使能,输出极性选择好,输出模式选择好就可以了。

在V100实验板上PC6-9接了LED,刚好对应着TIMER3重映射后的输出,注意程序里的AFIO函数。

实验3TIMER-3:输出比较现象:LED 2秒的周期闪烁。

跟上个实验配置大致相同,只是把输出模式改为翻转功能,并且CRR要配好,当CRR=CNT时翻转输出。

实验4TIMER-4:PWM输出现象:输出4种不同占空比的PWM波,4个LED亮度不同。

实验5TIMER-7:单脉冲方式现象:LED 只闪烁一次。

将上个实验加一句话TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single); //设置单脉冲模式就是这个实验。

其实手册上关于此实验的本意是由一个外部触发使能计数器,然后产生一个脉冲的,这里还没涉及从模式所以简化处理。

涉及寄存器CR1接下来再做两个输入的实验实验6TIMER-5:输入捕获模式。

现象:通过V100 的JOYSTICK键的SELECT键进入捕获,硬件仿真看CRR的值。

首先是基本的配置:ARR的值、时钟PSC、采样CKD、计数方式。

然后配置输入通道。

选择输入捕获模式、输入极性、把T1配到CC1上、选好输入的滤波跟分频,就可以了。

讲下输入滤波功能,在此实验中Fdts=CK_INT/2,Fsample=Fdts/4,所以定时器时钟为2K,所以采样周期为4ms。

才8次的话周期小于32ms的干扰会滤除。

相关寄存器CR19 8 7 6 5 4 3 2 1 0ARRCCMR1(输入)CCER实验7TIMER-6:PWM输入现象:由TIMER3输出通道1产生一路周期2秒占空比50%的PWM波,飞线到TIMER4的输入通道1,有TIMER4来测量该PWM得周期和占空比。

在做实验之前引入三种从模式控制:复位、触发、门控。

通过SMCR选择后可以进入这三种从模式SMCRSMS: 100 101 110复位门控触发所谓从模式简单理解就是受控于别人了,包括何时启动、何时停止、何时复位。

相关作用请看手册。

提示一点就是进入这三种模式后时钟是谁的问题?肯定不是外部时钟1了,可以是内部时钟和外部时钟2.接着看实验,PWM方式的原理是这样的,如前文提到过输入时可以把T1映射到CC1上去同时映射到CC2上,将CC1和CC2的捕获边沿搞成相反的,比如CC1捕获T1上升沿,CC2捕获T1下降沿,还要再设置T1为复位从模式,上升沿有效,这样T1上升沿后计数器开始计数。

相关文档
最新文档