stm32f407通用定时器输入捕获

合集下载

stm32f407 输入捕获两路方波

stm32f407 输入捕获两路方波

stm32f407 输入捕获两路方波,测下降沿时间间隔2017年08月07日18:49:23 muyepiao1阅读数:1303 标签:stm32f407输入捕获记录调试过程:实现方法:用TIM3,TIM4设置为输入捕获(下降沿触发),使能捕获中断,更新事件中断。

有时候两个下降沿间隔时间太久,超过溢出值,所以要开更新中断。

更新中断手册上有讲:“●发生如下事件时生成中断/DMA 请求:—更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)—触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)—输入捕获—输出比较”·(计数器溢出,UDIS =0 ) --- (生成更新事件)--- 生成(更新中断或者DMA 请求)( URS =0 )·计数器溢出,生成更新事件,(UDIS =1,禁止更新事件,所以此处还需UDIS =0)·URS用来设置跟新请求源,就是用来选择哪些行为可以生成更新中断。

此处URS=0;·开始看手册时,不理解更新事件,其实不懂的时候,应该多看几遍手册,以下为手册原话:发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR寄存器中的UIF位)置1(取决于URS位):●预分频器的缓冲区中将重新装载预装载值(TIMx_PSC寄存器的内容)●自动重载影子寄存器将以预装载值进行更新·影子寄存器存在的意义在于同步。

具体可以百度。

在上是初始化设置要注意的地方。

捕获的过程描述,手册有讲,以下为来自手册:在输入捕获模式下,当相应的ICx 信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx) 来锁存计数器的值。

发生捕获事件时,会将相应的CCXIF 标志(TIMx_SR 寄存器)置1,并可发送中断或DMA 请求(如果已使能)。

如果发生捕获事件时CCxIF 标志已处于高位,则会将重复捕获标志CCxOF(TIMx_SR 寄存器)置1。

STM32(十八)输入捕获应用

STM32(十八)输入捕获应用

STM32(⼗⼋)输⼊捕获应⽤
输⼊捕获⼀般应⽤在两个⽅⾯:
脉冲跳变沿时间测量
PWM输⼊测量
1、测量频率
当捕获通道TIx.上出现上升沿时,发⽣第⼀次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,⽽且还会进⼊捕获中断,在中断服务程序中记录⼀-次捕获(可以⽤⼀个标志变量来记录),并把捕获寄存器中的值读取到valuel 中。

当出现第⼆次上升沿时,发⽣第⼆次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进⼊捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。

利⽤value3和valuel的差值我们就可以算出信号的周期(频率)。

2、测量脉宽
当捕获通道TIx.上出现上升沿时,发⽣第⼀次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,⽽且还会进⼊捕获中断,在中断服务程序中记录⼀次捕获(可以⽤⼀个标志变量来记录),并把捕获寄存器中的值读取到valuel 中。

然后把捕获边沿改变为下降沿捕获,⽬的是捕获后⾯的下降沿。

当下降沿到来的时候,发⽣第⼆次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进⼊捕获中断,在捕获中断中,把捕获寄存器的值读取到value3 中,并清除捕获记录标志。

然后把捕获边沿设置为上升沿捕获。

在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间⽐较长,定时器就会发⽣溢出,溢出的时候会产⽣更新中断,我们可以在中断⾥⾯对溢出进⾏记录处理。

STM32输入捕获模式

STM32输入捕获模式

STM32输入捕获模式
在输入捕获模式下,定时器将统计外部信号的上升沿或下降沿出现的
时间,并将统计结果保存在相关的寄存器中。

用户可以根据需要选择统计
上升沿还是下降沿,并可以选择计数溢出时是否复位计数器。

1.选择定时器和通道:根据实际需求选择合适的定时器和通道。

一般
来说,每个定时器都有多个通道可以配置为输入捕获模式。

2.配置定时器:根据测量的要求配置定时器的工作模式、计数方向和
预分频系数等。

定时器的配置将影响捕获的精度和测量范围。

3.配置输入捕获:选择捕获触发源,可以选择外部信号引脚或其他定
时器的输出作为触发源。

配置捕获触发源时还可以选择捕获的边沿类型
(上升沿或下降沿)和是否复位计数器。

4.开启定时器:配置完成后,通过使能相关的定时器和通道将输入捕
获模式启用。

5.捕获外部信号:当捕获触发源产生触发信号时,定时器将开始计数,当捕获到外部信号的边沿时,定时器会自动将计数值保存在指定的寄存器中。

6.读取测量结果:根据所选择的定时器和通道,从相关的寄存器中读
取测量结果,可以通过计算得到所需的参数,比如周期、脉宽等。

输入捕获模式在很多应用中都是非常常见且重要的。

例如在测量旋转
编码器的位置和速度时,可以使用输入捕获模式来捕获编码器的A相和B
相信号,并通过计算来确定位置和速度。

此外,输入捕获模式还可以用于
测量外部信号的频率、测量脉冲信号的宽度等。

总之,STM32输入捕获模式是一种功能强大且灵活的功能,能够帮助用户实现对外部信号的精确测量和控制。

通过合理配置和使用,可以满足各种不同的应用需求。

STM32F407VG(五)定时器

STM32F407VG(五)定时器

STM32F407VG(五)定时器⼀、定时器节本分类和主要特点1.STM32定时器分类:1)看门狗定时器2)SysTick定时器3)RTC定时器4)通⽤定时器a)通⽤定时器TIM2~TIM5,当中TIM2和TIM5是32位,TIM3和TIM4是16位具有四个独⽴通道中断/DMA事件⽀持增量编码器和霍尔传感器b)通⽤定时器TIM9~TIM14,16位定时器最多具有连个独⽴通道中断事件5)基本定时器TIM6,TIM7,16位定时器同步电路触发DAC中断/DMA事件6)⾼级定时器TIM1。

TIM8,16位定时器具有四个独⽴通道中断/DMA事件⽀持增量编码器和霍尔传感器输⼊信号能够改变计数器状态或复位可改变定期器寄存器的反复计数器。

⼆、实例1. 定时中断1.时钟初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);TIM_DeInit(TIM2);/* 时钟预分频数 */ //84000000/84=1000000,预分频后时钟为1MTIM_TimeBaseStructure.TIM_Prescaler= (84 - 1);/* ⾃⼰主动重装载寄存器周期的值(计数值) */ /* 累计 TIM_Period个频率后产⽣⼀个更新或者中断 */TIM_TimeBaseStructure.TIM_Period =1000-1 ;/* 採样分频 */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_FLAG_Update中断*/TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/* 开启时钟 */TIM_Cmd(TIM2, ENABLE);2. 设置中断向量。

STM32:F103F407定时器主从模式输出精准脉冲个数

STM32:F103F407定时器主从模式输出精准脉冲个数

STM32:F103F407定时器主从模式输出精准脉冲个数项目中需要对步进电机进行较为精准的控制。

经过查找资料,可以通过对STM32的定时器采用主从定时器的模式。

由主定时器输出方波信号,从定时器对主定时器输出的脉冲进行计数,溢出时触发从定时器的中断服务函数。

以此达到控制步进电机转动的圈数的目的。

本文所采用的STM32开发板是正点原子的STM32F103(精英板)、STM32F407(探索者),参考资料多来自正点原子资料下载中心(/docs/index.html)。

我依然处于刚入门学习STM32的阶段,程序是在正点原子的例程的基础上修改的。

原理/思路•步进电机:步进电机需要通过步进驱动器进行驱动,STM32通过串口输出一定频率的PWM波信号给步进电机驱动器的脉冲输入引脚(如PU-),输出高低电平给步进电机驱动器的方向控制信号输入引脚(如DR-)。

•脉冲数与圈数:我使用的是一般的两相四线步进电机,步距角为1.8°。

由此可知,360°/1.8°=200;也就是说,在不细分的情况下,200个脉冲使步进电机转动一圈。

如果设置PWM波输出频率为 1kHz,也就使一秒内输出1000个脉冲,相当于步进电机一秒内可以转动5圈。

•主从定时器:主定时器输出PWM波脉冲信号,从定时器对主定时器输出的脉冲进行计数。

对于STM32,除了基本定时器,高级定时器和通用定时器都可以分别作为主、从定时器,但其中的主从关系要遵循参考手册中所提供的配置。

下图,表74,表78,来自《STM32中文参考手册》P237,P285;适用于STM32F103。

下图,表72,表79,来自《STM32F4xx中文参考手册》P370,P464;适用于STM32F407。

