STM32 输入捕获配置

  在STM32 的定时器,除了 TIM6 和 TIM7,就是通过检测 TIMx_CHx 上的
边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当时定时器

的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,
完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。

1)开启 TIM5 时钟和 GPIOA 时钟, 配置 PA0 为下拉输入。

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

2) 初始化 TIM5,设置 TIM5 的 ARR 和 PSC。

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化 Tim5

3)设置 TIM5 的输入比较参数,开启输入捕获

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

TIM_ICInitTypeDef TIM5_ICInitStructure;
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);

4)使能捕获和更新中断(设置 TIM5 的 DIER 寄存器)

TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断和捕获中断

if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){}//判断是否为更新中断
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){}//判断是否发生捕获事件
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);//清除中断和捕获标志位

6)使能定时器(设置 TIM5 的 CR1 寄存器)

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

 1 //定时器 5 通道 1 输入捕获配置
 2 TIM_ICInitTypeDef TIM5_ICInitStructure;
 3 void TIM5_Cap_Init(u16 arr,u16 psc)
 4 {
 5     GPIO_InitTypeDef GPIO_InitStructure;
 6     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 7     NVIC_InitTypeDef NVIC_InitStructure;
 8     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 时钟
 9   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 时钟
10   //初始化 GPIOA.0 ①
11   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置
12   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
13   GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
14   GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
15   //②初始化 TIM5 参数
16     TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
17     TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
18     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
19     TIM_TimeBaseStructure.TIM_CounterMode =         TIM_CounterMode_Up; //TIM 向上计数模式
20     TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx
21   //③初始化 TIM5 输入捕获通道 1
22     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
23     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
24     TIM5_ICInitStructure.TIM_ICSelection =                 TIM_ICSelection_DirectTI; //映射到 TI1 上
25     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
26     TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
27     TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1
28   //⑤初始化 NVIC 中断优先级分组
29     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中断
30     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级
31     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级
32     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
33     NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
34     TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断
35     TIM_Cmd(TIM5,ENABLE ); //⑥使能定时器 5
36 }
37         

知识来源:STM32F1开发指南-库函数版本_V3.1

时间: 2024-08-27 06:30:02

STM32 输入捕获配置的相关文章

STM32——输入捕获实验原理及配置步骤

输入捕获实验原理及配置步骤 一.输入捕获概念 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获.同时还可以配置捕获时是否触发中断/DMA 等. 二.输入捕获流程: 例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤: 1.配置TIMx_CCMR1寄存器CC2S='01',配置通

[STM32F103]PWM输入捕获配置

l 初始化定时器和通道对应IO的时钟. l 初始化IO口,模式为输入: GPIO_Init(); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入 l 初始化定时器ARR,PSC TIM_TimeBaseInit(); l 初始化输入捕获通道 TIM_ICInit(); l 如果要开启捕获中断, TIM_ITConfig(); NVIC_Init(); l 使能定时器: TIM_Cmd(); l 编写中断服务函数: TIMx_IRQHa

STM32 输入捕获的脉冲宽度及频率计算

1 TIM8_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 2 voidTIM8_CC_IRQHandler(void) 3 { 4 if(TIM_GetITStatus(TIM8,TIM_IT_CC4)!=RESET) 5 { 6 TIM_ClearITPendingBit(TIM8, TIM_IT_CC4); //清除中断标志位 7 if(state==0) //捕获第一个上升沿 8 { 9 state=1; 10 timecount=TIM_GetCapture4

STM32学习笔记11(通用定时器作为输入捕获2)

通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的

stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

输入捕获,输出比较

明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻. 外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现. 时间标记可用来计算频率,占空比及信号

STM32F4——定时器原理及应用(中断、输入捕获、PWM输出)

一.简介: 不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器.通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍定时器的原理和应用.对于通用定时器根据位数和计数方式的不同又可以分为3类,相关分类的图表如下: 二.应用: 1.更新:计数器的上溢或下溢.2.事件触发.3.输入捕获.4.输出比较.5.支持针对定位的增量编码和霍尔传感器电路.5.触发输入作为外部时钟或按周期电源管理.下边会针

输入捕获

#include "timer.h"#include "led.h"#include "usart.h" //TIM14 PWM部分初始化 //PWM输出初始化//arr:自动重装值//psc:时钟预分频数void TIM14_PWM_Init(u32 arr,u32 psc){ //此部分需手动修改IO口设置 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_Tim

STM32F0xx_TIM输入捕获(计算频率)配置详细过程

前言 关于STM32的定时器,可谓是功能强大,估计没有多少人研究完STM32定时器的所有功能(包括我也没有),只是使用常用的一些功能,后续我会推出关于STM32定时器的更多功能. STM32芯片多数为16位计数,但基本上都有1个或两个32位的定时器,可惜的是我们最常使用的F1系列芯片中没有32位的定时器,F030中也没有,具体请看数据手册. 今天主要总结关于STM32F0系列输入捕获,捕获信号频率,即所谓逻辑分析仪检测数字频率的功能. 今天使用32位的TIM2作为捕获的定时器,为什么是32位,原