stm32的定时器输入捕获与输出比较讲解
stm32定时器原理
stm32定时器原理STM32定时器是一种非常重要的硬件模块,能够实现精确的时间控制和周期性操作。
本文将介绍STM32定时器的原理,包括定时器的基本功能、定时器的分频器、定时器的计数器、定时器的中断、定时器的输出比较和定时器的输入捕获等。
首先介绍定时器的基本功能,STM32定时器可以产生一个特定的周期性信号,在一定的时间间隔内产生触发事件,例如控制LED闪烁、蜂鸣器发声等等。
此外,定时器还可以通过设定特定的计数值来实现定时功能,如延时、计时器等等。
其次介绍定时器的分频器,STM32定时器的分频器可以设置定时器的工作频率,通常是通过将系统时钟分频来实现。
分频器的设置可以通过修改寄存器的值来实现,通常是通过设置预分频器和分频器来实现。
接着介绍定时器的计数器,STM32定时器的计数器是用来记录分频器的计数值,通过相应的计数值来确定定时器的工作周期。
定时器的计数器可以在特定的条件下自动重置或停止,以实现特定的计时或延时功能。
然后介绍定时器的中断,STM32定时器的中断可以在定时器计数器达到特定的值时触发,然后执行中断服务程序。
在中断服务程序中可以实现特定的操作,例如控制IO口状态、改变定时器的工作频率等。
接下来介绍定时器的输出比较,STM32定时器的输出比较可以将定时器的输出信号与预设的比较值进行比较,以实现特定的操作。
例如可以控制LED的亮度、PWM信号、电机控制等等。
最后介绍定时器的输入捕获,STM32定时器的输入捕获可以在外部信号产生时捕获定时器的计数值,可以用于测量脉冲宽度、频率等等。
定时器的输入捕获通常需要设置定时器的捕获模式和捕获通道等参数。
综上所述,STM32定时器是一种非常重要的硬件模块,应用广泛,我们需要充分理解其原理和应用,以实现精确的时间控制和周期性操作。
stm32 timer 用法
stm32 timer 用法摘要:1.引言2.STM32定时器简介3.STM32定时器工作原理4.STM32定时器配置与使用5.STM32定时器应用实例6.总结正文:1.引言STM32是一款广泛应用于嵌入式系统的微控制器,拥有丰富的外设资源。
其中,定时器(Timer)是STM32外设中非常关键的部分,它在系统时钟、输入捕捉、输出比较、PWM等功能中起着举足轻重的作用。
本文将详细介绍STM32定时器的用法。
2.STM32定时器简介STM32定时器主要包括基本定时器(Basic Timer)、高级定时器(Advanced Timer)和看门狗定时器(Watchdog Timer)。
其中,基本定时器主要用于系统时钟的生成和控制;高级定时器具有更多的功能,如输入捕捉、输出比较、PWM等;看门狗定时器用于检测系统的运行状态,防止系统崩溃。
3.STM32定时器工作原理STM32定时器的工作原理主要基于计数器、预分频器和比较器。
计数器用于记录定时器滴答(Tick)的数量;预分频器用于控制定时器滴答频率;比较器用于产生定时器溢出信号。
当定时器溢出时,定时器硬件会自动产生中断,通过编程可以设置相应的中断处理程序,实现特定功能。
4.STM32定时器配置与使用配置STM32定时器主要包括以下步骤:(1)使能定时器:通过设置相应寄存器位,使能定时器;(2)配置定时器工作模式:根据需求选择定时器工作模式,如计数模式、PWM模式等;(3)配置定时器时钟源:选择定时器时钟源,如内部时钟、外部时钟等;(4)配置定时器预分频器:设置定时器预分频器值,以满足定时器滴答频率要求;(5)配置比较器:设置比较器值,以产生定时器溢出信号;(6)配置中断:根据需求配置定时器中断,如使能中断、设置优先级等。
5.STM32定时器应用实例以下是一个简单的STM32定时器应用实例:使用STM32F103C8T6微控制器实现一个LED闪烁的程序。
(1)配置定时器:使能定时器TIM2,设置工作模式为计数模式,时钟源为内部时钟,预分频器值为72000,比较器值为65536。
理解STM32定时器中的输入捕获滤波器
理解STM32定时器中的输入捕获滤波器关于STM32定时器中的输入捕获滤波器的功能描述,在中文参考手册中描述如下:我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话:1)当滤波器连续采样到N次个有效电平时,认为一次有效的输入电平。
2)该数字滤波器实际上是个事件计数器,它记录到N个事件后会产生一个输出的跳变。
例如:当f(CK_INT) = 72MHz, CKD[1:0] = 01时,选择f(DTS) = f(CK_INT)/2 = 36MHz;而ETF[3:0] = 0100,则采样频率f(SAMPLI NG) = f(DTS) / 2 = 18MHz, N = 6,此时高于3M Hz的信号将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。
看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下:问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么?带着这两个问题,我们来分析一下,下面以TIM3为例:首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图TIM3_C H1(PA.6) ----> TI1(外部信号) -------> 输入滤波器I C1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1从上面的过程可以知道,1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。
2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和IC1是同一个信号。
STM32F4_TIM输入波形捕获(脉冲频率)
本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。
在引脚上刚好相反:一个输入、一个输出。
本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。
间隔一定时间读取频率并通过串口打印出来。
当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。
笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。
(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚)先看一下实例的实验现象:关于本文的更多详情请往下看。
Ⅱ、实例工程下载笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号:关注微信,回复“修改型号”)。
STM32F4_TIM输入波形捕获(脉冲频率)实例:https:///cB6XrSi6rK3TP 访问密码STM32F4资料:https:///cR2pxqF5x2d9c 访问密码53e7Ⅲ、原理描述笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。
前面的文章已经将“时基部分”的一些基础知识讲述过了,“时基部分”的功能是比较有用的,它除了可以用来延时(定时)之外,它还可以拿来触发其他一些功能,如:触发DA转换、AD采集等。
上一篇文章讲述的就是图中比较输出部分,比较输出部分功能相对比较简单。
该文主要讲述“输入捕获”部分,这部分输入的通道1与2、通道3与4可以相互协作。
该文只使用了TIM5的通道3,捕获输入信号频率。
stm32的定时器输入捕获与输出比较讲解
stm32的定时器输入捕获与输出比较(2015-09-28 09:26:24)转载▼分类:stm32标签:it明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。
外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。
时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。
输出比较:定时器中计数寄存器在初始化完后会自动的计数。
从bottom计数到top。
并且有不同的工作模式。
另外还有个比较寄存器。
一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。
然后根据不同的工作模式计数寄存器将清零或者计数到top值。
1、朋友,可以解释一下输入捕获的工作原理不?计数寄存器的初值,是自己写进去的吗?我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。
对不?timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不?那输出比较的原理你可以帮我介绍一下不?比较单元的值是人为设进去的吧?是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器。
上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了”就是比较匹配了你要IO电平怎么办?是清0还是置1?还是怎么样?这样才能产生波形啊要不然你要比较单元有什么用呢?设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?是的你理解的很快011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?恩定时器1的输出比较模式怎么用。
STM32高级定时器详解
STM32高级定时器详解高级定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱。
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM 等)。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制定时器和通用定时器是完全独立的,它们不共享任何资源。
它们可以同步操作。
Table 457. TIM寄存器寄存器描述CR1 控制寄存器1CR2 控制寄存器2SMCR 从模式控制寄存器DIER DMA/中断使能寄存器SR 状态寄存器EGR 事件产生寄存器CCMR1 捕获/比较模式寄存器1CCMR2 捕获/比较模式寄存器2CCER 捕获/比较使能寄存器CNT 计数器寄存器PSC 预分频寄存器APR 自动重装载寄存器CCR1 捕获/比较寄存器1CCR2 捕获/比较寄存器2CCR3 捕获/比较寄存器3CCR4 捕获/比较寄存器4DCR DMA控制寄存器DMAR 连续模式的DMA地址寄存器Table 458. 例举了TIM的库函数Table 458. TIM库函数函数名描述TIM_DeInit 将外设TIMx寄存器重设为缺省值TIM_TimeBaseInit根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInit 根据TIM_OCInitStruct 中指定的参数初始化外设TIMxTIM_ICInit 根据TIM_ICInitStruct 中指定的参数初始化外设TIMx TIM_TimeBaseStructInit 把TIM_TimeBaseInitStruct 中的每一个参数按缺省值填入TIM_OCStructInit 把TIM_OCInitStruct 中的每一个参数按缺省值填入TIM_ICStructInit 把TIM_ICInitStruct 中的每一个参数按缺省值填入TIM_Cmd 使能或者失能TIMx 外设TIM _ITConfig 使能或者失能指定的TIM 中断TIM_DMAConfig 设置TIMx的DMA接口TIM_DMACmd 使能或者失能指定的TIMx 的DMA请求TIM_InternalClockConfig 设置TIMx 内部时钟TIM_ITRxExternalClockConfig 设置TIMx 内部触发为外部时钟模式TIM_TIxExternalClockConfig 设置TIMx 触发为外部时钟TIM_ETRClockMode1Config 配置TIMx 外部时钟模式1TIM_ETRClockMode2Config 配置TIMx 外部时钟模式2TIM_ETRConfig 配置TIMx 外部触发TIM_SelectInputTrigger 选择TIMx 输入触发源TIM_PrescalerConfig 设置TIMx 预分频TIM_CounterModeConfig 设置TIMx 计数器模式TIM_ForcedOC1Config 置TIMx 输出1 为活动或者非活动电平TIM_ForcedOC2Config 置TIMx 输出2 为活动或者非活动电平TIM_ForcedOC3Config 置TIMx 输出3 为活动或者非活动电平TIM_ForcedOC4Config 置TIMx 输出4 为活动或者非活动电平TIM_ARRPreloadConfig 使能或者失能TIMx在ARR 上的预装载寄存器TIM_SelectCCDMA 选择TIMx 外设的捕获比较DMA源TIM_OC1PreloadConfig 使能或者失能TIMx在CCR1 上的预装载寄存器TIM_OC2PreloadConfig 使能或者失能TIMx在CCR2 上的预装载寄存器TIM_OC3PreloadConfig 使能或者失能TIMx在CCR3 上的预装载寄存器TIM_OC4PreloadConfig 使能或者失能TIMx在CCR4 上的预装载寄存器TIM_OC1FastConfig 设置TIMx 捕获比较1 快速特征。
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定时器定时时间配置总结
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
STM32输入捕获例程
刚刚开始做定时器输入捕获的时候在这个论坛上找了好久,都没有人分享,也有很多人问,无奈自己动手写了。
花了一天的时间,这个东西真的不好写了,对比了库的例子,仿真,等。
可以说付出了很多。
现在完成了和大家分享。
希望大家多多支持。
这个程序是在定时器输入捕获的基础上看手册完成的,程序说明:1、程序中定时器4的PB6用于输出频率为1K,占空比为50%的PWM信号。
2、定时器2的PA0用于输入捕获,当程序下到板子上,只有两个脚连在一起才会发生捕获。
3、串口用于发送捕获的值到PC机上。
4、定时器2的CCR1存PWM信号的频率,CCR2存高电平时间。
这里声明一下,如果你要捕获的PWM信号不在ARR,PSC计算的范围内,请自己先计算再使用本程序。
#include "stm32f10x_lib.h"#include "sys.h"#include "delay.h" //延时子函数#include "usart.h"u16 IC1Value;u16 IC2Value;u16 DutyCycle;u16 Frequency;void PWM_Init(u16 arr,u16 psc);void Capture_Init(u16 arr,u16 psc);int main(void){Stm32_Clock_Init(9); //系统时钟设置delay_init(72);//延时函数初始化uart_init(72,9600);PWM_Init(1000,72-1); //不分频。
PWM频率=72000/1440=5KhzCapture_Init(2000,72-1);while(1){Frequency = 1000000/IC1Value;DutyCycle = (IC2Value*100)/IC1Value;//占空比=(IC2Value/IC1Value)*100;printf("Frequency = %d\r\n",Frequency);printf("DutyCycle = %d\r\n",DutyCycle);printf("suqingxiao\r\n");}}//PWM输出初始化//arr:自动重装值//psc:时钟预分频数void PWM_Init(u16 arr,u16 psc){//此部分需手动修改IO口设置RCC->APB2ENR|=1<<0; //RCC->APB1ENR|=1<<2; //TIM4 时钟使能RCC->APB2ENR|=1<<3; //使能PORTB时钟GPIOB->CRL&=0XF0FFFFFF;//PB6 输出GPIOB->CRL|=0X0B000000;//复用功能输出GPIOB->ODR|=1<<6;//PB6 上拉TIM4->ARR=arr;//设定计数器自动重装值TIM4->PSC=psc;//预分频器不分频TIM4->CCMR1|=7<<4; //CH1 PWM2模式TIM4->CCMR1|=1<<3; //CH1 预装载使能TIM4->CCER|=1<<0; //OC1 输出使能TIM4->CR1=0x0080; //ARPE使能TIM4->CR1|=0x01; //使能定时器3TIM4->CCR1 = 500; //占空比初值=1440*50% =720 }void Capture_Init(u16 arr,u16 psc){//此部分需手动修改IO口设置RCC->APB2ENR|=1<<0; //RCC->APB1ENR|=1<<0; //TIM2 时钟使能RCC->APB2ENR|=1<<2; //使能PORTA时钟TIM2->ARR=arr; //设定计数器自动重装值//刚好1msTIM2->PSC=psc; //预分频器,GPIOA->CRL&=0XFFFFFFF0;//PA0 输出GPIOA->CRL|=0X00000004;//复用功能输出GPIOA->ODR|=1<<0;//PA0 上拉TIM2->SMCR|=0x00D4;//TIM2->SMCR|= 1<<5; //MSM=1 主/从模式//TIM2->SMCR|= 5<<4; //TS=101 触发选择//TIM2->SMCR|= 4<<0; //SMS=100 复位模式TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端TIM2->CCMR1|=3<<4; //IC1F=0011配置输入滤波器TIM2->CCER|=0<<1; //CC1P=0 选择有效转换边沿上升沿有效TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中TIM2->CCMR1|=2<<8;//CC2S=10 选择输入端TIM2->CCER|=1<<5; //CC2P=1 选择有交转换边沿下降沿有效TIM2->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中TIM2->DIER|=1<<1; //允许更新捕获中断TIM2->CR1|=0x01; //使能定时器2MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2 }//定时器2中断服务程序void TIM2_IRQHandler(void){IC1Value = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位IC2Value = TIM2->CCR2;//读取CCR1也可以清CC2IF标志位TIM2->SR&=~(1<<1);//清除中断标志位}。
STM32F4通用定时器详细讲解
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 计数器模式——输出比较模式强置输出模式PWM输入模式输入捕获模式
输入捕获模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\InputCaptur e在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。
当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
PWM输入模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input该模式是输入捕获模式的一个特例例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)●选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。
●选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿有效)。
●选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。
●选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。
●选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。
●配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。
●使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。
由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。
stm32cube通用定时器输入捕获
stm32cube通用定时器输入捕获
用定时器输入捕获做红外线接收实验。
(此次试验以通道2 为例)
①stm32cube 配置
②
③
④程序中主要用到的输入捕获相关寄存器
uint16_t tim_sr,tim_ccer,tim_ccr;tim_sr=htim->Instance->SR;//状态寄存器tim_ccer=htim->Instance->CCER;//捕获、比较使能寄存器tim_ccr=htim-
>Instance->CCR2;//捕获比较寄存器2(即用来保存通道2 发生中断时的CNT 寄存器的值)
htim->Instance->CNT //计数寄存器
SR 用来判断是不是输入捕获中断;
CCER 寄存器用来判断当前是下降沿捕获中断还是上升沿捕获中断,同时也
能随时改变上升沿捕获还是下降沿捕获;
CCR2 寄存器表示当前中断发生时的CNT 寄存器的值,也就是用来判断时间的;(读取CCR2 的值,可以清楚SR 寄存器中的CC2IF 标志位)
CNT 是用来计数的,每个定时器时钟周期自动+1,我们可以再需要的时间将
其清零,便于计时。
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
STM32HAL库学习系列第7篇---定时器TIM输入捕获功能
STM32HAL库学习系列第7篇---定时器TIM输⼊捕获功能测量脉冲宽度或者测量频率基本⽅法1.设置TIM2 CH1为输⼊捕获功能;2.设置上升沿捕获;3.使能TIM2 CH1捕获功能;4.捕获到上升沿后,存⼊capture_buf[0],改为捕获下降沿;5.捕获到下降沿后,存⼊capture_buf[1],改为捕获上升沿;6.捕获到上升沿后,存⼊capture_buf[2],关闭TIM2 CH1捕获功能;7.计算:capture_buf[2] - capture_buf[0]就是周期,capture_buf[1] - capture_buf[0]就是⾼电平所占时间。
时钟配置:引脚看是否需要上拉做项⽬中的⼀个例⼦:/*** 函数功能: TIM_IC配置* 输⼊参数: value* 返回值: ⽆* 说明: ⽆*/void user_ic_config(uint16_t value){TIM_IC_InitTypeDef sConfigIC;if(value != 0) //1{sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;//上升沿}else//0{sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; //下降沿}sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);}/*** 函数功能: TIM_IC回调函数* 输⼊参数: htim* 返回值: ⽆* 说明: 得到转速*/void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){static uint32_t uwICValue;static uint32_t last_uwICValue;uint32_t uwDiffCapture;if ( ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)||(htim->Channel== HAL_TIM_ACTIVE_CHANNEL_4)) && (htim->Instance == TIM3) ) {pulseCntr++;last_uwICValue = uwICValue;uwICValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_3) != HAL_OK) //开启定时器中断{}if (uwICValue > last_uwICValue){uwDiffCapture = (uwICValue - last_uwICValue); //脉冲宽度为前后两个周期相减}else if (uwICValue < last_uwICValue) //若超值{/* 0xFFFF is max TIM2_CCRx value */uwDiffCapture = ((0xFFFF - last_uwICValue) + uwICValue) + 1;}if(uwDiffCapture < 0x10000){middleCapture = uwDiffCapture; //脉冲宽度}pulsein_flag = 1; // 捕捉到标记}else if ( (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) && (htim->Instance == TIM2) ){if(uhCaptureIndex == 0){// 第⼀个脉冲,检测的是上升沿uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);uhCaptureIndex = 1;user_ic_config(0); //下降if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK) //中断{}}else if(uhCaptureIndex == 1){uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);uhCaptureIndex = 0;user_ic_config(1);//上升if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK){}/* Capture computation */if (uwIC2Value2 > uwIC2Value1){uwDiffCapture = (uwIC2Value2 - uwIC2Value1); //脉冲宽度 }else if (uwIC2Value2 < uwIC2Value1){/* 0xFFFF is max TIM2_CCRx value */uwDiffCapture = ((40000 - uwIC2Value1) + uwIC2Value2) + 1; }RCin = uwDiffCapture/2; //删除}}}应⽤:1.脉冲时间测量2.电容按键使⽤。
stm32 PWM输入捕获
stm32 定时器pwm输入捕获输入捕捉的功能是记录下要捕捉的边沿出现的时刻,如果你仅仅捕捉下降沿,那么两次捕捉的差表示输入信号的周期,即两次下降沿之间的时间。
如果要测量低电平的宽度,你应该在捕捉到下降沿的中断处理中把捕捉边沿改变为上升沿,然后把两次捕捉的数值相减就得到了需要测量的低电平宽度。
如果要的测量低电平太窄,中断中来不及改变捕捉方向时,或不想在中断中改变捕捉方向,则需要使用PWM输入模式,或使用两个TIMx通道,一个通道捕捉下降沿,另一个通道捕捉上升沿,然后对两次捕捉的数值相减。
PWM输入模式也是需要用到两个通道。
使用两个通道时,最好使用通道1和通道2,或通道3和通道4,这样上述功能只需要使用一个I/O管脚,详细请看STM32技术参考手册中的TIMx框图。
//0-----------------------一、概念理解PWM输入捕获模式是输入捕获模式的特例,自己理解如下1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。
且IC1IC2一组,IC3 IC4一组。
并且可是设置管脚和寄存器的对应关系。
2. 同一个TIx输入映射了两个ICx信号。
3. 这两个ICx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)7. 由此可以计算出PWM的时钟周期和占空比了frequency=f(TIM时钟频率)/n。
duty cycle=(高电平计数个数/n),若m为高电平计数个数,则duty cycle=m/n若m为低电平计数个数,则duty cycle=(n-m)/n注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率=TIM时钟频率/65535。
stm32定时器定时器中断PWM输出输入捕获
stm32定时器定时器中断PWM输出输⼊捕获STM32F4 的通⽤定时器包含⼀个 16 位或 32 位⾃动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。
STM32F4 的通⽤定时器可以被⽤于:测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和 PWM)等。
使⽤定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在⼏个微秒到⼏个毫秒间调整。
STM32F4 的每个通⽤定时器都是完全独⽴的,没有互相共享的任何资源。
STM3 的通⽤ TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下⾃动装载计数器(TIMx_CNT),注意: TIM9~TIM14 只⽀持向上(递增)计数⽅式。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
3) 4 个独⽴通道(TIMx_CH1~4, TIM9~TIM14 最多 2 个通道),这些通道可以⽤来作为:A.输⼊捕获B.输出⽐较C. PWM ⽣成(边缘或中间对齐模式) ,注意: TIM9~TIM14 不⽀持中间对齐模式D.单脉冲模式输出4)可使⽤外部信号(TIMx_ETR)控制定时器和定时器互连(可以⽤ 1 个定时器控制另外⼀个定时器)的同步电路。
5)如下事件发⽣时产⽣中断/DMA(TIM9~TIM14 不⽀持 DMA):A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)B.触发事件(计数器启动、停⽌、初始化或者由内部/外部触发计数)C.输⼊捕获D.输出⽐较E.⽀持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不⽀持)F.触发输⼊作为外部时钟或者按周期的电流管理(TIM9~TIM14 不⽀持)下⾯我们介绍⼀下与我们这章的实验密切相关的⼏个通⽤定时器的寄存器(以下均以 TIM2~TIM5 的寄存器介绍, TIM9~TIM14 的略有区别,具体请看《STM32F4xx 中⽂参考⼿册》对应章节)。
STM32F4 第17讲 输入捕获实验-TIMER-M4
✓ 通用定时器PWM概述
通道极性设置独立函数:
void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
获取通道捕获值
uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);
✓ 通用定时器PWM概述
✓ 通用定时器PWM概述
步骤1:设置输入捕获滤波器(通道1为例)
✓ 通用定时器PWM概述
步骤2:设置输入捕获极性(通道1为例)
✓ 通用定时器PWM概述
步骤三:设置输入捕获映射通道(通道1为例)
✓ 通用定时器PWM概述
步骤四:设置输入捕获分频器(通道1为例)
✓ 通用定时器PWM概述
步骤五:捕获到有效信号可以开启中断
输入捕获的一般配置步骤:
① 初始化定时器和通道对应IO的时钟。 ② 初始化IO口,模式为复用:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; ③设置引脚复用映射:
GPIO_PinAFConfig(); ④初始化定时器ARR,PSC
TIM_TimeBaseInit(); ⑤初始化输入捕获通道
TIM_ICInit(); ⑥如果要开启捕获中断,
TIM_ITConfig(); NVIC_Init(); ⑦使能定时器:TIM_Cmd(); ⑧编写中断服务函数:TIMx_IRQHandler();
✓ 通用定时器PWM概述
实验目的:测量信号的脉冲宽度
✓ 通用定时器PWM概述
✓ 3. 输入捕获实验讲解 端口输入捕获实验
目录
1
通用定时器输入捕获概述
STM32定时器输出比较模式
STM32定时器输出比较模式
一、原理
1.设置定时器的分频系数和计数器自动重装载值,确定定时器的计数
范围和计数频率。
2.设置定时器的比较寄存器的值,确定触发事件的时间点。
3.当定时器计数器的值等于比较寄存器的值时,触发比较事件。
4.在比较事件发生时,可以执行一些操作,比如改变输出引脚的电平
状态、产生特定的输出波形、中断处理等。
二、使用方法
1.在STM32芯片的库函数中,需要先初始化相关的定时器和GPIO引脚。
2.设置定时器的分频系数和计数器自动重装载值,确定定时器的计数
范围和计数频率。
3.设置比较寄存器的值,确定触发事件的时间点。
4.配置比较输出通道的模式和极性,确定输出信号的电平状态。
5.编写比较事件的中断处理函数,实现在比较事件发生时的操作。
6.启动定时器计数器,使定时器开始计数。
三、常见应用
1.生成PWM波形:可以通过比较寄存器的值和定时器计数器的值,确
定PWM的周期和占空比,从而生成不同的PWM波形用于控制电机、LED等。
2.声音发生器:可以通过定时器输出比较模式产生不同频率的方波,从而实现声音发生器。
3.定时中断:可以通过比较寄存器的值和定时器计数器的值,实现定时中断。
4.输入捕获:可以通过比较寄存器的值和定时器计数器的值,进行输入捕获,用于测量外部信号的频率、占空比等。
STM32F407通用定时器输入捕获
通用定时器输入捕获通用定时器作为输入捕获的使用。
我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_UP按键输入高电平),通过串口来打印高电平脉宽时间。
输入捕获模式可以用来测量脉冲宽度或者测量频率。
我们以测量脉宽为例,用一个简图来说明输入捕获的原理:如图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2时间,就是我们需要测量的高电平时间。
测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2。
这样,根据定时器的计数频率,我们就可以算出t1~t2的时间,从而得到高电平脉宽。
在t1~t2之间,可能产生N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。
如图所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1的时间长度,即高电平持续时间。
STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。
STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
同时还可以配置捕获时是否触发中断/DMA等。
这里我们用TIM5_CH1来捕获高电平脉宽。
=============================================================================== ====捕获/比较通道(例如:通道 1 输入阶段)=============================================================================== ====接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的x=5)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32的定时器输入捕获与输出比较(2015-09-28 09:26:24)转载▼分类:stm32标签:it明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。
外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。
时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。
输出比较:定时器中计数寄存器在初始化完后会自动的计数。
从bottom计数到top。
并且有不同的工作模式。
另外还有个比较寄存器。
一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。
然后根据不同的工作模式计数寄存器将清零或者计数到top值。
1、朋友,可以解释一下输入捕获的工作原理不?计数寄存器的初值,是自己写进去的吗?我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。
对不?timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不?那输出比较的原理你可以帮我介绍一下不?比较单元的值是人为设进去的吧?是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器。
上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了”就是比较匹配了你要IO电平怎么办?是清0还是置1?还是怎么样?这样才能产生波形啊要不然你要比较单元有什么用呢?设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?是的你理解的很快011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?恩定时器1的输出比较模式怎么用。
利用这个功能输出一个1KHZ,占空比为10%的程序怎么写啊?求高人指点调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。
我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。
然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。
理论上应该是行的通的。
刚开始俺使用的是TIM2的123通道,TIM4的2通道来进行频率的测量。
由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了(刚好4个通道了)。
请看一开始的程序,以TIM2的1,3通道为例子(2通道设置方法一样):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_DirectTI; //通道方向选择TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获TIM_ICInitStructure.TIM_ICFilter =0x0; //滤波TIM_ICInit(TIM2, &TIM_ICInitStructure); //TIM2通道1配置完毕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_DirectTI; //TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波TIM_ICInit(TIM2, &TIM_ICInitStructure); //TIM2通道3配置完毕以上是输入捕获配置还需要做的工作就是(参考stm32参考手册的TIM的结构框图):TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主从模式选择这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。
这就是3 通道上的数据不停跳动的原因,要想得到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。
有以上可以得到:stm32的TIM2的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到:通道1TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIMx->CRR1的值即为信号的周期通道2:TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIMx->CRR2的值即为信号的周期STM32的定时器外设功能强大得超出了想像力,STM32一共有8个都为16位的定时器。
其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器。
这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,都是专门为工控领域量身订做的。
基本定时器:具备最基本的定时功能,下面是它的结构:我们来看看它的启动代码:void TIM2_Configuration(void){ 基本定时器TIM2的定时配置的结构体(包含定时器配置的所有元素例如:TIM_Period= 计数值)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;设置TIM2_CLK为72MHZ(即TIM2外设挂在APB1上,把它的时钟打开。
)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);设置计数值位1000TIM_TimeBaseStructure.TIM_Period=1000;将TIM2_CLK为72MHZ除以72 = 1MHZ为定时器的计数频率TIM_TimeBaseStructure.TIM_Prescaler= 71;这个TIM_ClockDivision是设置时钟分割,这里不分割还是1MHZ的计数频率TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3) TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;将配置好的设置放进stm32f10x-tim.c的库文件中TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);清除标志位TIM_ClearFlag(TIM2,TIM_FLAG_Update);使能TIM2中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);使能TIM2外设TIM_Cmd(TIM2,ENABLE);}通用定时器:就比基本定时器复杂得多了。
除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。
我们来详细讲解:如何生成PWM脉冲通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。
这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT 为向上计数,而重载寄存器TIMx_ARR(相当于库函数写法的TIM_Period的值N)被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。