1.定时器功能介绍:
在控制领域里面,我们可以用信号输出定时器,进行PWM的控制,从而达到控制电机的目的,通过输入捕获功能可以用来接收外部的数字信号,用于测量脉冲宽度、频率或周期等。在这里给大家介绍下,具体用定时器做计数,输出和捕获的功能实现。
STM32F4一共有三种14个定时器。(12个16位的,2个32位的),STM32F1系列只有8个16位的。
高级定时器:TIM1、TIM8。通常用于特定领域和专业需求用户使用的精密计时工具,通常适用于需要精度更高的领域。通常可以精确到毫秒或更小的时间单位,并具有更复杂的逻辑和算法。
通用定时器:TIM2、TIM5、TIM3、TIM4,TIM9~TIM14。
基本定时器:TIM6、TIM7,没有捕获等通道,用作简单定时。
STM32通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。
2.计数定时器配置
在STM32F429上实现TIM6的计时,可以通过以下步骤进行:
-
使能TIM6时钟。
-
初始化TIM6时基单元,设置时钟分频系数和计数周期。
-
使能更新中断(如果需要)。
-
使能TIM6。
-
等待中断处理(如果使能了中断)。
以下是一个简单的示例代码,展示如何使用HAL库函数来配置TIM6作为一个简单的计时器:
/* 注意:1. 中断相关名称。注意基本定时器TIM6 的中断名为 TIM6_DAC_IRQn,< TIM6 global and DAC1&2 underrun error interrupts>,其他一些定时器为 TIMx_IRQn(x=2,3,4,7 etc) */
/* 中断函数名为 TIM6_DAC_IRQHandler(),而不是 TIM6_IRQHandler() */
/* 3. 基本定时器(TIM6, TIM7),通用定时器,高级定时器(TIM1, TIM8),功能越来越多,此处只做个简单计时,基本定时器足够了 */
#include "timer.h"
uint32_t tim = 0; // 全局变量,每0.1ms加1
TIM_HandleTypeDef TIM6_Handler; //定时器句柄
/* 基本定时器6初始化 */
/* 实现 0.1ms 计时中断 */
/* 90M/90=1M,1M/100 = 10kHz = 0.1ms */
void TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM6_Handler.Instance = TIM6; // 基本定时器
TIM6_Handler.Init.Prescaler = 180-1; // 分频系数 180MHz,得到 180M/180=1M 时钟
TIM6_Handler.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数器
TIM6_Handler.Init.Period = 100-1; // 自动装载值 100,每 100/1M = 100us=0.1ms中断一次
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&TIM6_Handler);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_Base_Start_IT(&TIM6_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE
}
/* 定时器底册驱动,开启时钟,设置中断优先级 */
/* 此函数会被HAL_TIM_Base_Init()函数调用 */
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim-&g