STM32小白笔记-TIM输入捕获

TIM输入捕获ICInput Capture

  1. 输入捕获模式下,当通道输入引脚出现指定电平跳变时(上升沿或下降沿),当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
  2. 每个高级定时器和通用定时器都拥有4个输入捕获通道
  3. 可配置为PWMI模式,同时测量频率和占空比
  4. 可配置为主从触发模式,实现硬件全自动测量

4个输入捕获和4个输出比较通道,共用4CCR寄存器,CH1CH4四个通道的引脚也是共用的,所以对于同一个定时器只能使用输入捕获和输出比较其中一个,不能同时使用

相当于外部中断,监测电平跳变然后执行动作,只不过外部中断执行动作为向CPU申请中断,而输入捕获执行动作是控制后续电路(CNT锁存到CCR

信号从四个输入捕获引脚进来,经过两套输入滤波器(信号整形,得到TI1)和边沿检测器(监测到指定电平跳变,才触发后续电路执行动作),得到TI1FP1TI1FP2,以CH1通道为例,第一套滤波器得到TI1FP1,输入给通道1的后续电路;第二套得到TI1FP2,输入给通道2的后续电路。CH1可与CH2交叉,CH3可与CH4交叉,其作用是可灵活切换后续捕获电路的输入,或者将一个引脚的输入映射到两个捕获单元(PWMI经典结构,第一个通道由上升沿触发,用来捕获周期;第二个通道由下降沿触发,用来捕获占空比,两个通道同时对一个信号进行捕获,就可以同时测量频率和占空比)。随后信号来到预分频器进行分频,分频之后的触发信号就可以触发捕获电路进行工作,每来一个触发信号,CNT的值就会向CCR转运一次,转运的同时会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可产生中断(捕获中断)

  1. 主模式可以将定时器内部信号映射到TRGO引脚,用以触发其他外设
  2. 从模式可以接受其他外设或自身外设的一些信号,用于控制自身定时器的运行
  3. 触发源选择(从模式的触发信号源),选择一个指定的信号,得到TRGI,从而触发从模式

输入捕获基本结构

PWMI基本结构

 

### 关于江科大 STM32 输入捕获 学习笔记 教程 #### 什么是输入捕获输入捕获是一种通过定时器捕捉外部信号变化的功能。它通常用于测量脉冲宽度、频率或其他时间相关的参数。STM32 的定时器模块提供了强大的输入捕获功能,可以通过配置通道来检测特定事件并记录对应的时间戳。 在江科大的 STM32 学习笔记中提到,STM32 的定时器支持多种高级特性,其中包括 **输入捕获** 功能[^3]。该功能允许用户利用定时器的输入通道捕获外部信号的变化时刻,并将其转换为计数值以便进一步处理。 --- #### 配置输入捕获的关键步骤 以下是实现输入捕获的主要技术要点: 1. **选择合适的定时器** - 使用具有输入捕获功能的通用定时器(如 TIM2, TIM3 等)。这些定时器具备多个通道,可作为输入捕获使用。 2. **设置时钟源** - 定时器的工作依赖内部或外部时钟源。对于输入捕获应用,可以选择外部时钟源以同步外部信号[^3]。 3. **配置输入捕获模式** - 设置定时器通道输入捕获模式(IC Mode),并通过滤波器减少噪声干扰。 - 配置极性(上升沿、下降沿或双边沿触发)以及捕获预分频系数。 4. **启用中断或 DMA** -捕获到指定事件时,可通过中断服务程序读取捕获寄存器中的值,或者借助 DMA 将数据传输至内存缓冲区。 5. **计算实际时间间隔** - 利用捕获寄存器存储的计数值和定时器时基频率,可以推导出两次捕获之间的时间差。 --- #### 示例代码:基于 STM32输入捕获实现 以下是一个简单的输入捕获示例代码片段,展示如何配置 TIM2 进行输入捕获操作: ```c #include "stm32f10x.h" void TIM2_InputCapture_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; // 启用相关外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置 PA0 (TIM2_CH1) 为复用输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 TIM2 时间基准结构体 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 65535; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频器,假设系统时钟为 72 MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化 TIM2 输入捕获结构体 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // 选择通道 1 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿捕获 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接映射 TI1 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不分频 TIM_ICInitStructure.TIM_ICFilter = 0xF; // 数字滤波器 TIM_ICInit(TIM2, &TIM_ICInitStructure); // 开启 TIM2 中断 TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); // 启动定时器 TIM_Cmd(TIM2, ENABLE); } // 中断服务函数 void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { // 检查 CC1 中断标志 uint16_t capture_value = TIM_GetCapture1(TIM2); // 获取捕获TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); // 清除中断标志 } } ``` 此代码展示了如何初始化 TIM2 并配置其通道 1 为输入捕获模式。当检测到上升沿时,会触发中断并将捕获值保存下来。 --- #### 参考资源推荐 除了上述内容之外,还可以参考以下资源深入学习: - STMicroelectronics 提供的《STM32 Reference Manual》详细描述了定时器架构及其工作原理[^1]。 - `Delay.h` 文件定义了一些基础延时函数,虽然不直接涉及输入捕获,但可以帮助理解硬件延迟的概念[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值