欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32基本定时器 HAL库

程序员文章站 2022-03-13 17:32:00
...

1.定时器分类

STM32F1系列中,除了互联型的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。

  • 基本定时器是一个16位只能向上计数的定时器,只能定时,没有外部IO。

  • 通用定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部IO。

  • 高级定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8个外部IO。

STM32基本定时器 HAL库

2.基本定时器功能框图

STM32基本定时器 HAL库

  1. 时钟源:定时器时钟TIMxCLK(内部时钟CK_INT),是经APB1预分频器后分频提供,APB1预分频系数为1,则频率不变,否则*2;
  2. 计数器时钟:定时器时钟经过PSC预分频器后,得到CK_CNT用来驱动计数器计数,PSC是一个16位的预分频器,所以CK_CNT=TIMxCLK/(PSC+1);
  3. 计数器:计数器CNT是一个16位的计数器,只能向上计数,最大计数值65535,。CNT计数达到自动重装载寄存器的时候产生更新时间,并清零从头计数;
  4. 自动重装载寄存器(ARR):ARR是一个16位的寄存器,定义着CNT能够计数的最大值

3.定时器初始化结构体

STM32f1系列单片机的HAL库,定义了4个定时器相关的初始化结构体,基本定时器只用到其中的TIM_TimeBaseInitTypeDef

typedef struct {
    uint32_t Prescaler; // 预分频器
    uint32_t CounterMode; // 计数模式
    uint32_t Period; // 定时器周期
    uint32_t ClockDivision; // 时钟分频
    uint32_t RepetitionCounter; // 重复计算器
} TIM_TimeBaseInitTypeDef;
  • Prescaler:设置TIMx_PSC寄存器的值,设置范围0~65535;
  • CounterMode:定时器计数方式,可设置为向上计数、向下计数以及三种中心对其模式。基本定时器只能向上计数,所以该参数无需设置;
  • Period:定时器周期,设置ARR的值;
  • ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率比,基本定时器无此功能;
  • RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,可以控制输出PWM个数;

4.编程要点

  • 宏定义
// 定义定时器预分频,定时器实际时钟频率为:72MHz/(BASIC_TIMx_PRESCALER+1)
#define BASIC_TIMx_PRESCALER           71 
// 定义定时器周期,当定时器开始计数到BASIC_TIMx_PERIOD值是更新定时器并生成对应事件和中断
#define BASIC_TIMx_PERIOD              1000 

#define BASIC_TIMx                     TIM6
#define BASIC_TIM_RCC_CLK_ENABLE()     __HAL_RCC_TIM6_CLK_ENABLE()
#define BASIC_TIM_RCC_CLK_DISABLE()    __HAL_RCC_TIM6_CLK_DISABLE()
#define BASIC_TIM_IRQ                  TIM6_IRQn
#define BASIC_TIM_INT_FUN              TIM6_IRQHandler
  • 基本定时器初始化
void BASIC_TIMx_Init(void)
{
	TIM_MasterConfigTypeDef sMasterConfig;

	htimx.Instance = BASIC_TIMx;
	htimx.Init.Prescaler = BASIC_TIMx_PRESCALER;
	htimx.Init.Period = BASIC_TIMx_PERIOD;
	HAL_TIM_Base_Init(&htimx);

    // 主/从和输出触发选择
	sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
	sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
	HAL_TIMEx_MasterConfigSynchronization(&htimx, &sMasterConfig);
}
  • 优先级配置
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
   /* 基本定时器外设时钟使能 */
    BASIC_TIM_RCC_CLK_ENABLE();

    /* 外设中断配置 */
    HAL_NVIC_SetPriority(BASIC_TIM_IRQ, 1, 0);
    HAL_NVIC_EnableIRQ(BASIC_TIM_IRQ);
 
}
  • 中断服务函数
extern TIM_HandleTypeDef htimx;
/**
* @brief This function handles TIM6 global interrupt.
*/
void BASIC_TIM_INT_FUN(void)
{
  HAL_TIM_IRQHandler(&htimx);
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  time++;
}