•注意:由上表可知,对于STM32F103,最多三组主从定时器;对于STM32F407,最多四组主从定时器。

TS值 - ITRx 不能重复使用,定时器也不可重复使用。

(完整版)STM32F407运用总结

(完整版)STM32F407运用总结

STM32运用总结主要分为IO口,定时器的PWM和QEI,中断,ADC,DAC和DMA介绍。

在STM32的运用中第一步一般是使能相应模块的时钟,然后配置IO口,最后配置相应的寄存器。

1.IO口STM32的IO口非常多,而且与其它外设模块通常是复用的。

在不同的外设中IO口的设置是不一样的。

这一部分介绍普通的数值IO口。

IO口有A-G共7组,每组16口。

1.IO口在时钟总线AHB1上,使能对应端口的时钟。

在寄存器RCC->AHB1ENR中。

2.配置IO口的模式,普通的IO口配置为普通的输入输出模式。

配置IO口是悬空还是上拉或者下拉。

以上两步分别在寄存器GPIOx->MODER和GPIOx-> PUPDR(x=A,B,C,D,E,F,G)3.其中配置为输出模式时还要设置速度和相应的输出方式,开漏或者推挽,以上两步分别在寄存器GPIOx-> OSPEEDR和GPIOx->OTYPER(x=A,B,C,D,E,F,G)。

4.设置IO口的高低电平。

在寄存器GPIOx->BSRRH中置相应的位为1就是将相应的位置0,在寄存器GPIOx->BSRRL中置相应的位为1就是将相应的位置1.另外还可以设置GPIOx_ODR寄存器来设置输出电平以及读取GPIOx_IDR寄存器来获取输入电平。

2.PWMSTM32的定时器也非常之多,用到的主要是两个部分:用定时器产生PWM和定时触发ADC,这里一部分介绍PWM。

(高级定时器的配置和这差不多,由于在STM32F103里面已经尝试过在STM32F407里面就没有再写)1.配置IO口。

我们说过STM32的外设模块主要是和IO口复用的,因此在使用外设模块时首先配置好相应的IO口。

比如使用A口的PA1作为定时器Timer2的PWM输出。

则应按照如下的步骤来配置PA1。

1)使能A口的时钟。

在寄存器RCC->AHB1ENR中。

2)配置PA1为复用功能。

STM32F407通用定时器输入捕获

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

STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获假设已经安装好STM32CubeMX和STM32CubeF4支持包。

Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。

Step2. 在Pinout界面下配置晶振输入引脚。

配置TIM2使用内部时钟源,CH1作为输入捕获通道,默认映射到PA0引脚。

配置TIM3使用内部时钟,CH1~CH4为PWM输出通道,默认映射引脚分别为PA6,PA7,PB0,PB1。

配置TIM4使用内部时钟,CH1,CH2为PWM输出通道,映射引脚分别为PD12,PD13。

配置串口,作为信息输出接口。

Step3.在Clock Configuration界面配置时钟源。

使用外部8M晶振作PLL时钟输入,并使用PLL输出作为系统时钟。

为了后面的计算方便,将系统时钟配置成160MHz。

Step4.配置外设参数。

在configuration界面中点击TIM2/ TIM3/ TIM4按钮,可以进入参数配置界面。

TIM2:在Parameter Settings页配置预分频系数为7,其计数时钟就是80MHz/(7+1)=10MHz。

计数周期(自动加载值),转换为十六进制形式,输入32bit最大值0xFFFFFFFF。

注意,TIM2的自动加载寄存器ARR和各个通道的捕获/比较寄存器CCRx都是32bit的。

在NVIC页面使能捕获/比较中断。

在GPIO页面设置捕获输入引脚下拉电阻,设置成上拉也可以,主要是为了使在没有信号输入时在输入引脚上得到稳定的电平。

TIM3:在Parameter页配置预分频系数为7,计数周期(自动加载值)为9999。

其溢出频率就是80MHz/(7+1)/(9999+1)=1kHz,这就是TIM3各通道输出的PWM信号的频率。

各通道输出PWM的占空比参数如上图红框标注,其他参数使用默认值。

按照图中参数,CH1~CH4输出的PWM周期都是1ms,而高电平时间分别是123.4us,234.5us,567.8us,678.9us。

