stm32c8t6标准库输入捕获
时间: 2025-05-11 07:20:28 浏览: 18
### STM32C8T6 使用标准库实现输入捕获功能
#### 输入捕获简介
输入捕获是一种通过定时器捕捉外部信号变化的功能,在嵌入式开发中广泛用于测量脉冲宽度、频率或其他时间参数。对于 STM32 微控制器而言,其通用定时器(如 TIM2-TIM5 和 TIM9-TIM14)支持输入捕获模式。
在 STM32C8T6 中,可以通过标准库函数 `TIM_TimeBaseInit` 初始化定时器基础设置,并使用 `TIM_ICInit` 配置输入捕获通道[^2]。以下是具体实现方法及相关代码示例:
---
#### 定时器初始化配置
为了启用输入捕获功能,需先完成定时器的基础配置。这包括设定预分频系数、计数周期以及工作模式等参数。
```c
// 定义结构体变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
void TIM_Config(void) {
// 使能相关时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// 配置 GPIO 引脚为复用推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // PA6/PA7 对应 TIM3_CH1/TIM3_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置定时器基本参数
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频值 (假设系统时钟为 72 MHz)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
}
```
---
#### 输入捕获通道配置
接下来需要针对具体的输入捕获通道进行配置。这里以 TIM3 的 CH1 和 CH2 为例说明如何设置输入捕获模式。
```c
// 定义结构体变量
TIM_ICInitTypeDef TIM_ICInitStructure;
void TIM_InputCaptureConfig(void) {
// 配置输入捕获通道
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 = 0x0F; // 数字滤波器
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// 同样方式配置通道 2
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// 开启中断并使能 DMA 请求(可选)
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
// 启动定时器
TIM_Cmd(TIM3, ENABLE);
}
```
上述代码实现了对 TIM3 的两个输入捕获通道的初始化配置。其中,`TIM_ICPolarity` 参数决定了触发边沿类型(上升沿或下降沿),而 `TIM_ICFilter` 则提供了抗干扰能力。
---
#### 获取捕获值
当硬件检测到指定事件发生时,会自动将当前计数值保存至对应的寄存器中。开发者可通过读取这些寄存器获取实际的时间戳数据。
```c
uint16_t GetCaptureValue(uint8_t channel) {
uint16_t capture_value = 0;
if (channel == 1) {
capture_value = TIM_GetCapture1(TIM3); // 获取通道 1 捕获值
} else if (channel == 2) {
capture_value = TIM_GetCapture2(TIM3); // 获取通道 2 捕获值
}
return capture_value;
}
void HandleInterrupt(void) {
if (TIM_GetITStatus(TIM3, TIM_IT_CC1)) { // 如果通道 1 发生中断
uint16_t value = GetCaptureValue(1);
printf("Channel 1 Capture Value: %d\r\n", value)[^3];
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); // 清除标志位
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC2)) { // 如果通道 2 发生中断
uint16_t value = GetCaptureValue(2);
printf("Channel 2 Capture Value: %d\r\n", value);
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); // 清除标志位
}
}
```
此部分展示了如何从特定通道提取已捕获的数据,并将其打印到串口终端上显示。
---
#### 总结
以上即为利用 STM32 标准库实现输入捕获的主要流程。需要注意的是,不同型号芯片可能具备略微差异化的资源分配情况,请务必参照官方手册确认引脚映射关系及可用外设列表[^1]。
阅读全文
相关推荐

















