stm32定时器计算时间差 hal
时间: 2024-12-26 09:17:45 浏览: 9
### 使用 STM32 HAL 库实现定时器计算时间差
为了使用 STM32 HAL 库来测量两个事件之间的时间差,可以利用输入捕获功能。具体来说,当检测到信号的跳变沿时,会将当前计数器 CNT 的值锁定并存储到捕获寄存器 CCR 中。通过比较前后两次捕获到的 CCR 值,即可得出这两个事件间的时间间隔。
下面是一个简单的例子,展示如何配置 TIM2 来捕捉上升沿和下降沿,并据此计算两者之间的持续时间:
#### 初始化定时器
首先,在 `main.c` 文件中初始化定时器 TIM2 并开启中断服务函数 (ISR),以便能够响应外部触发源的变化。
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
// 启动输入捕获通道 IC1 上升沿/下降沿检测
__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC1); // 开启 CC1 中断
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
while (1)
{
// 主循环等待中断处理程序完成数据采集工作...
}
}
// 定义全局变量用于保存前一次和本次捕获的数据
uint32_t previousCaptureValue = 0;
uint32_t currentCaptureValue = 0;
float pulseWidthMicroSecs = 0;
/**
* @brief This function handles TIM2 global interrupt.
*/
void TIM2_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_CC1) != RESET && __HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_CC1) != RESET)
{
// 清除标志位以防重复进入 ISR
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_CC1);
// 获取最新捕获值
currentCaptureValue = __HAL_TIM_Get Capture (&htim2,TIM_CHANNEL_1);
// 计算脉宽微秒级单位下的宽度
pulseWidthMicroSecs = ((currentCaptureValue - previousCaptureValue)*1e6)/72; //假设APB1=72Mhz
// 更新previousCaptureValue为最新的capture value准备下次计算
previousCaptureValue=currentCaptureValue ;
// 执行其他必要的操作...
}
}
```
这段代码展示了如何设置一个基于 STM32F1 系列 MCU 的项目,其中包含了启动定时器、使能相应的中断以及编写中断服务例程等内容。每当发生指定类型的边沿变化(即上升沿或下降沿),就会调用上述定义好的 `TIM2_IRQHandler()` 函数来进行进一步的操作,比如读取新的捕获值并计算出两者的差异作为所测得的时间差[^3]。
请注意,这里假定 APB1 总线频率为 72 MHz,因此每滴答代表约 1/(72*1E6)=13.9ns 的实际物理时间。如果系统的总线频率不同,则需相应调整转换因子以获得准确的结果。
阅读全文