HAL库定时器

本文详细介绍了在STM32上使用CubMX进行定时器中断配置的过程,包括设置时钟源、预分频系数、计数模式等,并讲解了如何通过HAL库函数开启和更新定时器中断。此外,还探讨了在一个定时器中定义多个变量以实现多个定时器功能的方法。

1.在cubmx中设置时钟源,设置对应的定时器,预分频系数,计数模式,是否自动重装载,中断使能,中断优先级

2.HAL_TIM_Base_Start_IT(&htim2);开启定时器中断

3.HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);更新定时器中断

特别注意:在一个定时器中定义多个变量可以实现多个定时器的功能,

转载于:https://www.cnblogs.com/cgy601785959/p/10778366.html

### STM32 HAL定时器使用教程及配置示例 #### 定时器输入捕获功能概述 STM32 的 HAL 提供了丰富的 API 来简化定时器的功能开发,其中包括输入捕获模式。该模式允许开发者通过硬件触发来捕捉特定事件的发生时间点,并进一步计算信号周期或占空比等参数[^1]。 以下是基于 HAL 实现定时器输入捕获的主要步骤: #### 配置流程详解 1. **初始化定时器** 使用 `__HAL_TIM_SET_CLOCKSOURCE` 函数设置定时器的时钟源,并启用相应的通道作为输入捕获用途。例如,在 STM32F103 中可以选用 TIM2 或 TIM3 进行操作[^2]。 2. **配置 GPIO 引脚** 将目标引脚配置为复用功能 (AF),并将其映射到指定的定时器通道上。这一步通常可以通过 CubeMX 工具自动生成代码完成初步设定。 3. **编写回调函数处理逻辑** 当发生中断或者 DMA 转移完成后,会调用预定义好的回调接口如 `HAL_TIM_IC_CaptureCallback()` ,在此处加入实际业务需求的相关算法实现部分即可。 #### 示例代码展示 下面给出一段简单的 C 语言程序片段演示如何利用 HAL 来进行基本的输入捕获操作: ```c #include "stm32f1xx_hal.h" // 声明全局变量存储捕获值 uint32_t CaptureValue; void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim2; htim2.Instance = TIM2; htim2.Init.Prescaler = 84 -1 ; // 设置分频系数 htim2.Init.CounterMode = TIM_COUNTERMODE_UP ; htim2.Init.Period = 65535 ; if(HAL_TIM_Base_Init(&htim2)!= HAL_OK ){ Error_Handler(); } TIM_InputCapture_InitTypeDef sConfigIC; sConfigIC.ICPolarity = TIM_INPUTCAPTURE_RISING;// 上升沿触发 sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if( HAL_TIM_IC_ConfigChannel (&htim2 ,&sConfigIC,TIM_CHANNEL_1 ) != HAL_OK ){ Error_Handler (); } } void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==TIM2){ CaptureValue=__HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_1); } } ``` 上述代码展示了如何初始化 TIM2 并对其进行输入捕获配置,同时设置了上升沿触发条件以及对应的回调函数用于读取捕获的数据。 --- #### 微秒级精确延时解决方案 除了输入捕获外,有时还需要实现更高精度的延迟控制。传统方法可能依赖于 `HAL_Delay(ms)` 提供毫秒单位下的等待效果;然而当面对更短时间段的需求时,则推荐采用如下方式获取当前微秒数值从而构建自己的延迟机制: ```c #define MICROS_PER_TICK 72 /* Assuming system core clock is set to 72MHz */ volatile uint32_t micros_start, elapsed_micros; /* 获取当前微秒数 */ uint32_t getCurrentMicros(){ return ((HAL_GetTick() * 1000) + (__HAL_TIM_GET_COUNTER(&htim2)*MICROS_PER_TICK)); } /* 实现精准微秒级别延迟 */ void delayMicroseconds(uint32_t usDelay){ micros_start=getCurrentMicros(); do{ elapsed_micros=(getCurrentMicros()-micros_start); }while(elapsed_micros<usDelay); } ``` 此段落介绍了另一种基于计数寄存器配合软件循环检测达成亚毫秒范围内的暂停行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值