STM32 TIM1输入捕获配置

发布者:EtherealJourney最新更新时间:2019-08-21 来源: eefocus关键字:STM32  TIM1  输入捕获配置 手机看文章 扫描二维码
随时随地手机看文章

最近做一个IRIG-B码对时的项目用到STM32的TIM1输入捕获功能,配置TIM1的输入捕获遇到很多坑,在这里总结下,希望对大家有帮助。


项目中用到的输入引脚为PE13,为TIM1_H3即TIM1的第3通道,这里提醒大家在使用引脚功能时最好查看引脚的重映象表,看是否要开启重映象,功能为捕获高电平脉宽,具体配置如下:


1.首先配置GPIO

/* GPIO引脚配置 */

void R_gpio_init(void)      

{

GPIO_InitTypeDef GPIO_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//开启引脚时钟

 

GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);  //开启TIM1重映象

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;         //PE13     

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     //引脚设置为上拉输入

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOE,&GPIO_InitStructure);

}

2.配置TIM1

/* TIM1输入捕获配置 */

void Time_init(void) 

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_ICInitTypeDef TIM1_ICInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //TIM1 时钟使能

 

TIM_ClearITPendingBit(TIM1, TIM_IT_Update );     //清除TIM1更新中断标志 

 

//定时器 TIM1 初始化

TIM_TimeBaseStructure.TIM_Period = 7199; //设置自动重装载寄存器的周期值,使100ms产生一次中断

TIM_TimeBaseStructure.TIM_Prescaler = 999; //设置预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频系数

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //初始化 TIM1

 

//TIM1输入捕获参数配置

TIM1_ICInitStructure.TIM_Channel = TIM_Channel_3; //捕获通道IC3

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

TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接映射

TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //不分频,每个变化沿都捕获

TIM1_ICInitStructure.TIM_ICFilter = 0x00;//不滤波

TIM_ICInit(TIM1, &TIM1_ICInitStructure);

 

//中断优先级 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1 捕获中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能

NVIC_Init(&NVIC_InitStructure); //初始化 NVIC 寄存器

 

TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC3,ENABLE);       //使能更新中断和捕获中断

 

TIM_Cmd(TIM1, ENABLE);         //使能定时器

}

配置TIM1的时候有几点要很小心:


        1.TIM1在APB2时钟总线上,所以应使用RCC_APB2PeriphClockCmd()函数使能TIM1时钟;


        2.TIM1有多种中断,这里选择捕获比较中断,即TIM1_CC_IRQn;


        3.引脚为TIM1_CH3,即TIM1的3通道,中断标志位TIM_IT_CC3。


3.中断服务函数配置

/*    TIM1 中断服务程序   */

void TIM1_CC_IRQHandler(void)          

{

  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM1更新中断标志 

  {

    overflow++;

  }

  else if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET) //检查TIM1通道3捕获中断标志

  {

    if(state == START) //初始状态

    {

            overflow = 0;

            TIM_SetCounter(TIM1,0);

            state = WAIT_FALLING;

            TIM_OC3PolarityConfig(TIM1,TIM_ICPolarity_Falling); //设置为下降沿捕获

    }

    else if(state == WAIT_RISING)    //捕获上升沿

    {

       //     TIM1CH3_CAPTURE_VAL = TIM_GetCapture3(TIM1);     

       //     value = TIM1CH3_CAPTURE_VAL + (overflow*7200);

            overflow = 0;

            TIM_SetCounter(TIM1,0);

            state = WAIT_FALLING;

            TIM_OC3PolarityConfig(TIM1,TIM_ICPolarity_Falling); //设置为下降沿触发

    }

    else // 捕获下降沿

    {

            TIM1CH3_CAPTURE_VAL = TIM_GetCapture3(TIM1);

            value = TIM1CH3_CAPTURE_VAL + (overflow*7200);

 

            overflow = 0;

            TIM_SetCounter(TIM1,0);

            state = WAIT_RISING;

            TIM_OC3PolarityConfig(TIM1,TIM_ICPolarity_Rising); //设置为上升沿触发

    }

  }

  TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC3 );     //清除TIM1更新中断标志和捕获标志 

}

这里需要注意几点:


       1.TIM1的中断服务函数名要注意,此次用到的是TIM1的捕获比较中断,所以为void TIM1_CC_IRQHandler(void);


       2.改变捕获极性的函数要注意,此处为改变通道3捕获极性的函数,所以为TIM_OC3PolarityConfig();


       3.通道3获取捕获值函数为TIM_GetCapture3();


       4.因为我只需要高电平脉宽,所以只需要在捕获上升沿的时候获取捕获值即可。


经过测试高电平脉宽为10毫秒时捕获值为720,5ms时捕获值为360。


公式为:脉宽=((1 + TIM_Prescaler)/系统时钟频率)*捕获值

关键字:STM32  TIM1  输入捕获配置 引用地址:STM32 TIM1输入捕获配置

上一篇:【STM32】STM32之timer1产生PWM(互补通道)
下一篇:STM32PWM配置详解笔记

推荐阅读最新更新时间:2024-11-13 15:53

STM32学习日志--使用DMA功能自动更新PWM的输出
/******************************************************************************* 编译环境: EWARM V5.30 硬件环境: DZY2.PCB STM32 FW: V3.0.0 作者 : szlihongtao ****************************************************************************** REV : V1.00 DATE : 2011-04-18 NOTE : ********************************************
[单片机]
STM32 输入捕获 测量频率 PWM占空比
看了网上关于STM32输入捕获的资料,有几篇介绍的很不错,但是内容上还有一点问题,稍加修改,大家可以参考一下。 重要概念理解(对于理解输入捕获功能很重要,特别看了数据手册CCR1CCR2CCR3CCR3云里雾里) PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。 4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。 5. 当触发信号来临时,被设置成触发输入信号的捕获
[单片机]
stm32中printf要做哪些配置
在调试代码时,我们经常用printf函数来输出一些打印信息,那么你的UART串口不够用,还要用printf要怎么办? 其实很简单,就是:使用SWO/SWV。 SWO:Serial Wire Output,串行线输出 SWD:Serial Wire Viewer,串行线查看器 使用printf要做哪些配置? 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。 2、在main文件中重定义《fputc》函数 3、在工程属性的 “Target“ -》 ”Code Generation“ 选项中勾选 ”Use MicroLIB“” MicroLIB 是缺省C的备份库,
[单片机]
STM32_TIM定时- 中断
今天讲解STM32F103定时器定时-中断功能,在昨天定时器延时的软件工程上添加TIM3定时的功能,你们也可以试着将昨天的工程添加修改得到。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPnJ9KYcXbPsP 访问密码 acd8 工程现象:间隔(定时器定时)500ms LED变化一次, 并且串口打印 STM32F103ZE有8个定时器(TIM1 – TIM8), 改工程以TIM3定时为例。 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 关于TIM延时,我把重要的几点在下面分别讲述,工程中没有在这里讲述的都是之
[单片机]
STM32_TIM定时- 中断
使用LLVM-embedded-toolchain-for-Arm-17.0.1开发STM32
LLVM-embedded-toolchain-for-Arm 是一个 ARM 公司开源的适用于 32 位ARM芯片的工具链,支持多种ARM指令集架构,包括最新的 CM85 内核。由于是基于 LLVM 和 picolibc构建出的工具链,因此在代码体积和执行效率上都很有竞争力,甚至可以和商用闭源的工具链进行 PK。 支持的架构 Armv6-M Armv7-M Armv7E-M Armv8-M Mainline Armv8.1-M Mainline Armv4T (experimental) Armv5TE (experimental) Armv6 (experimental, using the Armv5TE library v
[单片机]
STM32的启动过程
由于微控制器上电之后没有办法定位Main函数的位置,因为变量和函数的地址都是由编译器在编译的时候自行分配的,所以Main函数的在微控制器内部的位置是可变的,所以每个微控制器都有一个复位后到跳转的到Main函数的过程,这个过程都是由启动文件来完成的,不管是51、AVR都有,有些时候是由开发环境自己提供了这样的一个启动文件。我们只需管从Main函数开始的应用程序即可,简化了我们的工作。 在STM32微控制器中ST公司已经帮我们完成了这样一个启动文件的工作,不管是MTK环境还是IAR环境都已经集成好了。新一代的Cort ex 的微控制器在启动方式上较ARM7/9都有较大的变化,ARM7/9中复位后从固定的地址(0x0)取出第一条指令
[单片机]
FreeRTOS 在STM32上的移植 V1.0
FreeRTOS作为开源的轻量级实时性操作系统,不仅实现了基本的实时调度、信号量、队列和存储管理,而且在商业应用上不需要授权费。 FreeRTOS的实现主要由list.c、queue.c、croutine.c和tasks.c 4个文件组成。list.c 是一个链表的实现,主要供给内核调度器使用;queue.c 是一个队列的实现,支持中断环境和信号量控制;croutine.c 和task.c是两种任务的组织实现。对于croutine,各任务共享同一个堆栈,使RAM的需求进一步缩小,但也正因如此,他的使用受到相对严格的限制。而task则是传统的实现,各任务使用各自的堆栈,支持完全的抢占式调度。 FreeRTOS的主
[单片机]
FreeRTOS 在<font color='red'>STM32</font>上的移植 V1.0
STM32学习笔记之 DS18B20 SEARCH ROM
使用说明,根据MCU不同 用户只需修改4函数 //单总线复位函数 int OWReset(); 单线总线的复位函数,注意这个要做相应修改,如果期间存在要返回1,期间不存在返回0, 直接从总线上读取的是期间存在返回0,不存在返回1 //向总线发送一个字节 void OWWriteByte(unsigned char dat); //向总线发送一位 void OWWriteBit(unsigned char bit_value); //读取总线一位 unsigned char OWReadBit(); 使用时用 int OWFirst();发现第一个单线器件 如果期间存在返回1,并且把ID存在 unsigned char
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved