通用定时器---输入捕获功能

目录

一、概念

二、输入捕获的结构图

三、配置的基本步骤


一、概念

        STM32的输入捕获功能是一种强大的特性,他允许处理器捕获外部输入信号,并基于定时器抓取输入信号指定触发方式(上升沿/下降沿)之间的长度。这对于测量信号的脉宽,频率和周期非常有用。

        输入捕获通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变时,将当前定时器的值(TIMx_CNT)存放到对应的输入捕获寄存器(CCR)中,完成一次捕获。  可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模式,同时测量频率和占空比 可配合主从触发模式,实现硬件全自动测量。

        其中,输入捕获支持以下三种捕获方式:

  1. 上升沿触发:当信号从低电平跳变到高电平时触发。
  2. 下降沿触发:当信号从高电平跳变到低电平时触发。
  3. 上下都触发:同时捕获上升沿和下降沿,以便测量信号的完整周期。

        对于测量频率,我们一般有两种方法:

        1.直接测频率法:先开启定时器,记录信号来临的次数,一个周期/多个周期后,这个次数直接就是频率值。

        2.测量周期间接测量频率法:先开启定时器,在信号来临时记录一次当前定时器的值T1,然后在第二次信号来临的时候记录定时器的值T2,则时间差为T2-T1,即周期,取到数则得到了频率。

        这两种方法各有优点:直接法适合测量频率较高的信号;间接法适合测量频率较低的信号。这个较高和较低一般通过中界频率来衡量,如果大于中界频率则使用直接法,小于则使用间接法。

二、输入捕获的结构图

        这里的主从触发模式选择:可以让GPIOA在有信号输入的时候,在TI1FP1时,兵分两路,一路往下让CCR寄存机锁存CNT计数器的值;另一路让TIM2计数器自动清零CNT计数器。这样我们从第二次开始,读取 到CCR寄存器中的值就直接是计数值了。

三、配置的基本步骤

1.开启时钟

首先,需要使能TIM2(作为计数器)和相应GPIO引脚(作为信号输入口)的时钟。

2.配置引脚

将GPIO引脚配置为复用功能,并设置为输入模式。

3.配置基本定时器

初始化TIM2的基本参数,如预分频器、计数器模式和自动重装载值。

4.配置输入捕获

设置输入捕获的通道映射、预分频、滤波和触发极性。

5.使能捕获通道和定时器

最后,使能捕获通道和定时器开始工作。

6.配置中断和编写中断服务程序(每过一段时间看一下CCR寄存器的值)

配置NVIC中断优先级,并编写中断服务程序来处理捕获事件。

//打开时钟
void Open_Timer()
{   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 假设使用GPIOA的某个引脚作为输入
}

//配置GPIOA_0的引脚为输入模式
void Init_GPIOA()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // X为具体的引脚号
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 或者设置为上拉/下拉输入,根据需要
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

//配置TIM2定时器的计数功能
void Init_TIM2_Count()
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 65536 - 1; // 设置自动重装载值---计数周期
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 设置预分频器,根据需要调整
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
}

//配置输入捕获
void Init_TIM2_Capture()
{
    TIM_ICInitTypeDef TIM_ICInitStructure;
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // 使用TIM2的通道1
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 输入信号的上升沿触发
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // //输入信号交叉,选择直通,不交叉
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 输入信号不分频,每一个信号都触发捕获
    TIM_ICInitStructure.TIM_ICFilter = 0x0F; // 输入信号滤波
    TIM_ICInit(TIM2, &TIM_ICInitStructure);
}


//选择触发源及模式
void Init_Mode()
{
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位																	//即TI1产生上升沿时,会触发CNT归零
}

void Init_NVIC()
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


void Init_IC()
{
    Open_Timer();
    Init_GPIOA();
    Init_TIM2_Count();
    Init_TIM2_Capture();
    Init_Mode();
    
    Init_NVIC();
}




//中断服务函数
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
    {
        // 读取捕获值
        uint32_t capture_value = TIM_GetCapture1(TIM2);

        // 清除中断标志
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

        // 在这里处理捕获值,例如计算信号的周期或频率
    }
}

### STM32 定时器输入捕获配置方法 #### 1. 初始化时钟 为了使能定时器及其关联的 GPIO 端口,在初始化阶段需要开启对应的外设时钟。对于 STM32F103 的 TIM4 和 GPIOB,可以通过以下代码实现: ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 启用 TIM4 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 启用 GPIOB 时钟 ``` 上述代码片段展示了如何启用 TIM4 及其相关 GPIOB 的时钟[^1]。 --- #### 2. 配置 GPIO 引脚 GPIO 引脚需被设置为复用功能推挽输出模式,以便将其作为定时器输入捕获通道。以下是具体的配置过程: ```c GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_X; // 替换 X 为目标引脚编号 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 设置为复用推挽模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置最大速度为 50 MHz GPIO_Init(GPIOX, &GPIO_InitStruct); // 替换 X 为目标端口 (如 GPIOB) ``` 此部分代码定义了目标 GPIO 引脚的功能和电气特性。 --- #### 3. 输入滤波器配置 为了避免外部信号噪声干扰,可以利用定时器输入滤波器来稳定信号。通过修改 `TIMx_CCMRx` 寄存器中的 `ICxF` 位组,可设定滤波器的采样周期。例如,若希望滤波器能够过滤掉少于 8 个连续相同状态的变化,则应将 `IC1F` 设定为 `0b0111`(即 7+1=8 个 f<sub>DTS</sub> 周期)[^2]。 实际应用中可通过库函数完成如下操作: ```c TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_ICInitTypeDef TIM_ICInitStruct; // 配置基本计数器参数 TIM_TimeBaseStruct.TIM_Period = 0xFFFF; // 自动重装载值 TIM_TimeBaseStruct.TIM_Prescaler = 9-1; // 预分频系数 (假设系统时钟为 72 MHz) TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 不使用时基分割 TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 计数方向向上 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStruct); // 配置输入捕获通道 TIM_ICInitStruct.TIM_Channel = TIM_Channel_1; // 使用通道 1 TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;// 上升沿触发 TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接 TIx 模式 TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不预分频 ICx TIM_ICInitStruct.TIM_ICFilter = 8; // 滤波器采样次数为 8 TIM_ICInit(TIM4, &TIM_ICInitStruct); ``` 以上代码实现了对 TIM4 的基础计数器以及输入捕获通道的具体配置。 --- #### 4. 中断与 DMA 配置 为了让程序能够在每次发生输入捕获事件时得到通知,通常会启用中断服务例程或者启动 DMA 转移数据至内存缓冲区。下面是一个简单的中断配置示例: ```c void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; // 选择 TIM4 中断向量 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 抢占优先级最高 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; // 子优先级最低 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 开启该中断线 NVIC_Init(&NVIC_InitStructure); } TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE); // 使能 CC1 中断 ``` 当输入捕获条件满足时,会产生一次中断请求并跳转到相应的 ISR 函数处理逻辑。 --- #### 5. 复杂场景下的间接输入捕获 某些情况下可能需要用到间接输入捕获方式 (`TIM_ICSelection_IndirectTI`) 来增强灵活性。这种方式允许其他通道上的信号充当当前通道的触发源之一。例如,如果选择了 TIM_ICSelection_IndirectTI 参数,则意味着输入捕获触发信号来源于另一个特定映射路径而非直接来自硬件管脚[^3]。 --- ### 总结 综上所述,STM32 定时器输入捕获功能涉及多个方面的细致调整,包括但不限于时钟管理、GPIO 初始态分配、滤波单元定制化设计以及最终软件层面上针对异常情况作出响应机制的设计等环节。这些步骤共同构成了一个完整的解决方案框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值