stm32cube通用定时器输入捕获

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:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

STM32输入捕获模式

STM32输入捕获模式

输入捕获模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\I nputCapture在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。

当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。

在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。

PWM输入模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\P WM_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信号。

stm32的定时器输入捕获与输出比较讲解

stm32的定时器输入捕获与输出比较讲解

标签:分类: stm32it时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。

输出比较:定时器中计数寄存器在初始化完后会自动的计数。

从bottom 计数到top。

并且有不同的工作模式。

配则会产生比较中断(比较中断使能的情况下)。

很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获。

它没多大用处,最常用来测频率。

是的,不过默认不要写入我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。

对不? 是的timerl有五个通道(对应五个10引脚),在同一时刻,只能捕获一个引脚的值,对不? 那是肯定的,通道很像ADC通道,是可以进行切换的。

这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不同的模式设置的,与此同时,计数器在不停的计数,并不停的与比较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等的时候一个比较匹配就发生了,根据自己的设置,匹配了是io电平取反、变低、还是变高,就会产生不同的波形了。

是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器5:3CMP[2:0]000itltolWHK 成选畀・卅崔时■的G尊于在TICCO中的比较也迭丼操fOOOt庄比较淆涂轨出01泄比较忧換3ft.出Olh隹向上比较设置総曲・Kom<■■4匕比较講徐諛由・在0设覽!0h没奇馥用1101没有便用Hh匕址化罐HT14 CMP[M】不蠢还是变高,就会产生不同的波形了”形啊要不然你要比较单元有什么用呢?设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?是的你理解的很快011 :计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?定时器1的输出比较模式怎么用。

STM32HAL库学习系列第7篇---定时器TIM输入捕获功能

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输出输入捕获

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 中⽂参考⼿册》对应章节)。

STM32定时器输入捕获模式测频率

STM32定时器输入捕获模式测频率

/*TIM2 的通道四设置为 输入捕获 模式*/ TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM_ICInit(TIM2, &TIM_ICInitStructure);
if(TIM2CaptureNumber[1] == 0) {
/* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue1[1] = TIM_GetCapture2(TIM2); TIM2CaptureNumber[1] = 1; } else if(TIM2CaptureNumber[1] == 1) { /* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue2[1] = TIM_GetCapture2(TIM2);
//输入的信号频率没有变,测得的周期也不会变。比如选择 4 分频,
//则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,
//可以减少软件被不断中断的次数。

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. 触发输入作为外部时钟或者按周期的电流管理。

stm32f407之基本定时器TIM6TIM7(操作寄存器)

stm32f407之基本定时器TIM6TIM7(操作寄存器)

stm32f407之基本定时器TIM6TIM7(操作寄存器)基本定时器TIM6&TIM7基本定时器TIM6和TIM7包括一个由可编程分频器驱动的16位自动重载计数器。

它可以用作普通的定时器,也可以用来驱动DAC。

这两个定时器是完全独立的,不共享任何资源。

更多时候是与DAC平配合使用。

作为定时器的配置步骤:1. 设置中断优先级分组(如果之前没有设置),这个最好一个程序里只在开头设置一次。

2. 使能相关时钟。

3. 设置分频。

4. 清空计数器的值。

5. 设置自动重装寄存器的值。

6. 是否允许中断。

7. 如果允许中断,设置中断优先级,使能中断。

8. 使能计数器。

程序:[plain] view plain copy1./************************************2.标题:定时器TIM7的定时练习3.软件平台:IAR for ARM6.214.硬件平台:stm32f4-discovery5.主频:168M6.7.author:小船8.data:2012-02-069.*************************************/10.11.#include <stm32f4xx.h>12.#include "MyDebugger.h"13.14.void main ()15.{16.17.SCB->AIRCR = 0x05FA0000 | 0x400; //中断优先级分组抢占:响应=3:118.19.RCC->APB1ENR |= (1<<5); //打开TIM7时钟20.TIM7->PSC = 8399; //对时钟84M进行8400分频,使得计数频率为10k21.TIM7->ARR = 10000; //定时一秒22.TIM7->CNT = 0; //清空计数器23.TIM7->CR1 |= (1<<7); //自动重装载预装载使能24.TIM7->DIER |= 1; //使能中断25.NVIC->IP[55] = 0x80;26.NVIC->ISER[1] |= (1<<(55-32));27.TIM7->CR1 |= 1; //开始计时28.MyDebugger_Init();29.while(1)30.{31.};32.}33.34.void TIM7_IRQHandler(void)35.{36.if(TIM7->SR)37.{38.MyDebugger_LEDs(blue, turn);39.TIM7->SR &= ~(0x0001);40.}41.}。

关于STM32F407输入捕获的问题

关于STM32F407输入捕获的问题

关于STM32F407输入捕获的问题由于ST给出了库函数,要想实现输入捕获很简单,可是对于寄存器层面的操作网上少之又少,关于寄存器配置,讲的最多的就是小船的,很感谢小船。

小船只给出了通用定时器的寄存器简介,并没有给出具体的例程,本人近日无事故调试了一下寄存器层面的配置。

功能:Timer2实现输入捕获对于Timer的操作平时用的最多的就是定时器,PWM,对于其输入捕获功能也是第一次用。

直接上代码:void Timer2_Cap_Init(u16 arr,u16 psc){NVIC_InitTypeDef NVIC_InitStructure;上面这行代码的作用主要在意定义中断结构体。

RCC->APB1ENR|=(1<<0); //Timer2时钟使能RCC->AHB1ENR |=(1<<0); //使能portA时钟这两行的作用相信都明白,维持控制器工作的主要就是时钟,这点和大自然一样,时间是唯一度量。

GPIOA->MODER |= 0X00000002;//pa设置为复用模式STM32F4的GPIO模式寄存器与STM32F3的不同,F4的只要不是用于GPIO那一般都得设置为复用功能,此处需要特别慎重。

问题一般都出在这里,当你设置为复用功能后,由于IO的映射关系,一个IO口上可能同时映射好几个功能,你需要指定到底是什么功能,下面这句就是指定GPIOA.0复用功能为Timer2_CH1。

GPIOA->AFR[0]|=0X00000001; //复用功能选择AF1 TIMER2_CH1由于GPIO结构体里面定义的AFR寄存器为GPIOA->AFR[2],而芯片手册里给出的是GPIOA->AFRL和GPIOA->AFRH,此处特别容易产生错误,当你写GPIOA->AFRL时会报错(找不到GPIOA->AFRL),可是仔细看会发现GPIOA->AFRL对应的寄存器起始地址为:0x20,stm32f4××.h里面定义的AFR寄存器为GPIO->AFR[2],所以此处GPIO->AFR[0]对应的为GPIO->AFRL。

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

通用定时器输入捕获通用定时器作为输入捕获的使用。

我们用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)。

首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。

---------------------------------------------------------------------------------------------------------------------------------------捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用:TIMx 捕获/比较模式寄存器1 (TIMx_CCMR1)TIMx capture/compare mode register 1 偏移地址:0x18 复位值:0x0000当在输入捕获模式下使用的时候,对应图的第二行描述,从图中可以看出,TIMx_CCMR1是针对2个通道的配置,低八位[7:0]用于捕获/比较通道1的控制,而高八位[15:8]则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4(详见《STM32F4xx中文参考手册》435页,15.4.8节)。

这里我们用到的是TIM5的捕获/比较通道1,我们重点介绍TIMx_CCMR1的[7:0]位(其高8位配置类似),TIMx_CCMR1的[7:0]位详细描述见图所示:位7:4 IC1F:输入捕获1滤波器(Input capture 1 filter)此位域可定义TI1输入的采样频率和适用于TI1的数字滤波器带宽。

数字滤波器由事件计数器组成,每N 个事件才视为一个有效边沿:0000:无滤波器,按f DTS频率进行采样1000:f SAMPLING=f DTS/8,N=60001:f SAMPLING=f CK_INT,N=2 1001:f SAMPLING=f DTS/8,N=80010:f SAMPLING=f CK_INT,N=4 1010:f SAMPLING=f DTS/16,N=50011:f SAMPLING=f CK_INT,N=8 1011:f SAMPLING=f DTS/16,N=60100:f SAMPLING=f DTS/2,N=6 1100:f SAMPLING=f DTS/16,N=80101:f SAMPLING=f DTS/2,N=8 1101:f SAMPLING=f DTS/32,N=50110:f SAMPLING=f DTS/4,N=6 1110:f SAMPLING=f DTS/32,N=60111:f SAMPLING=f DTS/4,N=8 1111:f SAMPLING=f DTS/32,N=8注意:在当前硅版本中,当ICxF[3:0]= 1、2或3时,将用CK_INT代替公式中的f DTS。

输入捕获1滤波器IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。

其中,f CK_INT是定时器的输入频率(TIMxCLK),一般为84Mhz/168Mhz(看该定时器在哪个总线上),而f DTS则是根据TIMx_CR1的CKD[1:0]的设置来确定的,如果CKD[1:0]设置为00,那么f DTS=f CK_INT。

N值就是滤波长度,举个简单的例子:假设IC1F[3:0]=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以f CK_INT的频率,连续采样到8次通道1的电平,如果都是高电平,则说明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。

这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤波的效果。

这里,我们不做滤波处理,所以设置IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。

位3:2 IC1PSC:输入捕获1预分频器(Input capture 1 prescaler)此位域定义CC1输入(IC1)的预分频比。

只要CC1E=0(TIMx_CCER寄存器),预分频器便立即复位。

00:无预分频器,捕获输入上每检测到一个边沿便执行捕获01:每发生2个事件便执行一次捕获10:每发生4个事件便执行一次捕获11:每发生8个事件便执行一次捕获输入捕获1预分频器IC1PSC[1:0],我们是1次边沿就触发1次捕获,所以选择00。

位1:0 CC1S:捕获/比较1选择(Capture/Compare 1 selection)此位域定义通道方向(输入/输出)以及所使用的输入。

00:CC1通道配置为输出01:CC1通道配置为输入,IC1映射到TI1上10:CC1通道配置为输入,IC1映射到TI2上11:CC1通道配置为输入,IC1映射到TRC上。

此模式仅在通过TS位(TIMx_SMCR寄存器)选择内部触发输入时有效注意:仅当通道关闭时(TIMx_CCER中的CC1E = 0),才可向CC1S位写入数据。

其中CC1S[1:0],这两个位用于CCR1的通道配置,这里我们设置IC1S[1:0]=01,也就是配置IC1映射在TI1上。

---------------------------------------------------------------------------------------------------------------------------------------TIMx 捕获/比较使能寄存器(TIMx_CCER)TIMx capture/compare enable register 偏移地址:0x20 复位值:0x0000位1 CC1P:捕获/比较1输出极性(Capture/Compare 1output Polarity)。

CC1通道配置为输出:0:OC1高电平有效1:OC1低电平有效CC1 通道配置为输入:CC1NP/CC1P位可针对触发或捕获操作选择TI1FP1和TI2FP1的极性。

00:非反相/上升沿触发电路对TIxFP1上升沿敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作),TIxFP1未反相(在门控模式或编码器模式下执行触发操作)。

01:反相/下降沿触发电路对TIxFP1下降沿敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作),TIxFP1反相(在门控模式或编码器模式下执行触发操作)。

10:保留,不使用此配置。

11:非反相/上升沿和下降沿均触发电路对TIxFP1上升沿和下降沿都敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作)位0 CC1E:捕获/比较1输出使能(Capture/Compare 1 output enable)。

CC1通道配置为输出:0:关闭––OC1未激活1:开启––在相应输出引脚上输出OC1信号CC1通道配置为输入:此位决定了是否可以实际将计数器值捕获到输入捕获/比较寄存器1 (TIMx_CCR1) 中。

0:禁止捕获1:使能捕获所以要使能输入捕获,必须设置CC1E=1,而CC1P则根据自己的需要来配置。

---------------------------------------------------------------------------------------------------------------------------------------接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,该寄存器的各位描述见图TIMx_ DIER 寄存器各位描述我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1。

---------------------------------------------------------------------------------------------------------------------------------------控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的。

控制寄存器1(TIMx_CR1)位9:8 CKD:时钟分频(Clock division)此位域指示定时器时钟(CK_INT) 频率与数字滤波器所使用的采样时钟(ETR、TIx之间的分频比,00:t DTS = t CK_INT 01:t DTS = 2 × t CK_INT10:t DTS = 4 × t CK_INT 11:保留------------------------------------------------------------------------------- 最后再来看看捕获/比较寄存器1:TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度(注意,对于脉宽太长的情况,还要计算定时器溢出的次数)。

相关文档
最新文档