STM32定时器5的输入捕获实验

发布者:大树下的大白菜y最新更新时间:2019-01-30 来源: eefocus关键字:STM32  定时器5  输入捕获 手机看文章 扫描二维码
随时随地手机看文章

此处使用的普中开发板,实验内容定时器5输入捕获通道1的高电平时长。


软件实现方法:


定时器5主要使用了两个功能:


①时基单元;②输入捕获;


从下文可知,通过定时器5捕获到相应的极性(eg:上升沿或高电平and so on)后,保存计数器的当前值到捕获/比较寄存器(TIMx_CCRx)中。而后,通过第二次捕获成功后,通过差值就可以求出该极性的周期或保持时间。此实验室捕获高电平的时间,通过先捕获上升沿再捕获下降沿,即可求出一个高电平的时长。

数据手册描述如下:


在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存

器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志(TIMx_SR寄存器)被置1,如果开放

了中断或者DMA操作,则将产生中断或者DMA请求。如果发生捕获事件时CCxIF标志已经为

高,那么重复捕获标志CCxOF(TIMx_SR寄存器)被置1。写CCxIF=0可清除CCxIF,或读取存储

在TIMx_CCRx寄存器中的捕获数据也可清除CCxIF。写CCxOF=0可清除CCxOF。 

以下例子说明如何在TI1输入的上升沿时捕获计数器的值到TIMx_CCR1寄存器中,步骤如下: 

● 选择有效输入端:TIMx_CCR1必须连接到TI1输入,所以写入TIMx_CCR1寄存器中的

CC1S=01,只要CC1S不为’00’,通道被配置为输入,并且TIMx_CCR1寄存器变为只读。 

●  根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为TIx时,输入滤波器控制位是

TIMx_CCMRx寄存器中的ICxF位)。假设输入信号在最多5个内部时钟周期的时间内抖动,

我们须配置滤波器的带宽长于5个时钟周期;因此我们可以(以fDTS频率)连续采样8次,以确

认在TI1上一次真实的边沿变换,即在TIMx_CCMR1寄存器中写入IC1F=0011。 

● 选择TI1通道的有效转换边沿,在TIMx_CCER寄存器中写入CC1P=0(上升沿)。 

● 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预

分频器被禁止(写TIMx_CCMR1寄存器的IC1PS=00)。 

● 设置TIMx_CCER寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中(使能输入捕获)。 

● 如果需要,通过设置TIMx_DIER寄存器中的CC1IE位允许相关中断请求,通过设置

TIMx_DIER寄存器中的CC1DE位允许DMA请求。 

当发生一个输入捕获时: 

● 产生有效的电平转换时,计数器的值被传送到TIMx_CCR1寄存器。 

●  CC1IF标志被设置(中断标志)。当发生至少2个连续的捕获时,而CC1IF未曾被清除,

CC1OF也被置1。 




● 如设置了CC1IE位,则会产生一个中断。 

● 如设置了CC1DE位,则还会产生一个DMA请求。 

为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢

出标志之后和读取数据之前可能产生的捕获溢出信息。




使用库函数可以简化许多步骤,毕竟是别人包装好的函数来着。


TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器

TIM_ICInitTypeDef TIM5_ICInitStructure;

 

NVIC_InitTypeDef NVIC_InitStructure;

 

