江科大stm32学习笔记输入捕获
时间: 2025-06-02 21:35:08 浏览: 45
### 关于江科大 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]。
---
阅读全文
相关推荐