/* 开启定时器5时钟 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //使能TIM5时钟

 

TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1); //清除中断和捕获标志位

 

TIM_TimeBaseInitStructure.TIM_Period = 0xffff; //设定计数器自动重装值

TIM_TimeBaseInitStructure.TIM_Prescaler = 71;   //以1Mhz的频率计数 一次即是1us

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1映射到TI1上 

TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 

TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 

TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 

TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波 

TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化TIM5输入捕获通道1

//中断分组初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; //打开TIM5的全局中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能

NVIC_Init(&NVIC_InitStructure);

TIM_Cmd(TIM5,ENABLE); //使能或者失能TIMx外设

TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE ); //使能或者失能指定的TIM中断


中断处理函数

void TIM5_IRQHandler()   //定时器5输入捕获中断函数

{

if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获

{

if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)

{

if(TIM5CH1_CAPTURE_STA&0X40) //已经捕获到高电平了

{

if((TIM5CH1_CAPTURE_STA&0x3f)==0x3f)//高电平太长了

{

TIM5CH1_CAPTURE_STA|=0x80; //标记成功捕获了一次

TIM5CH1_CAPTURE_VAL=0xffff;

}

else

{

TIM5CH1_CAPTURE_STA++;

}

}

}

}

if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获1发生捕获事件

{

if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿

{

TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿 

TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); //获得TIMx输入捕获1的值

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获

}

else

{

TIM5CH1_CAPTURE_STA=0; //清空 

TIM5CH1_CAPTURE_VAL=0; 

TIM_SetCounter(TIM5,0); 

TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 

TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获

}

}

TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

}


库函数的处理方式,是将手册上说到条件逐一封装到TIM_ICInitTypeDef 结构体中,再通过TIM_ICInit()函数将相应的值填写到寄存器中即可。


关键字:STM32  定时器5  输入捕获 引用地址:STM32定时器5的输入捕获实验

上一篇:基于STM32使用超声波HC-SR04模块
下一篇:STM32之JTAG口作为普通IO使用

推荐阅读最新更新时间:2024-03-16 16:23

STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
概述 本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 选择芯片型号 配置时钟源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: 配置时钟树 STM32F0的最高主频到48M,所以配置48即可: 串口配置 本次实验使用的串口1进行串口通信,波特率配置为115200。 在这里插入图片描述 定时器配置 本次使用定时器1的通道2进行检测,配置入下。 红外接收管 这里使用VS838的接收管,如下所示: 红外编码 NEC协议载波:38k
[单片机]
STM32CUBEMX(<font color='red'>5</font>)--自定义红外NEC解码,<font color='red'>定时器</font>TIM<font color='red'>捕获</font>方式
基于STM32的三轴数字罗盘HMC5883L模块的测试方案
  最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测量、输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲(可以配置一个外部中断捕获DRDY引脚的下降沿,并在中断服务程序中读取数据),在STM32中可以设置一个下降沿触发的外部中断,并在中断服务程序中调用角度数据读取函数。以下为操作该模块的主要步骤。   一、IIC协议相关操作(单片机作为主机控制时钟线)   宏定义:   //这里用到了STM32的位带区操作,方便实现对一个位的操作   //PB13配置为OD输出,同时外部给上拉电阻,这样既可输出信号给从机,也能   //在PB1
[单片机]
基于<font color='red'>STM32</font>的三轴数字罗盘HMC5883L模块的测试方案
基于STM32单片机的车牌识别
系统介绍    使用STM32F103RCT6作为主控,摄像头使用OV7670(带FIFO)。STM32进行了16倍频。识别过程分别为:图像采集,二值化,识别车牌区域,字符分割,字符匹配。 识别过程分析 1.图像采集:    通过OV7670摄像头进行图像采集,采集的图像大小为320*240像素,像素格式为RGB565。每个像素由两字节组成,第一字节的高五位是Red,第一字节的低三位和第二字节的高三位组成Green,第二字节的低五位是Blue。 2.二值化:    二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),让整个图片呈现出只有黑色和白色的效果。二值化后的图像中灰度值范围是0或者255。   
[单片机]
stm32中gpio的学习浅谈
在基本入门熟悉了开发环境后,我开始学习stm32中的gpio口用法,学习的方法还是最直观简便的先控制LED灯。然而stm32中点亮led倒没有51单片机那么简便。有过51单片机学习经验的伙伴们,肯定熟悉下图的代码(51中控制led的程序)。 如果同样方法写在stm32中肯定是不行的了,首先因为stm32中没有51头文件中那样定义好了P0口可以直接进行总线操作,其次stm32中的gpio口默认是输入模式并且还需要打开相关引脚口的时钟。可能很多人会觉得stm32中官方给的固件库可以直接操作寄存器从而控制gpio口,但是我觉得我这样的初学者还是多了解下底层的方法便于更好的理解。要实现stm32点亮一个led灯(即让gpio口输
[单片机]
<font color='red'>stm32</font>中gpio的学习浅谈
STM32 关于ADC采交直流问题探讨(二)
5. 硬件电路设计 5.1 电压比较器电路 电压比较器的功能是对两个输入电压的大小进行比较,并根据比较结果输出高低电平。 通常用阈值电压和传输特性来描述比较器的工作特性。 阈值电压(又称门槛电平)是使比较器输出电 压发生跳变时的输入电压值,简称为阈值,用符号UTH表示。估算阈值主要应抓住输入信号使输出电压发生跳变时的临界条件。这个临界条件 是集成运放两个输入端的电位相等(两个输入端的电流也视为零),即U+=U–。 5.1.1 零电平比较器(过零比较器) 电压比较器是将一个模拟输入信号ui与一个固定的参考电压UR进行比较和鉴别的电路。   参考电压为零的比较器称为零 电平比较器。按输入方式的不同可分为反相输入和同
[单片机]
<font color='red'>STM32</font> 关于ADC采交直流问题探讨(二)
基于stm32精英版的温控风扇源码
用stm32F103ZET6精英版,温度传感器是DS18B20,1602液晶显示屏,利用温度来控制转速,液晶显示屏显示实时转速,也可手动调节转速。(采用pi控制) 电路原理图如下: 单片机源程序如下: #include delay.h #include key.h #include sys.h #include timer.h #include lcd1602.h #include encoder.h #include control.h #include usart.h #include usart3.h #include hc05.h #includ
[单片机]
基于<font color='red'>stm32</font>精英版的温控风扇源码
stm32的重映射端口配置
需要用到外设的重映射功能时才需要使能AFIO的时钟 外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1、2、3,它们是用来选择EXTIx外部中断的输入脚之用。 举例:重映射USART2 USART2的TX/RX在PA.2/3 PA.2已经被Timer2的channel3使用需要把USART2的TX/RX重映射到PD.5/6库函数的调用 (1)使能被重新映射到的I/O端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); (2)使能被重新映射的外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USA
[单片机]
STM32窗口看门狗详解
本文将介绍窗口看门狗,并通过按键模拟触发程序死机、进而触发提前唤醒中断、并复位程序。 ①窗口看门狗介绍 ②STM32CUBEMX配置工程文件 ③代码实现 ①窗口看门狗介绍 窗口看门狗用来监测由于不可预知的因素或者不可预知的逻辑条件导致程序脱离正常运行序列的软件故障。 窗口看门狗介绍之工作原理框图: 窗口看门狗介绍之配置寄存器: 预分频器用于将RCC传来的PCLK1时钟进行分频,配置寄存器中第7位第8位用来存放预分频器的预分频值,第0位至第6位用于存放窗口看门狗的窗口值,当计数器的值大于窗口值时喂狗会触发复位、即只有计数器的值在0x40与窗口值之间时喂狗不会触发程序复位;所以窗口值需要大于0x40、小于0x7f,否则窗口没有
[单片机]
<font color='red'>STM32</font>窗口看门狗详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved